Updated from GMP 1.906.7
[kopensolaris-gnu/glibc.git] / sysdeps / posix / dup2.c
index 56e56c6..c0c6b2a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1993, 1995 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -19,6 +19,7 @@ Cambridge, MA 02139, USA.  */
 #include <ansidecl.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <limits.h>
 #include <unistd.h>
 
 
@@ -27,15 +28,32 @@ Cambridge, MA 02139, USA.  */
 int
 DEFUN(__dup2, (fd, fd2), int fd AND int fd2)
 {
-  if (fd < 0 || fd2 < 0)
+  int save;
+
+  if (fd2 < 0
+#ifdef OPEN_MAX
+      || fd2 >= OPEN_MAX
+#endif
+)
     {
       errno = EBADF;
       return -1;
     }
 
+  /* Check if FD is kosher.  */
+  if (fcntl (fd, F_GETFL) < 0)
+    return -1;
+
   if (fd == fd2)
-    /* No way to check that they are valid.  */
     return fd2;
 
-  return fcntl(fd, F_DUPFD, fd2);
+  /* This is not atomic.  */
+
+  save = errno;
+  (void) close (fd2);
+  errno = save;
+
+  return fcntl (fd, F_DUPFD, fd2);
 }
+
+weak_alias (__dup2, dup2)