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.c102
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