 06ba9d03e3
			
		
	
	06ba9d03e3
	
	
	
		
			
			Create a test-tool helper to create the server side of a windows named pipe, wait for a client connection, and copy data written to the pipe to stdout. Create t0051 test to route GIT_TRACE output of a command to a named pipe using the above test-tool helper. Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
			
				
	
	
		
			73 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			73 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 (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
 |