summaryrefslogtreecommitdiff
path: root/lib/cloexec.c
diff options
context:
space:
mode:
authorEric Blake <ebb9@byu.net>2009-12-16 10:07:13 -0700
committerEric Blake <ebb9@byu.net>2009-12-16 19:25:36 -0700
commite4ee142063a2f63f483d32b4ab87387db9130804 (patch)
tree1b10241bfaebf75e29857b8e73ffc910f29808e5 /lib/cloexec.c
parent021c8619190757f535c72ad5cdb1d624e19620d6 (diff)
downloadgnulib-e4ee142063a2f63f483d32b4ab87387db9130804.tar.gz
fcntl: use to simplify other modules
Let fcntl do the work, instead of copying code into other modules. * modules/cloexec (Depends-on): Add fcntl. * modules/fchdir (Depends-on): Likewise. * modules/fd-safer-flag (Depends-on): Likewise. * modules/unistd-safer (Depends-on): Likewise. * modules/dup3 (configure.ac): Set module indicator. * m4/fchdir.m4 (gl_FUNC_FCHDIR): Replace fcntl if fchdir is missing. * lib/fchdir.c (_gl_register_dup): Fix comment. * lib/cloexec.c (dup_cloexec): Simplify, by relying on fcntl. * lib/dup-safer.c (dup_safer): Likewise. * lib/dup-safer-flag.c (dup_safer_flag): Likewise. * lib/dup3.c (dup3): Likewise. * tests/test-fchdir.c (main): Enhance test. Fixes a dup_cloexec bug reported by Ondřej Vašík. Signed-off-by: Eric Blake <ebb9@byu.net>
Diffstat (limited to 'lib/cloexec.c')
-rw-r--r--lib/cloexec.c88
1 files changed, 4 insertions, 84 deletions
diff --git a/lib/cloexec.c b/lib/cloexec.c
index 69b45b4a39..ec3cd4e383 100644
--- a/lib/cloexec.c
+++ b/lib/cloexec.c
@@ -26,14 +26,6 @@
#include <fcntl.h>
#include <unistd.h>
-#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
-/* Native Woe32 API. */
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-# include <io.h>
-#endif
-
-
/* Set the `FD_CLOEXEC' flag of DESC if VALUE is true,
or clear the flag if VALUE is false.
Return 0 on success, or -1 on error with `errno' set.
@@ -47,7 +39,7 @@
int
set_cloexec_flag (int desc, bool value)
{
-#if defined F_GETFD && defined F_SETFD
+#ifdef F_SETFD
int flags = fcntl (desc, F_GETFD, 0);
@@ -62,7 +54,7 @@ set_cloexec_flag (int desc, bool value)
return -1;
-#else
+#else /* !F_SETFD */
/* Use dup2 to reject invalid file descriptors; the cloexec flag
will be unaffected. */
@@ -77,7 +69,7 @@ set_cloexec_flag (int desc, bool value)
/* There is nothing we can do on this kind of platform. Punt. */
return 0;
-#endif
+#endif /* !F_SETFD */
}
@@ -88,77 +80,5 @@ set_cloexec_flag (int desc, bool value)
int
dup_cloexec (int fd)
{
- int nfd;
-
-#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
-
- /* Native Woe32 API. */
- HANDLE curr_process = GetCurrentProcess ();
- HANDLE old_handle = (HANDLE) _get_osfhandle (fd);
- HANDLE new_handle;
- int mode;
-
- if (old_handle == INVALID_HANDLE_VALUE
- || (mode = setmode (fd, O_BINARY)) == -1)
- {
- /* fd is closed, or is open to no handle at all.
- We cannot duplicate fd in this case, because _open_osfhandle
- fails for an INVALID_HANDLE_VALUE argument. */
- errno = EBADF;
- return -1;
- }
- setmode (fd, mode);
-
- if (!DuplicateHandle (curr_process, /* SourceProcessHandle */
- old_handle, /* SourceHandle */
- curr_process, /* TargetProcessHandle */
- (PHANDLE) &new_handle, /* TargetHandle */
- (DWORD) 0, /* DesiredAccess */
- FALSE, /* InheritHandle */
- DUPLICATE_SAME_ACCESS)) /* Options */
- {
- /* TODO: Translate GetLastError () into errno. */
- errno = EMFILE;
- return -1;
- }
-
- nfd = _open_osfhandle ((long) new_handle, mode | O_NOINHERIT);
- if (nfd < 0)
- {
- CloseHandle (new_handle);
- errno = EMFILE;
- return -1;
- }
-
-# if REPLACE_FCHDIR
- if (0 <= nfd)
- nfd = _gl_register_dup (fd, nfd);
-# endif
- return nfd;
-
-#else /* !_WIN32 */
-
- /* Unix API. */
-
-# ifdef F_DUPFD_CLOEXEC
- nfd = fcntl (fd, F_DUPFD_CLOEXEC, 0);
-# if REPLACE_FCHDIR
- if (0 <= nfd)
- nfd = _gl_register_dup (fd, nfd);
-# endif
-
-# else /* !F_DUPFD_CLOEXEC */
- nfd = dup (fd);
- if (0 <= nfd && set_cloexec_flag (nfd, true) < 0)
- {
- int saved_errno = errno;
- close (nfd);
- nfd = -1;
- errno = saved_errno;
- }
-# endif /* !F_DUPFD_CLOEXEC */
-
- return nfd;
-
-#endif /* !_WIN32 */
+ return fcntl (fd, F_DUPFD_CLOEXEC, 0);
}