#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
