X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fw32cat.c;h=b9b783ad79bae69aac9b0d063515ff9e8823826a;hb=72c8645af31896829b674b575c5375706f362a30;hp=4c60c49062bd3bc9331f6ba89c8591152401b185;hpb=563e135ff6ae14706e518bae3fb2971c3c60ec17;p=oweals%2Fgnunet.git diff --git a/src/util/w32cat.c b/src/util/w32cat.c index 4c60c4906..b9b783ad7 100644 --- a/src/util/w32cat.c +++ b/src/util/w32cat.c @@ -17,92 +17,134 @@ Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include -#include - -int -main (int argc, char **argv) -{ - HANDLE stdi, stdo; - BOOL b; - wchar_t *commandlinew, **argvw; - int argcw; - int i; - - stdo = GetStdHandle (STD_OUTPUT_HANDLE); - if (stdo == INVALID_HANDLE_VALUE || stdo == NULL) - return 1; - - commandlinew = GetCommandLineW (); - argvw = CommandLineToArgvW (commandlinew, &argcw); - if (argvw == NULL) - return 1; - - for (i = 1; i < argcw || argcw == 1; i++) - { - DWORD r, w; - int is_dash = wcscmp (argvw[i], L"-") == 0; - if (argcw == 1 || is_dash) - { - stdi = GetStdHandle (STD_INPUT_HANDLE); - if (stdi == INVALID_HANDLE_VALUE) - { - fprintf (stderr, "cat: Failed to obtain stdin handle.\n"); - return 4; - } - if (stdi == NULL) - { - fprintf (stderr, "cat: Have no stdin.\n"); - return 5; - } - } - else - { - stdi = CreateFileW (argvw[i], GENERIC_READ, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); - if (stdi == INVALID_HANDLE_VALUE) - { - wchar_t *msgbuf; - DWORD le = GetLastError (); - if (0 < FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, le, 0, (wchar_t *) &msgbuf, 0, NULL)) - { - fprintf (stderr, "cat: Failed to open file `%S'. Error %lu.\n", argvw[i], le); - return 3; - } - fprintf (stderr, "cat: Failed to open file `%S'. Error %lu: %S\n", argvw[i], le, msgbuf); - if (msgbuf != NULL) - LocalFree (msgbuf); - return 2; - } - } - do - { - unsigned char c; - b = ReadFile (stdi, &c, 1, &r, NULL); - if (b && r > 0) - { - b = WriteFile (stdo, &c, 1, &w, NULL); - if (b == 0) - { - wchar_t *msgbuf; - DWORD le = GetLastError (); - if (0 < FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, le, 0, (wchar_t *) &msgbuf, 0, NULL)) - { - fprintf (stderr, "cat: Failed to write into stdout. Error %lu.\n", le); - return 3; - } - fprintf (stderr, "cat: Failed to write into stdout. Error %lu: %S\n", le, msgbuf); - if (msgbuf != NULL) - LocalFree (msgbuf); - return 6; - } - } - } while (b && r > 0); - if (argcw == 1) - break; - if (!is_dash) - CloseHandle (stdi); - } - LocalFree (argvw); - return 0; -} + +#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) +{ + HANDLE stdi, stdo; + BOOL b; + wchar_t *commandlinew, **argvw; + int argcw; + int i; + + stdo = GetStdHandle (STD_OUTPUT_HANDLE); + if (stdo == INVALID_HANDLE_VALUE || stdo == NULL) + return 1; + + commandlinew = GetCommandLineW (); + argvw = CommandLineToArgvW (commandlinew, &argcw); + if (argvw == NULL) + return 1; + + install_parent_control_handler (); + + for (i = 1; i < argcw || argcw == 1; i++) + { + DWORD r, w; + int is_dash = wcscmp (NULL == argvw[i] ? L"-" : argvw[i], L"-") == 0; + if (argcw == 1 || is_dash) + { + stdi = GetStdHandle (STD_INPUT_HANDLE); + if (stdi == INVALID_HANDLE_VALUE) + { + fprintf (stderr, "cat: Failed to obtain stdin handle.\n"); + return 4; + } + if (stdi == NULL) + { + fprintf (stderr, "cat: Have no stdin.\n"); + return 5; + } + } + else + { + stdi = CreateFileW (argvw[i], GENERIC_READ, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); + if (stdi == INVALID_HANDLE_VALUE) + { + wchar_t *msgbuf; + DWORD le = GetLastError (); + if (0 < FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, le, 0, (wchar_t *) &msgbuf, 0, NULL)) + { + fprintf (stderr, "cat: Failed to open file `%S'. Error %lu.\n", argvw[i], le); + return 3; + } + fprintf (stderr, "cat: Failed to open file `%S'. Error %lu: %S\n", argvw[i], le, msgbuf); + if (msgbuf != NULL) + LocalFree (msgbuf); + return 2; + } + } + do + { + unsigned char c; + b = ReadFile (stdi, &c, 1, &r, NULL); + if (b && r > 0) + { + b = WriteFile (stdo, &c, 1, &w, NULL); + if (b == 0) + { + wchar_t *msgbuf; + DWORD le = GetLastError (); + if (0 < FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, le, 0, (wchar_t *) &msgbuf, 0, NULL)) + { + fprintf (stderr, "cat: Failed to write into stdout. Error %lu.\n", le); + return 3; + } + fprintf (stderr, "cat: Failed to write into stdout. Error %lu: %S\n", le, msgbuf); + if (msgbuf != NULL) + LocalFree (msgbuf); + return 6; + } + } + } while (b && r > 0); + if (argcw == 1) + break; + if (!is_dash) + CloseHandle (stdi); + } + LocalFree (argvw); + return 0; +}