summaryrefslogtreecommitdiffstats
path: root/otherlibs/win32unix/close_on.c
diff options
context:
space:
mode:
Diffstat (limited to 'otherlibs/win32unix/close_on.c')
-rw-r--r--otherlibs/win32unix/close_on.c48
1 files changed, 46 insertions, 2 deletions
diff --git a/otherlibs/win32unix/close_on.c b/otherlibs/win32unix/close_on.c
index 70bb9d0e2..ba32350a2 100644
--- a/otherlibs/win32unix/close_on.c
+++ b/otherlibs/win32unix/close_on.c
@@ -15,6 +15,8 @@
#include <windows.h>
#include "unixsupport.h"
+#if 0
+
/* This works only under Windows NT, but not 95 */
value win_set_close_on_exec(fd) /* ML */
@@ -27,7 +29,7 @@ value win_set_close_on_exec(fd) /* ML */
! SetHandleInformation(h, HANDLE_FLAG_INHERIT, 0)) {
_dosmaperr(GetLastError());
uerror("set_close_on_exec", Nothing);
- };
+ }
return Val_unit;
}
@@ -39,8 +41,50 @@ value win_clear_close_on_exec(fd) /* ML */
if (h == (HANDLE) -1 ||
! SetHandleInformation(h, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)) {
_dosmaperr(GetLastError());
+ uerror("clear_close_on_exec", Nothing);
+ }
+ return Val_unit;
+}
+
+#else
+
+extern int _set_osfhnd(int fd, long value);
+
+static int win_realloc_handle(fd, inherit)
+ int fd;
+ BOOL inherit;
+{
+ HANDLE oldh, newh;
+
+ oldh = (HANDLE) _get_osfhandle(fd);
+ if (oldh == (HANDLE) -1) return -1;
+ if (! DuplicateHandle(GetCurrentProcess(), oldh,
+ GetCurrentProcess(), &newh,
+ 0L, inherit, DUPLICATE_SAME_ACCESS)) {
+ _dosmaperr(GetLastError());
+ return -1;
+ }
+ _close(fd);
+ _set_osfhnd(fd, (long) newh);
+ return 0;
+}
+
+value win_set_close_on_exec(fd) /* ML */
+ value fd;
+{
+ if (win_realloc_handle(Int_val(fd), FALSE) == -1) {
uerror("set_close_on_exec", Nothing);
- };
+ }
+ return Val_unit;
+}
+
+value win_clear_close_on_exec(fd) /* ML */
+ value fd;
+{
+ if (win_realloc_handle(Int_val(fd), TRUE) == -1) {
+ uerror("clear_close_on_exec", Nothing);
+ }
return Val_unit;
}
+#endif