You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.6 KiB
72 lines
1.6 KiB
#include "test-tool.h" |
|
#include "git-compat-util.h" |
|
#include "strbuf.h" |
|
|
|
#ifdef GIT_WINDOWS_NATIVE |
|
static const char *usage_string = "<pipe-filename>"; |
|
|
|
#define TEST_BUFSIZE (4096) |
|
|
|
int cmd__windows_named_pipe(int argc, const char **argv) |
|
{ |
|
const char *filename; |
|
struct strbuf pathname = STRBUF_INIT; |
|
int err; |
|
HANDLE h; |
|
BOOL connected; |
|
char buf[TEST_BUFSIZE + 1]; |
|
|
|
if (argc < 2) |
|
goto print_usage; |
|
filename = argv[1]; |
|
if (strchr(filename, '/') || strchr(filename, '\\')) |
|
goto print_usage; |
|
strbuf_addf(&pathname, "//./pipe/%s", filename); |
|
|
|
/* |
|
* Create a single instance of the server side of the named pipe. |
|
* This will allow exactly one client instance to connect to it. |
|
*/ |
|
h = CreateNamedPipeA( |
|
pathname.buf, |
|
PIPE_ACCESS_INBOUND | FILE_FLAG_FIRST_PIPE_INSTANCE, |
|
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, |
|
PIPE_UNLIMITED_INSTANCES, |
|
TEST_BUFSIZE, TEST_BUFSIZE, 0, NULL); |
|
if (h == INVALID_HANDLE_VALUE) { |
|
err = err_win_to_posix(GetLastError()); |
|
fprintf(stderr, "CreateNamedPipe failed: %s\n", |
|
strerror(err)); |
|
return err; |
|
} |
|
|
|
connected = ConnectNamedPipe(h, NULL) |
|
? TRUE |
|
: (GetLastError() == ERROR_PIPE_CONNECTED); |
|
if (!connected) { |
|
err = err_win_to_posix(GetLastError()); |
|
fprintf(stderr, "ConnectNamedPipe failed: %s\n", |
|
strerror(err)); |
|
CloseHandle(h); |
|
return err; |
|
} |
|
|
|
while (1) { |
|
DWORD nbr; |
|
BOOL success = ReadFile(h, buf, TEST_BUFSIZE, &nbr, NULL); |
|
if (!success || nbr == 0) |
|
break; |
|
buf[nbr] = 0; |
|
|
|
write(1, buf, nbr); |
|
} |
|
|
|
DisconnectNamedPipe(h); |
|
CloseHandle(h); |
|
return 0; |
|
|
|
print_usage: |
|
fprintf(stderr, "usage: %s %s\n", argv[0], usage_string); |
|
return 1; |
|
} |
|
#endif
|
|
|