GNUnet  0.10.x
Functions
w32cat.c File Reference
#include <stdio.h>
#include <windows.h>
#include <stdint.h>
#include <signal.h>
Include dependency graph for w32cat.c:

Go to the source code of this file.

Functions

DWORD WINAPI parent_control_thread (LPVOID lpParameter)
 
void install_parent_control_handler ()
 
int main (int argc, char **argv)
 

Function Documentation

◆ parent_control_thread()

DWORD WINAPI parent_control_thread ( LPVOID  lpParameter)

Definition at line 29 of file w32cat.c.

References h.

Referenced by install_parent_control_handler().

30 {
31  HANDLE h = (HANDLE) lpParameter;
32  while (TRUE)
33  {
34  DWORD dw;
35  BOOL b;
36  unsigned char c;
37  b = ReadFile (h, &c, 1, &dw, NULL);
38  if (!b)
39  {
40  ExitProcess (0);
41  }
42  raise ((int) c);
43  }
44 }
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
Here is the caller graph for this function:

◆ install_parent_control_handler()

void install_parent_control_handler ( )

Definition at line 47 of file w32cat.c.

References getenv(), and parent_control_thread().

Referenced by main().

48 {
49  const char *env_buf;
50  char *env_buf_end;
51  uint64_t pipe_fd;
52  HANDLE pipe_handle;
53 
54  env_buf = getenv ("GNUNET_OS_CONTROL_PIPE");
55  if ( (NULL == env_buf) || (strlen (env_buf) <= 0) )
56  return;
57  errno = 0;
58  pipe_fd = strtoull (env_buf, &env_buf_end, 16);
59  if ((0 != errno) || (env_buf == env_buf_end))
60  return;
61  /* Gcc will issue a warning here. What to do with it? */
62  pipe_handle = (HANDLE) (uintptr_t) pipe_fd;
63  CreateThread (NULL, 0, parent_control_thread, (LPVOID) pipe_handle, 0, NULL);
64 }
DWORD WINAPI parent_control_thread(LPVOID lpParameter)
Definition: w32cat.c:29
char * getenv()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 67 of file w32cat.c.

References install_parent_control_handler().

68 {
69  HANDLE stdi, stdo;
70  BOOL b;
71  wchar_t *commandlinew, **argvw;
72  int argcw;
73  int i;
74 
75  stdo = GetStdHandle (STD_OUTPUT_HANDLE);
76  if (stdo == INVALID_HANDLE_VALUE || stdo == NULL)
77  return 1;
78 
79  commandlinew = GetCommandLineW ();
80  argvw = CommandLineToArgvW (commandlinew, &argcw);
81  if (argvw == NULL)
82  return 1;
83 
85 
86  for (i = 1; i < argcw || argcw == 1; i++)
87  {
88  DWORD r, w;
89  int is_dash = wcscmp (NULL == argvw[i] ? L"-" : argvw[i], L"-") == 0;
90  if (argcw == 1 || is_dash)
91  {
92  stdi = GetStdHandle (STD_INPUT_HANDLE);
93  if (stdi == INVALID_HANDLE_VALUE)
94  {
95  fprintf (stderr, "cat: Failed to obtain stdin handle.\n");
96  return 4;
97  }
98  if (stdi == NULL)
99  {
100  fprintf (stderr, "cat: Have no stdin.\n");
101  return 5;
102  }
103  }
104  else
105  {
106  stdi = CreateFileW (argvw[i], GENERIC_READ, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
107  if (stdi == INVALID_HANDLE_VALUE)
108  {
109  wchar_t *msgbuf;
110  DWORD le = GetLastError ();
111  if (0 < FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, le, 0, (wchar_t *) &msgbuf, 0, NULL))
112  {
113  fprintf (stderr, "cat: Failed to open file `%S'. Error %lu.\n", argvw[i], le);
114  return 3;
115  }
116  fprintf (stderr, "cat: Failed to open file `%S'. Error %lu: %S\n", argvw[i], le, msgbuf);
117  if (msgbuf != NULL)
118  LocalFree (msgbuf);
119  return 2;
120  }
121  }
122  do
123  {
124  unsigned char c;
125  b = ReadFile (stdi, &c, 1, &r, NULL);
126  if (b && r > 0)
127  {
128  b = WriteFile (stdo, &c, 1, &w, NULL);
129  if (b == 0)
130  {
131  wchar_t *msgbuf;
132  DWORD le = GetLastError ();
133  if (0 < FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, le, 0, (wchar_t *) &msgbuf, 0, NULL))
134  {
135  fprintf (stderr, "cat: Failed to write into stdout. Error %lu.\n", le);
136  return 3;
137  }
138  fprintf (stderr, "cat: Failed to write into stdout. Error %lu: %S\n", le, msgbuf);
139  if (msgbuf != NULL)
140  LocalFree (msgbuf);
141  return 6;
142  }
143  }
144  } while (b && r > 0);
145  if (argcw == 1)
146  break;
147  if (!is_dash)
148  CloseHandle (stdi);
149  }
150  LocalFree (argvw);
151  return 0;
152 }
void install_parent_control_handler()
Definition: w32cat.c:47
Here is the call graph for this function: