]> git.eshelyaron.com Git - emacs.git/commitdiff
Port redirect-debugging-output to MS-Windows
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 4 Apr 2016 16:42:58 +0000 (09:42 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 4 Apr 2016 16:44:19 +0000 (09:44 -0700)
Suggested by Eli Zaretskii in:
http://lists.gnu.org/archive/html/emacs-devel/2016-04/msg00037.html
* src/print.c [WINDOWSNT]: Include sys/socket.h.
* src/w32.c (sys_dup2): Work around problem with MS-Windows _dup2.

src/print.c
src/w32.c

index db2918ff4786fd2357ca768d3cefef09c16123d3..83edbb6bfa4688b210e3ce9f24a1bf84454ae03d 100644 (file)
@@ -38,6 +38,10 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include <float.h>
 #include <ftoastr.h>
 
+#ifdef WINDOWSNT
+# include <sys/socket.h> /* for F_DUPFD_CLOEXEC */
+#endif
+
 struct terminal;
 
 /* Avoid actual stack overflow in print.  */
index 3f4ac88520e98ff72e490d1dfc9b0ea91b1beda6..94aa7d891d5d3fd5fd8a2ae50cabc0640f47358b 100644 (file)
--- a/src/w32.c
+++ b/src/w32.c
@@ -8181,17 +8181,33 @@ sys_dup2 (int src, int dst)
       return -1;
     }
 
-  /* make sure we close the destination first if it's a pipe or socket */
-  if (src != dst && fd_info[dst].flags != 0)
+  /* MS _dup2 seems to have weird side effect when invoked with 2
+     identical arguments: an attempt to fclose the corresponding stdio
+     stream after that hangs (we do close standard streams in
+     init_ntproc).  Attempt to avoid that by not calling _dup2 that
+     way: if SRC is valid, we know that dup2 should be a no-op, so do
+     nothing and return DST.  */
+  if (src == dst)
+    {
+      if ((HANDLE)_get_osfhandle (src) == INVALID_HANDLE_VALUE)
+       {
+         errno = EBADF;
+         return -1;
+       }
+      return dst;
+    }
+
+  /* Make sure we close the destination first if it's a pipe or socket.  */
+  if (fd_info[dst].flags != 0)
     sys_close (dst);
 
   rc = _dup2 (src, dst);
   if (rc == 0)
     {
-      /* duplicate our internal info as well */
+      /* Duplicate our internal info as well.  */
       fd_info[dst] = fd_info[src];
     }
-  return rc;
+  return rc == 0 ? dst : rc;
 }
 
 int