runnerw works on windows

This commit is contained in:
Dmitry Jemerov
2010-07-18 13:20:24 +04:00
parent 9cad39d666
commit a9e0b80821
+57 -14
View File
@@ -38,14 +38,15 @@ void CtrlBreak() {
BOOL is_iac = FALSE;
char IAC = 255;
char BRK = 243;
char IAC = 5;
char BRK = 3;
BOOL Scan(char buf[], int count) {
for (int i = 0; i < count; i++) {
if (is_iac) {
if (buf[i] == BRK) {
CtrlBreak();
return TRUE;
} else {
is_iac = FALSE;
}
@@ -73,6 +74,41 @@ BOOL CtrlHandler(DWORD fdwCtrlType) {
}
}
struct StdInThreadParams
{
HANDLE hEvent;
HANDLE write_stdin;
};
DWORD WINAPI StdInThread(void *param)
{
StdInThreadParams *threadParams = (StdInThreadParams *) param;
char buf[1];
memset(buf, 0, sizeof(buf));
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
while(true)
{
DWORD cbRead = 0;
DWORD cbWrite = 0;
char c;
ReadFile(hStdin, &c, 1, &cbRead, NULL);
if (cbRead > 0)
{
buf[0] = c;
bool ctrlBroken = Scan(buf, 1);
WriteFile(threadParams->write_stdin, buf, 1, &cbWrite, NULL);
if (ctrlBroken)
{
SetEvent(threadParams->hEvent);
break;
}
}
}
return 0;
}
int main(int argc, char * argv[]) {
if (argc < 2) {
PrintUsage();
@@ -133,27 +169,34 @@ int main(int argc, char * argv[]) {
unsigned long exit = 0;
unsigned long b_read;
unsigned long b_write;
unsigned long avail;
char buf[1];
memset(buf, 0, sizeof(buf));
HANDLE threadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
for (;;) {
GetExitCodeProcess(pi.hProcess, &exit);
StdInThreadParams params;
params.hEvent = threadEvent;
params.write_stdin = write_stdin;
if (exit != STILL_ACTIVE)
CreateThread(NULL, 0, &StdInThread, &params, 0, NULL);
HANDLE objects_to_wait[2];
objects_to_wait[0] = threadEvent;
objects_to_wait[1] = pi.hProcess;
while(true)
{
int rc = WaitForMultipleObjects(2, objects_to_wait, FALSE, INFINITE);
if (rc == WAIT_OBJECT_0 + 1)
{
break;
char c;
std::cin >> c;
buf[0] = c;
Scan(buf, 1);
WriteFile(write_stdin, buf, 1, &b_write, NULL);
}
}
GetExitCodeProcess(pi.hProcess, &exit);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(newstdin);
CloseHandle(write_stdin);
return exit;
}