diff options
-rw-r--r-- | otherlibs/win32unix/Makefile.nt | 2 | ||||
-rw-r--r-- | otherlibs/win32unix/close_on.c | 48 |
2 files changed, 47 insertions, 3 deletions
diff --git a/otherlibs/win32unix/Makefile.nt b/otherlibs/win32unix/Makefile.nt index 3cb440470..ac07b87d6 100644 --- a/otherlibs/win32unix/Makefile.nt +++ b/otherlibs/win32unix/Makefile.nt @@ -4,7 +4,7 @@ SYSTEM_INCLUDES=\msdev\include CC=$(BYTECC) CFLAGS=-I..\..\byterun -I..\unix $(BYTECCCOMPOPTS) -CAMLC=..\..\boot\ocamlrun ..\..\boot\ocamlc -I ..\..\boot +CAMLC=..\..\boot\ocamlrun ..\..\boot\ocamlc -I ..\..\stdlib CAMLOPT=..\..\boot\ocamlrun ..\..\ocamlopt -I ..\..\stdlib # Files in this directory 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 |