changeset 109314:b7a866c9460c

* callproc.c (relocate_fd): Use F_DUPFD if defined.
author Andreas Schwab <schwab@linux-m68k.org>
date Sun, 11 Jul 2010 11:49:44 +0200
parents e856a274549b
children 8f3464b85afb
files src/ChangeLog src/callproc.c
diffstat 2 files changed, 12 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Sun Jul 11 11:27:13 2010 +0200
+++ b/src/ChangeLog	Sun Jul 11 11:49:44 2010 +0200
@@ -1,5 +1,7 @@
 2010-07-11  Andreas Schwab  <schwab@linux-m68k.org>
 
+	* callproc.c (relocate_fd): Use F_DUPFD if defined.
+
 	* alloc.c (pending_malloc_warning, malloc_warning): Add const.
 	* callproc.c (relocate_fd, getenv_internal_1, getenv_internal)
 	(egetenv): Likewise.
--- a/src/callproc.c	Sun Jul 11 11:27:13 2010 +0200
+++ b/src/callproc.c	Sun Jul 11 11:49:44 2010 +0200
@@ -1288,7 +1288,16 @@
     return fd;
   else
     {
-      int new = dup (fd);
+      int new;
+#ifdef F_DUPFD
+      new = fcntl (fd, F_DUPFD, minfd);
+#else
+      new = dup (fd);
+      if (new != -1)
+	/* Note that we hold the original FD open while we recurse,
+	   to guarantee we'll get a new FD if we need it.  */
+	new = relocate_fd (new, minfd);
+#endif
       if (new == -1)
 	{
 	  const char *message1 = "Error while setting up child: ";
@@ -1299,9 +1308,6 @@
 	  emacs_write (2, message2, strlen (message2));
 	  _exit (1);
 	}
-      /* Note that we hold the original FD open while we recurse,
-	 to guarantee we'll get a new FD if we need it.  */
-      new = relocate_fd (new, minfd);
       emacs_close (fd);
       return new;
     }