GNUnet  0.10.x
w32cat.c
Go to the documentation of this file.
1 /*
2  W32 version of 'cat' program
3  Copyright (C) 2012 LRN
4 
5  cat is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published
7  by the Free Software Foundation; either version 3, or (at your
8  option) any later version.
9 
10  cat is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with cat; see the file COPYING. If not, write to the
17  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  Boston, MA 02110-1301, USA.
19 
20  SPDX-License-Identifier: AGPL3.0-or-later
21  */
22 
23 #include <stdio.h>
24 #include <windows.h>
25 #include <stdint.h>
26 #include <signal.h>
27 
28 DWORD WINAPI
29 parent_control_thread(LPVOID lpParameter)
30 {
31  HANDLE h = (HANDLE)lpParameter;
32 
33  while (TRUE)
34  {
35  DWORD dw;
36  BOOL b;
37  unsigned char c;
38  b = ReadFile(h, &c, 1, &dw, NULL);
39  if (!b)
40  {
41  ExitProcess(0);
42  }
43  raise((int)c);
44  }
45 }
46 
47 void
49 {
50  const char *env_buf;
51  char *env_buf_end;
52  uint64_t pipe_fd;
53  HANDLE pipe_handle;
54 
55  env_buf = getenv("GNUNET_OS_CONTROL_PIPE");
56  if ((NULL == env_buf) || (strlen(env_buf) <= 0))
57  return;
58  errno = 0;
59  pipe_fd = strtoull(env_buf, &env_buf_end, 16);
60  if ((0 != errno) || (env_buf == env_buf_end))
61  return;
62  /* Gcc will issue a warning here. What to do with it? */
63  pipe_handle = (HANDLE)(uintptr_t)pipe_fd;
64  CreateThread(NULL, 0, parent_control_thread, (LPVOID)pipe_handle, 0, NULL);
65 }
66 
67 int
68 main(int argc, char **argv)
69 {
70  HANDLE stdi, stdo;
71  BOOL b;
72  wchar_t *commandlinew, **argvw;
73  int argcw;
74  int i;
75 
76  stdo = GetStdHandle(STD_OUTPUT_HANDLE);
77  if (stdo == INVALID_HANDLE_VALUE || stdo == NULL)
78  return 1;
79 
80  commandlinew = GetCommandLineW();
81  argvw = CommandLineToArgvW(commandlinew, &argcw);
82  if (argvw == NULL)
83  return 1;
84 
86 
87  for (i = 1; i < argcw || argcw == 1; i++)
88  {
89  DWORD r, w;
90  int is_dash = wcscmp(NULL == argvw[i] ? L"-" : argvw[i], L"-") == 0;
91  if (argcw == 1 || is_dash)
92  {
93  stdi = GetStdHandle(STD_INPUT_HANDLE);
94  if (stdi == INVALID_HANDLE_VALUE)
95  {
96  fprintf(stderr, "cat: Failed to obtain stdin handle.\n");
97  return 4;
98  }
99  if (stdi == NULL)
100  {
101  fprintf(stderr, "cat: Have no stdin.\n");
102  return 5;
103  }
104  }
105  else
106  {
107  stdi = CreateFileW(argvw[i], GENERIC_READ, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
108  if (stdi == INVALID_HANDLE_VALUE)
109  {
110  wchar_t *msgbuf;
111  DWORD le = GetLastError();
112  if (0 < FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, le, 0, (wchar_t *)&msgbuf, 0, NULL))
113  {
114  fprintf(stderr, "cat: Failed to open file `%S'. Error %lu.\n", argvw[i], le);
115  return 3;
116  }
117  fprintf(stderr, "cat: Failed to open file `%S'. Error %lu: %S\n", argvw[i], le, msgbuf);
118  if (msgbuf != NULL)
119  LocalFree(msgbuf);
120  return 2;
121  }
122  }
123  do
124  {
125  unsigned char c;
126  b = ReadFile(stdi, &c, 1, &r, NULL);
127  if (b && r > 0)
128  {
129  b = WriteFile(stdo, &c, 1, &w, NULL);
130  if (b == 0)
131  {
132  wchar_t *msgbuf;
133  DWORD le = GetLastError();
134  if (0 < FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, le, 0, (wchar_t *)&msgbuf, 0, NULL))
135  {
136  fprintf(stderr, "cat: Failed to write into stdout. Error %lu.\n", le);
137  return 3;
138  }
139  fprintf(stderr, "cat: Failed to write into stdout. Error %lu: %S\n", le, msgbuf);
140  if (msgbuf != NULL)
141  LocalFree(msgbuf);
142  return 6;
143  }
144  }
145  }
146  while (b && r > 0);
147  if (argcw == 1)
148  break;
149  if (!is_dash)
150  CloseHandle(stdi);
151  }
152  LocalFree(argvw);
153  return 0;
154 }
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
int main(int argc, char **argv)
Definition: w32cat.c:68
void install_parent_control_handler()
Definition: w32cat.c:48
DWORD WINAPI parent_control_thread(LPVOID lpParameter)
Definition: w32cat.c:29
char * getenv()