| #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 (strpbrk(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 |