f4609b896f
This also bumps the stable nixpkgs to 20.09 as of 2020-11-21, because there is some breakage in the git build related to the netrc credentials helper which someone has taken care of in nixpkgs. The stable channel is not used for anything other than git, so this should be fine. Change-Id: I3575a19dab09e1e9556cf8231d717de9890484fb
72 lines
1.6 KiB
C
72 lines
1.6 KiB
C
#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
|