X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fdup2.c;h=ef581a7efd2c8cdad84323b8737a907ea3fccf60;hb=ab43907148e80f3895280928c05d4be93875580f;hp=6b6f45db4d052a7794cba8e246af790955d9475f;hpb=0d9fce2a47c3ff91991d9f93259ccf5877af2ccc;p=gnulib.git diff --git a/lib/dup2.c b/lib/dup2.c index 6b6f45db4..ef581a7ef 100644 --- a/lib/dup2.c +++ b/lib/dup2.c @@ -1,7 +1,6 @@ /* Duplicate an open file descriptor to a specified file descriptor. - Copyright (C) 1999, 2004, 2005, 2006, 2007, 2009 Free Software - Foundation, Inc. + Copyright (C) 1999, 2004-2007, 2009-2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,7 +31,7 @@ # include #endif -#if REPLACE_DUP2 +#if HAVE_DUP2 # undef dup2 @@ -55,15 +54,29 @@ rpl_dup2 (int fd, int desired_fd) } # endif result = dup2 (fd, desired_fd); +# ifdef __linux__ + /* Correct a Linux return value. + + */ + if (fd == desired_fd && result == (unsigned int) -EBADF) + { + errno = EBADF; + result = -1; + } +# endif if (result == 0) result = desired_fd; /* Correct a cygwin 1.5.x errno value. */ else if (result == -1 && errno == EMFILE) errno = EBADF; +# if REPLACE_FCHDIR + if (fd != desired_fd && result != -1) + result = _gl_register_dup (fd, result); +# endif return result; } -#else /* !REPLACE_DUP2 */ +#else /* !HAVE_DUP2 */ /* On older platforms, dup2 did not exist. */ @@ -88,13 +101,21 @@ dupfd (int fd, int desired_fd) int dup2 (int fd, int desired_fd) { - if (fd == desired_fd) - return fd; + int result = fcntl (fd, F_GETFL) < 0 ? -1 : fd; + if (result == -1 || fd == desired_fd) + return result; close (desired_fd); # ifdef F_DUPFD - return fcntl (fd, F_DUPFD, desired_fd); + result = fcntl (fd, F_DUPFD, desired_fd); +# if REPLACE_FCHDIR + if (0 <= result) + result = _gl_register_dup (fd, result); +# endif # else - return dupfd (fd, desired_fd); + result = dupfd (fd, desired_fd); # endif + if (result == -1 && (errno == EMFILE || errno == EINVAL)) + errno = EBADF; + return result; } -#endif /* !REPLACE_DUP2 */ +#endif /* !HAVE_DUP2 */