X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fw32cat.c;h=b9b783ad79bae69aac9b0d063515ff9e8823826a;hb=72c8645af31896829b674b575c5375706f362a30;hp=292bd6d4891f9d752a866e3f35dafa3d65185211;hpb=23bbdf1b43cc34d3d52f6b342a6122198bb3d938;p=oweals%2Fgnunet.git diff --git a/src/util/w32cat.c b/src/util/w32cat.c index 292bd6d48..b9b783ad7 100644 --- a/src/util/w32cat.c +++ b/src/util/w32cat.c @@ -20,6 +20,46 @@ #include #include +#include +#include + +DWORD WINAPI +parent_control_thread (LPVOID lpParameter) +{ + HANDLE h = (HANDLE) lpParameter; + while (TRUE) + { + DWORD dw; + BOOL b; + unsigned char c; + b = ReadFile (h, &c, 1, &dw, NULL); + if (!b) + { + ExitProcess (0); + } + raise ((int) c); + } +} + +void +install_parent_control_handler () +{ + const char *env_buf; + char *env_buf_end; + uint64_t pipe_fd; + HANDLE pipe_handle; + + env_buf = getenv ("GNUNET_OS_CONTROL_PIPE"); + if ( (NULL == env_buf) || (strlen (env_buf) <= 0) ) + return; + errno = 0; + pipe_fd = strtoull (env_buf, &env_buf_end, 16); + if ((0 != errno) || (env_buf == env_buf_end)) + return; + /* Gcc will issue a warning here. What to do with it? */ + pipe_handle = (HANDLE) pipe_fd; + CreateThread (NULL, 0, parent_control_thread, (LPVOID) pipe_handle, 0, NULL); +} int main (int argc, char **argv) @@ -39,10 +79,12 @@ main (int argc, char **argv) if (argvw == NULL) return 1; + install_parent_control_handler (); + for (i = 1; i < argcw || argcw == 1; i++) { DWORD r, w; - int is_dash = wcscmp (argvw[i], L"-") == 0; + int is_dash = wcscmp (NULL == argvw[i] ? L"-" : argvw[i], L"-") == 0; if (argcw == 1 || is_dash) { stdi = GetStdHandle (STD_INPUT_HANDLE);