Author: mturk
Date: Thu Jan  7 09:33:21 2010
New Revision: 896817

URL: http://svn.apache.org/viewvc?rev=896817&view=rev
Log:
Add nullpipe and dup3 to windows port

Modified:
    commons/sandbox/runtime/trunk/src/main/native/include/acr.h
    
commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h
    commons/sandbox/runtime/trunk/src/main/native/os/win32/pipe.c
    commons/sandbox/runtime/trunk/src/main/native/os/win32/posix.c

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr.h
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr.h?rev=896817&r1=896816&r2=896817&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr.h Thu Jan  7 
09:33:21 2010
@@ -177,6 +177,7 @@
 /* Add MSVCRT specific includes
  */
 #include <io.h>
+#include <fcntl.h>
 #include <process.h>    /* getpid() */
 #include <sys/stat.h>
 #else

Modified: 
commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h?rev=896817&r1=896816&r2=896817&view=diff
==============================================================================
--- 
commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h
 (original)
+++ 
commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h
 Thu Jan  7 09:33:21 2010
@@ -262,6 +262,15 @@
 pid_t    getppid(void);
 #endif
 
+HANDLE dup3(HANDLE, HANDLE, int);
+
+/**
+ * Functions from pipe.c
+ */
+int socketpair(SOCKET *, SOCKET *, int);
+int pipepair(HANDLE *, HANDLE *, wchar_t **, int);
+HANDLE nullpipe(int, HANDLE);
+
 /**
  * Wide char envvar functions from env.c
  */

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/pipe.c
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/pipe.c?rev=896817&r1=896816&r2=896817&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/pipe.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/pipe.c Thu Jan  7 
09:33:21 2010
@@ -200,6 +200,36 @@
     return rv;
 }
 
+HANDLE nullpipe(int flags, HANDLE fd)
+{
+    SECURITY_ATTRIBUTES sa;
+    HANDLE nd;
+    DWORD  saved_errno = 0;
+
+    sa.nLength              = sizeof(SECURITY_ATTRIBUTES);
+    sa.bInheritHandle       = TRUE;
+    sa.lpSecurityDescriptor = NULL;
+
+    nd = CreateFileW(L"NUL",
+                     flags,
+                     0,
+                     &sa,
+                     OPEN_EXISTING,
+                     FILE_ATTRIBUTE_NORMAL,
+                     NULL);
+    if (IS_INVALID_HANDLE(nd))
+        return NULL;
+    if (IS_INVALID_HANDLE(fd))
+        return nd;
+    fd = dup3(nd, fd, 0);
+    if (IS_INVALID_HANDLE(fd))
+        saved_errno = GetLastError();
+    CloseHandle(nd);
+    if (saved_errno)
+        SetLastError(saved_errno);
+    return fd;
+}
+
 int pipepair(HANDLE *rd, HANDLE *wr, wchar_t **pname, int flags)
 {
     int rc = 0;
@@ -261,7 +291,6 @@
                            int flags)
 {
     int rc = 0;
-    SECURITY_ATTRIBUTES sa;
     HANDLE   hr   = NULL;
     HANDLE   hw   = NULL;
     wchar_t *name = NULL;

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/posix.c
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/posix.c?rev=896817&r1=896816&r2=896817&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/posix.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/posix.c Thu Jan  7 
09:33:21 2010
@@ -64,3 +64,89 @@
 
     return ppid;
 }
+
+HANDLE dup3(HANDLE oldfd, HANDLE newfd, int flags)
+{
+    int    osfd;
+    int    osdd;
+    DWORD  saved_errno = 0;
+    HANDLE duph = INVALID_HANDLE_VALUE;
+
+    if (IS_INVALID_HANDLE(oldfd) ||
+        IS_INVALID_HANDLE(newfd)) {
+        ACR_SET_OS_ERROR(ACR_EINVAL);
+        return INVALID_HANDLE_VALUE;
+    }
+    if (oldfd == newfd)
+        return newfd;
+
+    if (newfd == GetStdHandle(STD_INPUT_HANDLE)) {
+        fflush(stdin);
+        setvbuf(stdin, NULL, _IONBF, 0);
+        _commit(STDIN_FILENO);
+
+        osfd = _open_osfhandle((INT_PTR)oldfd, _O_RDONLY | _O_BINARY);
+        if (osfd == -1) {
+            return INVALID_HANDLE_VALUE;
+        }
+        osdd = _dup2(osfd, STDIN_FILENO);
+        if (osdd == -1) {
+            return INVALID_HANDLE_VALUE;
+        }
+        _setmode(STDIN_FILENO, _O_BINARY);
+        duph = (HANDLE)_get_osfhandle(STDIN_FILENO);
+        if (IS_VALID_HANDLE(duph) && flags)
+            SetHandleInformation(duph, HANDLE_FLAG_INHERIT, 0);
+        return duph;
+    }
+    else if (newfd == GetStdHandle(STD_OUTPUT_HANDLE)) {
+        fflush(stdout);
+        setvbuf(stdout, NULL, _IONBF, 0);
+        _commit(STDOUT_FILENO);
+
+        osfd = _open_osfhandle((INT_PTR)oldfd, _O_WRONLY | _O_BINARY);
+        if (osfd == -1) {
+            return INVALID_HANDLE_VALUE;
+        }
+        osdd = _dup2(osfd, STDOUT_FILENO);
+        if (osdd == -1) {
+            return INVALID_HANDLE_VALUE;
+        }
+        _setmode(STDOUT_FILENO, _O_BINARY);
+        duph = (HANDLE)_get_osfhandle(STDOUT_FILENO);
+        if (IS_VALID_HANDLE(duph) && flags)
+            SetHandleInformation(duph, HANDLE_FLAG_INHERIT, 0);
+        return duph;
+    }
+    else if (newfd == GetStdHandle(STD_ERROR_HANDLE)) {
+        fflush(stderr);
+        setvbuf(stderr, NULL, _IONBF, 0);
+        _commit(STDERR_FILENO);
+
+        osfd = _open_osfhandle((INT_PTR)oldfd, _O_WRONLY | _O_BINARY);
+        if (osfd == -1) {
+            return INVALID_HANDLE_VALUE;
+        }
+        osdd = _dup2(osfd, STDERR_FILENO);
+        if (osdd == -1) {
+            return INVALID_HANDLE_VALUE;
+        }
+        _setmode(STDOUT_FILENO, _O_BINARY);
+        duph = (HANDLE)_get_osfhandle(STDERR_FILENO);
+        if (IS_VALID_HANDLE(duph) && flags)
+            SetHandleInformation(duph, HANDLE_FLAG_INHERIT, 0);
+        return duph;
+    }
+    if (!DuplicateHandle(GetCurrentProcess(),
+                         oldfd,
+                         GetCurrentProcess(),
+                         &duph,
+                         0,
+                         flags ? FALSE : TRUE,
+                         DUPLICATE_SAME_ACCESS))
+        return INVALID_HANDLE_VALUE;
+
+
+    CloseHandle(newfd);
+    return duph;
+}


Reply via email to