diff options
Diffstat (limited to 'otherlibs/win32unix/close_on.c')
-rw-r--r-- | otherlibs/win32unix/close_on.c | 102 |
1 files changed, 11 insertions, 91 deletions
diff --git a/otherlibs/win32unix/close_on.c b/otherlibs/win32unix/close_on.c index 179a5ae48..a09399b1e 100644 --- a/otherlibs/win32unix/close_on.c +++ b/otherlibs/win32unix/close_on.c @@ -15,110 +15,30 @@ #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 */ - value fd; -{ - HANDLE h; - - h = (HANDLE) _get_osfhandle(Int_val(fd)) ; - if (h == (HANDLE) -1 || - ! SetHandleInformation(h, HANDLE_FLAG_INHERIT, 0)) { - _dosmaperr(GetLastError()); - uerror("set_close_on_exec", Nothing); - } - return Val_unit; -} - -value win_clear_close_on_exec(fd) /* ML */ - value fd; -{ - HANDLE h; - h = (HANDLE) _get_osfhandle(Int_val(fd)) ; - if (h == (HANDLE) -1 || - ! SetHandleInformation(h, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)) { - _dosmaperr(GetLastError()); - uerror("clear_close_on_exec", Nothing); - } - return Val_unit; -} - -#else - -/* This works on Win 95, but is a terrible hack. - Bug: the opening flags of the file descriptor (O_APPEND, O_TEXT) are lost. */ - -static int win_open_osfhandle2(handle, flags, reqd_fd) - HANDLE handle; - int flags; - int reqd_fd; -{ - int fd, retcode; - HANDLE new_handle; - - fd = _open_osfhandle((long)handle, flags); - if (fd == -1) - return -1; - if (fd == reqd_fd) - return 0; /* Got it! */ - /* Make a copy of the handle, since we're going to close "handle" when - we close "fd". */ - if (! DuplicateHandle(GetCurrentProcess(), handle, - GetCurrentProcess(), &new_handle, - 0L, FALSE, DUPLICATE_SAME_ACCESS)) { - _dosmaperr(GetLastError()); - return -1; - } - /* Keep fd open during the recursive call, thus forcing _open_osfhandle - to return reqd_fd eventually. */ - retcode = win_open_osfhandle2(new_handle, flags, reqd_fd); - close(fd); /* Also closes "handle" */ - return retcode; -} - -static int win_set_noninherit(fd) - int fd; +int win_set_inherit(value fd, BOOL inherit) { HANDLE oldh, newh; - oldh = (HANDLE) _get_osfhandle(fd); - if (oldh == (HANDLE) -1) return -1; + + oldh = Handle_val(fd); if (! DuplicateHandle(GetCurrentProcess(), oldh, GetCurrentProcess(), &newh, - 0L, FALSE, DUPLICATE_SAME_ACCESS)) { + 0L, inherit, DUPLICATE_SAME_ACCESS)) { _dosmaperr(GetLastError()); return -1; } - if (close(fd) == -1) return -1; - return win_open_osfhandle2(newh, 0, fd); + Handle_val(fd) = newh; + CloseHandle(oldh); + return 0; } -value win_set_close_on_exec(vfd) /* ML */ - value vfd; +value win_set_close_on_exec(value fd) /* ML */ { - if (win_set_noninherit(Int_val(vfd)) == -1) - uerror("set_close_on_exec", Nothing); + if (win_set_inherit(fd, FALSE) == -1) uerror("set_close_on_exec", Nothing); return Val_unit; } -value win_clear_close_on_exec(vfd) /* ML */ - value vfd; +value win_clear_close_on_exec(value fd) /* ML */ { - int fd, newfd; - - fd = Int_val(vfd); - newfd = dup(fd); - if (newfd == -1) { - uerror("clear_close_on_exec", Nothing); - } - if (dup2(newfd, fd) == -1) { - close(newfd); - uerror("clear_close_on_exec", Nothing); - } - close(newfd); + if (win_set_inherit(fd, TRUE) == -1) uerror("clear_close_on_exec", Nothing); return Val_unit; } - -#endif |