ReactOS 0.4.15-dev-7934-g1dc8d80
piperead.cpp File Reference
#include <errno.h>
#include <windows.h>
#include <stdio.h>
Include dependency graph for piperead.cpp:

Go to the source code of this file.

Macros

#define WIN32_LEAN_AND_MEAN
 
#define PIPEREAD_VERSION   "0.3"
 
#define PIPEREAD_NOPIPE   (-101)
 
#define FILE_FLAG_FIRST_PIPE_INSTANCE   0x00080000
 
#define BUFSIZE   1024
 

Functions

static void print_error (DWORD win32_error)
 
static int pipeServer (char *path)
 
static int pipeClient (char *path)
 
static int fileClient (const char *path)
 
void usage (void)
 
int main (int argc, char **argv)
 

Macro Definition Documentation

◆ BUFSIZE

#define BUFSIZE   1024

Definition at line 24 of file piperead.cpp.

◆ FILE_FLAG_FIRST_PIPE_INSTANCE

#define FILE_FLAG_FIRST_PIPE_INSTANCE   0x00080000

Definition at line 20 of file piperead.cpp.

◆ PIPEREAD_NOPIPE

#define PIPEREAD_NOPIPE   (-101)

Definition at line 16 of file piperead.cpp.

◆ PIPEREAD_VERSION

#define PIPEREAD_VERSION   "0.3"

Definition at line 15 of file piperead.cpp.

◆ WIN32_LEAN_AND_MEAN

#define WIN32_LEAN_AND_MEAN

Definition at line 10 of file piperead.cpp.

Function Documentation

◆ fileClient()

static int fileClient ( const char path)
static

Definition at line 156 of file piperead.cpp.

157{
158 int res = 0;
159 FILE *fin;
160 int c;
161
163 if (!(fin = fopen(path, "r"))) {
164 fprintf(stderr,"Could not fopen %s (%s)\n", path, strerror(errno) );
165 return -1;
166 }
167
168 while ((c = fgetc(fin)) != EOF) {
169 fputc(c, stdout);
170 }
171
172 fclose(fin);
173 return res;
174}
#define NULL
Definition: types.h:112
GLuint res
Definition: glext.h:9613
const GLubyte * c
Definition: glext.h:8905
#define stdout
Definition: stdio.h:99
_Check_return_opt_ _CRTIMP int __cdecl fgetc(_Inout_ FILE *_File)
#define EOF
Definition: stdio.h:24
#define stderr
Definition: stdio.h:100
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
#define _IONBF
Definition: stdio.h:129
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
_Check_return_opt_ _CRTIMP int __cdecl fputc(_In_ int _Ch, _Inout_ FILE *_File)
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
_Check_return_opt_ _CRTIMP int __cdecl setvbuf(_Inout_ FILE *_File, _Inout_updates_opt_z_(_Size) char *_Buf, _In_ int _Mode, _In_ size_t _Size)
#define c
Definition: ke_i.h:80
const char * strerror(int err)
Definition: compat_str.c:23
#define errno
Definition: errno.h:18

Referenced by main().

◆ main()

int main ( int argc  ,
char **  argv 
)

Definition at line 184 of file piperead.cpp.

185{
186 char path[MAX_PATH];
187 const char* pipe_name;
188 const char* clientMode;
189 int res = 0;
190
191 pipe_name = "com_1";
192 clientMode = NULL;
193 switch (argc) {
194 case 3:
195 clientMode = *++argv;
196 if (strcmp(clientMode,"-c") != 0) {
197 fprintf(stderr,"Invalid option: %s\n", clientMode);
198 clientMode = NULL;
199 res = -6;
200 }
201 //fall through
202 case 2:
203 pipe_name = *++argv;
204 if (strcmp(pipe_name,"-h") == 0) {
205 res = -7;
206 }
207 break;
208 default:
209 res = -8;
210 break;
211 }
212 if (res) {
213 usage();
214 return res;
215 }
216
217 if ( pipe_name[0] == '\\' ) {
218 //assume caller specified full path
219 sprintf(path, "%s", pipe_name);
220 } else {
221 sprintf(path, "\\\\.\\pipe\\%s", pipe_name);
222 }
223
224 if ( clientMode ) {
226 if (res == PIPEREAD_NOPIPE) {
227 res = fileClient(pipe_name);
228 }
229 } else {
231 }
232
233 return res;
234}
static int argc
Definition: ServiceArgs.c:12
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#define MAX_PATH
Definition: compat.h:34
#define sprintf(buf, format,...)
Definition: sprintf.c:55
#define argv
Definition: mplay32.c:18
static int fileClient(const char *path)
Definition: piperead.cpp:156
#define PIPEREAD_NOPIPE
Definition: piperead.cpp:16
static int pipeServer(char *path)
Definition: piperead.cpp:31
void usage(void)
Definition: piperead.cpp:176
static int pipeClient(char *path)
Definition: piperead.cpp:77

◆ pipeClient()

static int pipeClient ( char path)
static

Definition at line 77 of file piperead.cpp.

78{
80 TCHAR chBuf[BUFSIZE];
81 BOOL fSuccess = FALSE;
82 DWORD cbRead;
83 DWORD Err;
84 int res = 0;
85
87 while (1) {
88 hPipe = CreateFile(path, // pipe name
90 0, // no sharing
91 NULL, // default security attributes
92 OPEN_EXISTING, // opens existing pipe
93 0, // default attributes
94 NULL); // no template file
95
96 // Break if the pipe handle is valid.
97 if (hPipe != INVALID_HANDLE_VALUE)
98 break;
99
100 // Exit if an error other than ERROR_PIPE_BUSY occurs.
101 Err = GetLastError();
102 if (Err != ERROR_PIPE_BUSY) {
103 if (ERROR_FILE_NOT_FOUND == Err)
104 {
106 return res;
107 }
108 else
109 {
110 fprintf(stderr,"Could not open pipe %s. Error=%lu\n", path, Err );
111 res = -1;
112 }
113 break;
114 }
115
116 // All pipe instances are busy, so wait for 20 seconds.
117 if ( ! WaitNamedPipe(path, 20000)) {
118 fprintf(stderr,"Could not open pipe: 20 second wait timed out.");
119 res = -2;
120 break;
121 }
122 }
123
124 if (!res) do {
125 fSuccess = ReadFile(hPipe, // pipe handle
126 chBuf, // buffer to receive reply
127 BUFSIZE, // size of buffer
128 &cbRead, // number of bytes read
129 NULL); // not overlapped
130
131 if ( ! fSuccess ) {
132 Err = GetLastError();
133 if ( Err == ERROR_MORE_DATA ) {
134 fSuccess = TRUE;
135 } else {
136 fprintf(stderr, "ReadFile: Error %lu \n", Err );
137 res = -9;
138 break;
139 }
140 }
141
142 fwrite(chBuf,1,cbRead,stdout);
143 } while ( fSuccess);
144
145 if ( ! fSuccess) {
146 fprintf(stderr, "ReadFile from pipe failed. Error=%lu\n", GetLastError() );
147 }
148
149 if (hPipe != INVALID_HANDLE_VALUE)
150 CloseHandle(hPipe);
151
152 return res;
153
154}
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define OPEN_EXISTING
Definition: compat.h:775
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define GENERIC_READ
Definition: compat.h:135
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
_Check_return_opt_ _CRTIMP size_t __cdecl fwrite(_In_reads_bytes_(_Size *_Count) const void *_Str, _In_ size_t _Size, _In_ size_t _Count, _Inout_ FILE *_File)
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define BUFSIZE
Definition: piperead.cpp:24
#define WaitNamedPipe
Definition: winbase.h:3921
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define CreateFile
Definition: winbase.h:3749
#define ERROR_PIPE_BUSY
Definition: winerror.h:283
char TCHAR
Definition: xmlstorage.h:189

Referenced by main().

◆ pipeServer()

static int pipeServer ( char path)
static

Definition at line 31 of file piperead.cpp.

32{
34
35 if (hPipe == INVALID_HANDLE_VALUE) {
37 return 1;
38 }
39
40 for(;;) {
41 DWORD read;
43
44 if (!ReadFile(hPipe, buffer, sizeof(buffer), &read, NULL)) {
46
48 Sleep(1000);
49 } else if (error == ERROR_BROKEN_PIPE) {
50 CloseHandle(hPipe);
51
53
54 if (hPipe == INVALID_HANDLE_VALUE) {
55 fprintf(stderr,"INVALID_HANDLE_VALUE\n");
57 return 1;
58 }
59 } else {
60 fprintf(stderr,"error %lu\n",error);
62 break;
63 }
64 }
65
66 if (read)
68 }
69
70 if (!CloseHandle(hPipe))
72
73 return 0;
74}
#define read
Definition: acwin.h:96
GLuint buffer
Definition: glext.h:5915
#define error(str)
Definition: mkdosfs.c:1605
#define FILE_FLAG_FIRST_PIPE_INSTANCE
Definition: piperead.cpp:20
static void print_error(DWORD win32_error)
Definition: piperead.cpp:26
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
#define CreateNamedPipe
Definition: winbase.h:3757
#define PIPE_ACCESS_DUPLEX
Definition: winbase.h:164
#define PIPE_WAIT
Definition: winbase.h:171
#define PIPE_TYPE_BYTE
Definition: winbase.h:167
#define ERROR_BROKEN_PIPE
Definition: winerror.h:183
#define ERROR_PIPE_LISTENING
Definition: winerror.h:353
unsigned char BYTE
Definition: xxhash.c:193

Referenced by main().

◆ print_error()

static void print_error ( DWORD  win32_error)
static

Definition at line 26 of file piperead.cpp.

27{
28 fprintf(stderr, "WIN32 error %lu\n", win32_error);
29}

Referenced by pipeServer().

◆ usage()

void usage ( void  )

Definition at line 176 of file piperead.cpp.

177{
178 fprintf(stderr, "piperead " PIPEREAD_VERSION "\n\n");
179 fprintf(stderr, "Usage: piperead [-c] <named pipe>\n");
180 fprintf(stderr, "-c means Client mode\n");
181 fprintf(stderr, "Example: piperead -c \\\\.\\pipe\\kdbg | log2lines -c\n\n");
182}
#define PIPEREAD_VERSION
Definition: piperead.cpp:15

Referenced by main().