-struct input_data {
- DWORD len;
- char buffer[4096];
- HANDLE event, eventback;
-};
-
-static DWORD WINAPI stdin_read_thread(void *param)
-{
- struct input_data *idata = (struct input_data *) param;
- HANDLE inhandle;
-
- inhandle = GetStdHandle(STD_INPUT_HANDLE);
-
- while (ReadFile(inhandle, idata->buffer, sizeof(idata->buffer),
- &idata->len, NULL) && idata->len > 0) {
- SetEvent(idata->event);
- WaitForSingleObject(idata->eventback, INFINITE);
- }
-
- idata->len = 0;
- SetEvent(idata->event);
-
- return 0;
-}
-
-struct output_data {
- DWORD len, lenwritten;
- int writeret;
- char *buffer;
- int is_stderr, done;
- HANDLE event, eventback;
- int busy;
-};
-
-static DWORD WINAPI stdout_write_thread(void *param)
-{
- struct output_data *odata = (struct output_data *) param;
- HANDLE outhandle, errhandle;
-
- outhandle = GetStdHandle(STD_OUTPUT_HANDLE);
- errhandle = GetStdHandle(STD_ERROR_HANDLE);
-
- while (1) {
- WaitForSingleObject(odata->eventback, INFINITE);
- if (odata->done)
- break;
- odata->writeret =
- WriteFile(odata->is_stderr ? errhandle : outhandle,
- odata->buffer, odata->len, &odata->lenwritten, NULL);
- SetEvent(odata->event);
- }
-
- return 0;
-}
-
-bufchain stdout_data, stderr_data;
-struct output_data odata, edata;
-
-void try_output(int is_stderr)
-{
- struct output_data *data = (is_stderr ? &edata : &odata);
- void *senddata;
- int sendlen;
-
- if (!data->busy) {
- bufchain_prefix(is_stderr ? &stderr_data : &stdout_data,
- &senddata, &sendlen);
- data->buffer = senddata;
- data->len = sendlen;
- SetEvent(data->eventback);
- data->busy = 1;
- }
-}
-