summaryrefslogtreecommitdiff
path: root/compat
diff options
context:
space:
mode:
Diffstat (limited to 'compat')
-rw-r--r--compat/mingw.c45
-rw-r--r--compat/mingw.h5
2 files changed, 46 insertions, 4 deletions
diff --git a/compat/mingw.c b/compat/mingw.c
index 89b29c55e5..31a9b9e251 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -54,6 +54,51 @@ int gettimeofday(struct timeval *tv, void *tz)
return 0;
}
+int pipe(int filedes[2])
+{
+ int fd;
+ HANDLE h[2], parent;
+
+ if (_pipe(filedes, 8192, 0) < 0)
+ return -1;
+
+ 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]);
+ return -1;
+ }
+ fd = _open_osfhandle((int)h[0], O_NOINHERIT);
+ if (fd < 0) {
+ close(filedes[0]);
+ close(filedes[1]);
+ 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) {
+ close(filedes[0]);
+ close(filedes[1]);
+ CloseHandle(h[1]);
+ return -1;
+ }
+ close(filedes[1]);
+ filedes[1] = fd;
+ return 0;
+}
+
int poll(struct pollfd *ufds, unsigned int nfds, int timeout)
{
return -1;
diff --git a/compat/mingw.h b/compat/mingw.h
index 3ddef11eda..0ce9c96f93 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -122,14 +122,11 @@ static inline int waitpid(pid_t pid, unsigned *status, unsigned options)
return -1;
}
-
-static inline int pipe(int filedes[2])
-{ return _pipe(filedes, 8192, 0); }
-
/*
* implementations of missing functions
*/
+int pipe(int filedes[2]);
unsigned int sleep (unsigned int seconds);
int mkstemp(char *template);
int gettimeofday(struct timeval *tv, void *tz);