diff options
author | Johannes Sixt <j6t@kdbg.org> | 2010-01-15 21:12:17 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-01-16 16:43:52 -0800 |
commit | 3e34d6657733430164ef67ab2f000fa3d10d51b5 (patch) | |
tree | 7ec4b39a6ae1ca029de3e3af69008f8c2bc05b56 /compat/mingw.c | |
parent | 928500e00e0a73a11f5b2296d9baa82dafa7a1a8 (diff) | |
download | git-3e34d6657733430164ef67ab2f000fa3d10d51b5.tar.gz git-3e34d6657733430164ef67ab2f000fa3d10d51b5.tar.xz |
Windows: simplify the pipe(2) implementation
Our implementation of pipe() must create non-inheritable handles for the
reason that when a child process is started, there is no opportunity to
close the unneeded pipe ends in the child (on POSIX this is done between
fork() and exec()).
Previously, we used the _pipe() function provided by Microsoft's C runtime
(which creates inheritable handles) and then turned the handles into
non-inheritable handles using the DuplicateHandle() API.
Simplify the procedure by using the CreatePipe() API, which can create
non-inheritable handles right from the beginning.
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'compat/mingw.c')
-rw-r--r-- | compat/mingw.c | 37 |
1 files changed, 8 insertions, 29 deletions
diff --git a/compat/mingw.c b/compat/mingw.c index 2afc978df..162d1ff28 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -299,46 +299,25 @@ int gettimeofday(struct timeval *tv, void *tz) int pipe(int filedes[2]) { - int fd; - HANDLE h[2], parent; - - if (_pipe(filedes, 8192, 0) < 0) - return -1; + HANDLE h[2]; - parent = GetCurrentProcess(); - - if (!DuplicateHandle (parent, (HANDLE)_get_osfhandle(filedes[0]), - parent, &h[0], 0, FALSE, DUPLICATE_SAME_ACCESS)) { - close(filedes[0]); - close(filedes[1]); - return -1; - } - if (!DuplicateHandle (parent, (HANDLE)_get_osfhandle(filedes[1]), - parent, &h[1], 0, FALSE, DUPLICATE_SAME_ACCESS)) { - close(filedes[0]); - close(filedes[1]); - CloseHandle(h[0]); + /* this creates non-inheritable handles */ + if (!CreatePipe(&h[0], &h[1], NULL, 8192)) { + errno = err_win_to_posix(GetLastError()); return -1; } - fd = _open_osfhandle((int)h[0], O_NOINHERIT); - if (fd < 0) { - close(filedes[0]); - close(filedes[1]); + filedes[0] = _open_osfhandle((int)h[0], O_NOINHERIT); + if (filedes[0] < 0) { CloseHandle(h[0]); CloseHandle(h[1]); return -1; } - close(filedes[0]); - filedes[0] = fd; - fd = _open_osfhandle((int)h[1], O_NOINHERIT); - if (fd < 0) { + filedes[1] = _open_osfhandle((int)h[1], O_NOINHERIT); + if (filedes[0] < 0) { close(filedes[0]); - close(filedes[1]); CloseHandle(h[1]); return -1; } - close(filedes[1]); - filedes[1] = fd; return 0; } |