Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235//// piperead.cpp//// Martin Fuchs, 30.11.2003//// Jan Roeloffzen, 26.1.2010// Pipe client, based on msdn example
#define WIN32_LEAN_AND_MEAN#include <errno.h>#include <windows.h>#include <stdio.h>
#define PIPEREAD_VERSION "0.3"#define PIPEREAD_NOPIPE (-101)
// This definition currently missing in MinGW.#ifndef FILE_FLAG_FIRST_PIPE_INSTANCE#define FILE_FLAG_FIRST_PIPE_INSTANCE 0x00080000#endif
#define BUFSIZE 1024
static void print_error(DWORD win32_error){ fprintf(stderr, "WIN32 error %lu\n", win32_error);}
static int pipeServer(char *path){ HANDLE hPipe = CreateNamedPipe(path, PIPE_ACCESS_DUPLEX|FILE_FLAG_FIRST_PIPE_INSTANCE, PIPE_WAIT|PIPE_TYPE_BYTE, 1, 4096, 4096, 30000, NULL);
if (hPipe == INVALID_HANDLE_VALUE) { print_error(GetLastError()); return 1; }
for(;;) { DWORD read; BYTE buffer[BUFSIZE];
if (!ReadFile(hPipe, buffer, sizeof(buffer), &read, NULL)) { DWORD error = GetLastError();
if (error == ERROR_PIPE_LISTENING) { Sleep(1000); } else if (error == ERROR_BROKEN_PIPE) { CloseHandle(hPipe);
hPipe = CreateNamedPipe(path, PIPE_ACCESS_DUPLEX|FILE_FLAG_FIRST_PIPE_INSTANCE, PIPE_WAIT|PIPE_TYPE_BYTE, 1, 4096, 4096, 30000, NULL);
if (hPipe == INVALID_HANDLE_VALUE) { fprintf(stderr,"INVALID_HANDLE_VALUE\n"); print_error(GetLastError()); return 1; } } else { fprintf(stderr,"error %lu\n",error); print_error(error); break; } }
if (read) fwrite(buffer, read, 1, stdout); }
if (!CloseHandle(hPipe)) print_error(GetLastError());
return 0;}
static int pipeClient(char *path){ HANDLE hPipe=INVALID_HANDLE_VALUE; TCHAR chBuf[BUFSIZE]; BOOL fSuccess = FALSE; DWORD cbRead; DWORD Err; int res = 0;
setvbuf(stdout, NULL, _IONBF, 0); while (1) { hPipe = CreateFile(path, // pipe name GENERIC_READ, 0, // no sharing NULL, // default security attributes OPEN_EXISTING, // opens existing pipe 0, // default attributes NULL); // no template file
// Break if the pipe handle is valid. if (hPipe != INVALID_HANDLE_VALUE) break;
// Exit if an error other than ERROR_PIPE_BUSY occurs. Err = GetLastError(); if (Err != ERROR_PIPE_BUSY) { if (ERROR_FILE_NOT_FOUND == Err) { res = PIPEREAD_NOPIPE; return res; } else { fprintf(stderr,"Could not open pipe %s. Error=%lu\n", path, Err ); res = -1; } break; }
// All pipe instances are busy, so wait for 20 seconds. if ( ! WaitNamedPipe(path, 20000)) { fprintf(stderr,"Could not open pipe: 20 second wait timed out."); res = -2; break; } }
if (!res) do { fSuccess = ReadFile(hPipe, // pipe handle chBuf, // buffer to receive reply BUFSIZE, // size of buffer &cbRead, // number of bytes read NULL); // not overlapped
if ( ! fSuccess ) { Err = GetLastError(); if ( Err == ERROR_MORE_DATA ) { fSuccess = TRUE; } else { fprintf(stderr, "ReadFile: Error %lu \n", Err ); res = -9; break; } }
fwrite(chBuf,1,cbRead,stdout); } while ( fSuccess);
if ( ! fSuccess) { fprintf(stderr, "ReadFile from pipe failed. Error=%lu\n", GetLastError() ); }
if (hPipe != INVALID_HANDLE_VALUE) CloseHandle(hPipe);
return res;
}
static int fileClient(const char *path){ int res = 0; FILE *fin; int c;
setvbuf(stdout, NULL, _IONBF, 0); if (!(fin = fopen(path, "r"))) { fprintf(stderr,"Could not fopen %s (%s)\n", path, strerror(errno) ); return -1; }
while ((c = fgetc(fin)) != EOF) { fputc(c, stdout); }
fclose(fin); return res;}
void usage(void){ fprintf(stderr, "piperead " PIPEREAD_VERSION "\n\n"); fprintf(stderr, "Usage: piperead [-c] <named pipe>\n"); fprintf(stderr, "-c means Client mode\n"); fprintf(stderr, "Example: piperead -c \\\\.\\pipe\\kdbg | log2lines -c\n\n");}
int main(int argc, char** argv){ char path[MAX_PATH]; const char* pipe_name; const char* clientMode; int res = 0;
pipe_name = "com_1"; clientMode = NULL; switch (argc) { case 3: clientMode = *++argv; if (strcmp(clientMode,"-c") != 0) { fprintf(stderr,"Invalid option: %s\n", clientMode); clientMode = NULL; res = -6; } //fall through case 2: pipe_name = *++argv; if (strcmp(pipe_name,"-h") == 0) { res = -7; } break; default: res = -8; break; } if (res) { usage(); return res; }
if ( pipe_name[0] == '\\' ) { //assume caller specified full path sprintf(path, "%s", pipe_name); } else { sprintf(path, "\\\\.\\pipe\\%s", pipe_name); }
if ( clientMode ) { res = pipeClient(path); if (res == PIPEREAD_NOPIPE) { res = fileClient(pipe_name); } } else { res = pipeServer(path); }
return res;}