Commit Graph

154 Commits

Author SHA1 Message Date
Ryan Prichard
0427aedadd Remove unused console font code from Win32Console::setSmallFont. 2012-03-28 01:09:52 -07:00
Ryan Prichard
dbc2d51fec Select a small console font on agent startup.
This maximizes the possible console size in terms of rows * cols.
2012-03-28 01:05:26 -07:00
Ryan Prichard
6585b72375 Use STD_{INPUT,OUTPUT}_HANDLE instead of reopening CONIN$ and CONOUT$.
Reopening the files is unnecessary.
2012-03-28 01:05:14 -07:00
Ryan Prichard
67ee37396d Add a readme. 2012-03-25 19:30:47 -07:00
Ryan Prichard
46701caf39 Mark configure as executable and exit if uname -s isn't recognized. 2012-03-25 19:24:39 -07:00
Ryan Prichard
82cfc70d98 Create a configure script.
* Move the Cygwin/MSYS detection logic from config-*.mk into this new
   script.

 * Recognize either the 32-bit MinGW or the 32-bit MinGW-w64 compiler
   driver for Cygwin.
2012-03-25 15:55:03 -07:00
Ryan Prichard
71aa4a59bb Rename pconsole to winpty.
* This avoids a name conflict with an existing unrelated project.

 * I think winpty is a better name anyway.  (i) It's more obviously
   Windows-related.  (ii) I think it more accurately describes what it
   does.  A "pseudo-console" ought to mirror the console API and allow
   replacing the implementation built-in to Windows.  This project is only
   trying to provide functionality similar to using the master interface of
   a Unix pty, but for native console programs.
2012-03-25 02:29:37 -07:00
Ryan Prichard
f1842c63a1 Remove old Qt files. 2012-03-24 18:02:28 -07:00
Ryan Prichard
43fac6819b Remove the obsolete TestNet client/server code.
It won't work anymore because the agent's interface has changed.
2012-03-24 17:55:39 -07:00
Ryan Prichard
e1c4763cc4 Get the UNIX adapter working with MSYS.
* Work around UNICODE deficiencies:
    - MSYS does not have wstring.
    - mbstowcs(NULL, text, 0) returns 0 on MSYS instead of returning the
      length of the converted string.
    - printf("%ls") does not work on MSYS.
2012-03-24 17:53:43 -07:00
Ryan Prichard
35754bab98 In the UNIX adapter, remove the UNIX->Win32 environment conversion.
It doesn't work because it leaves in the Cygwin-style paths in variables
like PATH and TMP.

(Also, it doesn't build with MSYS because MSYS's old G++ toolchain lacks
std::wstring.)
2012-03-24 17:23:18 -07:00
Ryan Prichard
9ed1b5b286 Print usage in the UNIX adapter. 2012-03-24 17:20:08 -07:00
Ryan Prichard
5010f5e1a6 Print an error message when CreateProcess fails.
I suspect that the library API (pconsole_open) should not be calling exit
if it can't start the agent process, but I don't want to deal with that
right now.
2012-03-24 17:19:55 -07:00
Ryan Prichard
22f96abc03 Add comments to the pconsole.h header file. 2012-03-24 17:17:23 -07:00
Ryan Prichard
5c185c1617 In the UNIX adapter, start the child process specified on the command line.
* Also propagate the UNIX environment to Win32.  This code doesn't really
   work because variables like PATH need path-translation, but I'd like to
   save a record of it before killing it off.
2012-03-24 16:48:41 -07:00
Ryan Prichard
32627354df Work on the agent debugging code.
* Suppress debug output unless the PCONSOLEDBG enviroment variable is
   set.

 * Rename Trace to trace to be consistent with the camelCaps naming
   convention.
2012-03-24 16:43:50 -07:00
Ryan Prichard
f75800fae6 Replace assert with ASSERT. 2012-03-24 16:41:15 -07:00
Ryan Prichard
724650ac71 Add more copyright notices. 2012-03-24 16:40:18 -07:00
Ryan Prichard
0662815a3e Replace build/.placeholder with build/.gitkeep.
Apparently the convention is to name the empty directory placerholder file
.gitkeep.
2012-03-23 03:48:40 -07:00
Ryan Prichard
44554d5e9d Add an MIT copyright notice to all the source files. 2012-03-23 03:11:34 -07:00
Ryan Prichard
d3667e38a8 Review the named pipe setup code.
The goal is to setup pipes between the libpconsole process and the new
agent process in a way that's secure and doesn't create an unnecessary
burden on the library's user.  This is apparently hard.

I think this code is good enough.
2012-03-23 02:19:09 -07:00
Ryan Prichard
d568fbdeb4 Add DsrSender.h. 2012-03-21 03:31:34 -07:00
Ryan Prichard
d418679741 Include stdint.h to provide int32_t.
* This fixed a libpconsole build error that happened with mingw-w64.
2012-03-21 03:30:18 -07:00
Ryan Prichard
f66e877cba Improve error handling in libpconsole.
If we couldn't create the new pipes, then perhaps some other process has
already created them.  I think it's a security hole to start the agent if
the pipe creation failed.
2012-03-21 03:28:31 -07:00
Ryan Prichard
7e6f8195ba Turn on -Wall and fix build warnings. No bug fixes. 2012-03-21 00:14:04 -07:00
Ryan Prichard
0afc69c733 Move the three output binaries into a build directory. 2012-03-21 00:13:46 -07:00
Ryan Prichard
4cfb5e1c73 Expand a comment. 2012-03-20 23:46:12 -07:00
Ryan Prichard
f397150b6c Add some TODO items. 2012-03-20 23:45:59 -07:00
Ryan Prichard
0260b423a3 Continue working on console input.
* Remove most of the encoding table and instead generate the KeyDescriptor
   entries dynamically at startup.

 * I think I'm handling input tolerably well for TERM=xterm terminals, but
   I removed the support I had for rxvt for now.  I don't think it makes
   sense to fill out the table, but the new code I have for TERM=xterm is
   also bloated.
2012-03-20 04:15:25 -07:00
Ryan Prichard
1fdda9e1d4 Work on console input handling.
* If bytes are still queued after processing as many keypresses as
   possible, send a DSR to the console.  The console should respond with
   a DSR reply, which will flush out the input buffer without having to
   wait for a timeout.

 * Add ah hoc code for ALT-<character> rather than listing every character
   in the table.

 * When keypresses have Alt/Ctrl/Shift modifiers, generate extra
   INPUT_RECORDS to press and release each modifier.  EDIT.COM seemed to
   require these for some Ctrl-<key> keypresses I tried.
2012-03-20 02:04:46 -07:00
Ryan Prichard
d32e36032d Fix an bug in ConsoleInput::appendChar: set dwControlKeyState. 2012-03-19 22:14:34 -07:00
Ryan Prichard
98970ead5c Use ESC and CSI macros in ConsoleInput::keyDescriptorTable. 2012-03-19 22:14:06 -07:00
Ryan Prichard
ac76cbcc20 Initial checkin of improved console input handling.
* Generate Ctrl-C events by calling GenerateConsoleCtrlEvent.

   I noticed that calls to this routine don't behave exactly the same as
   a real Ctrl-C keypress.  In Python, pressing Ctrl-C immediately
   displays a new "KeyboardInterrupt" line.  Calling
   GenerateConsoleCtrlEvent has no immediate effect, but after pressing
   Enter, Python displays a stack trace where a KeyboardInterrupt was
   raised.  After some testing, I suspect the issue is that a real Ctrl-C
   keypress interrupts a blocking console read, but
   GenerateConsoleCtrlEvent does not.

   I also tried synthesizing Ctrl-C using (a) PostMessage with
   WM_{CHAR,KEYDOWN}, and (b) SendInput.  I couldn't get either to work.

 * Recognize ESC sequences.  The set of recognized sequences is ad hoc.

 * Recognize UTF-8-encoded characters and convert them to UTF-16.

 * The code currently uses a timeout to differentiate between pressing ESC
   and pressing a key that generates an ESC sequence.  I have a theory that
   I can use the "Device Status Report" ESC sequences to avoid this
   timeout.
2012-03-19 21:30:16 -07:00
Ryan Prichard
0554f9fbde In Agent::handleStartProcessPacket, call GetLastError immediately after
CreateProcess.
2012-03-19 21:17:43 -07:00
Ryan Prichard
7dbe7537c3 Display Ctrl-C events in the ShowConsoleInput test program.
Now that Ctrl-C doesn't exit ShowConsoleInput, make the program exit when
the user hits ESC three times (3 up and 3 down for a total of 6 events).
2012-03-19 21:13:10 -07:00
Ryan Prichard
6b87c54d0d Try to improve the way color works in the agent.
* Assume that either:
    - The console has a white-on-black color scheme.  This could be set
      at agent startup.
    - The remote terminal also has a white-on-black color scheme, OR...
    - With a different color scheme, the white/black colors could be
      reversed, but the console is still usable.

 * The COMMON_LVB_REVERSE_VIDEO flag apparently has no effect in a Windows
   console, so ignore it in the agent too.

 * Start handling Unicode characters.  I noticed that box drawing
   characters (mc.exe / edit.com) are displayed correctly now.  I'm calling
   WideCharToMultiByte once per character, though, and I'm wondering if
   this is inefficient.
2012-03-15 04:08:58 -07:00
Ryan Prichard
affceb9ffd Fix a bug involving the Terminal::finishOutput call.
Before the Qt removal, Terminal::finishOutput accepted a QPoint object with
a 32-bit line number.  Changing it to accept Coord introduced a bug because
the Coord line number is only 16-bits.  The moveTerminalToLine and sendLine
methods still accepted a 32-bit line number, though.

The result was, after 32768 lines of output, the
Terminal::moveTerminalToLine function would be called alternately with
truncated and untruncated line numbers (e.g. -32000 and 33536), and the
function would generate massive amounts of "cursor up" and "newline"
output.
2012-03-15 02:11:03 -07:00
Ryan Prichard
81dcc5efe7 Fix SmallRect::intersected.
* Win32Console::reposition's resize/move API calls were failing because of
   this bug.
2012-03-15 02:01:41 -07:00
Ryan Prichard
a4f26594f0 Various changes intended to help with debugging.
* Replace Buffer::isEof with Buffer::eof so I can use the agent-specific
   ASSERT macro instead of the standard assert().

 * If an API call in Win32Console fails, print a message using Trace.

 * Add Coord::toString and SmallRect::toString functions.
2012-03-15 01:59:12 -07:00
Ryan Prichard
76f25ae5dd Checkpoint work on the EventLoop and NamedPipe classes.
* Make the agent work correctly when the child process exits.
2012-03-14 02:37:18 -07:00
Ryan Prichard
3dcda5d15d Remove these two unused C++ files. 2012-03-13 22:39:27 -07:00
Ryan Prichard
119c5e0117 Finish removing the Qt dependency. 2012-03-13 22:39:14 -07:00
Ryan Prichard
00eee82468 Add TODO comments. 2012-03-13 22:15:02 -07:00
Ryan Prichard
c949e03164 Checkpoint work to replace the Qt event loop and I/O code. 2012-03-13 22:14:39 -07:00
Ryan Prichard
39e07ca4d2 Fix a typo. 2012-03-13 22:03:48 -07:00
Ryan Prichard
d8b8403651 Begin removing the Qt dependency.
* Replace QPoint and QSize with Coord, a C++ class derived from COORD.

 * Replace QRect with SmallRect, a C++ class derived from SMALL_RECT.

 * Turn Win32Console into a non-QObject class.
2012-03-13 00:16:51 -07:00
Ryan Prichard
1901ed62d6 Add some TODO comments. 2012-02-20 04:54:18 -08:00
Ryan Prichard
8a89620cc3 Use -MMD instead of -MD. It keeps the dependency files smaller. 2012-02-20 03:36:36 -08:00
Ryan Prichard
e7c5342479 Make the unix-adapter work on MSYS.
- In my MSYS environment, gcc/g++ are the MinGW compilers that target
   Win32.  We really need compilers that target the MSYS environment.
   Add a config-unix.mk for building the unix-adapter.

 - My MSYS environment lacks a pipe2 function, but I can get the same
   effect using pipe and fcntl, so do that instead.
2012-02-20 03:34:14 -08:00
Ryan Prichard
00a6c3b90e Shut down the unix-adapter when the child process exits.
- In the agent, poll for the process exit at the same time we pull for
   output.  Once the child exits, record the exit code and close the data
   pipe.

 - In the unix-adapter, shut the program down once the input or output
   handlers abort.  Before exiting, query the agent for the exit code.

 - Also: in the unix-adapter, apparently receiving the SIGWINCH signal can
   interrupt both select and the InputHandler's read system call.  I hope
   it doesn't affect the blocking Win32 APIs, but I'm not really sure.
2012-02-20 03:30:43 -08:00