emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/emacs-23 r100162: Backport fix for Bug#5723


From: Chong Yidong
Subject: [Emacs-diffs] /srv/bzr/emacs/emacs-23 r100162: Backport fix for Bug#5723 from trunk.
Date: Thu, 04 Nov 2010 15:56:50 -0400
User-agent: Bazaar (2.0.3)

------------------------------------------------------------
revno: 100162 [merge]
committer: Chong Yidong <address@hidden>
branch nick: emacs-23
timestamp: Thu 2010-11-04 15:56:50 -0400
message:
  Backport fix for Bug#5723 from trunk.
modified:
  src/ChangeLog
  src/process.c
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2010-11-04 19:46:30 +0000
+++ b/src/ChangeLog     2010-11-04 19:56:50 +0000
@@ -1,3 +1,18 @@
+2010-11-04  Chong Yidong  <address@hidden>
+
+       * process.c (Fmake_network_process): Don't apply Bug#5173 fix for
+       Windows.
+
+2010-11-04  YAMAMOTO Mitsuharu  <address@hidden>
+
+       * process.c (Fmake_network_process): Don't call turn_on_atimers around
+       `connect' (Bug#5723).
+
+2010-11-04  Helmut Eller  <address@hidden>
+
+       * process.c (Fmake_network_process): Call `select' for interrupted
+       `connect' rather than creating new socket (Bug#5173).
+
 2010-11-04  Kenichi Handa  <address@hidden>
 
        * font.c (font_delete_unmatched): Check Vface_ignored_fonts.

=== modified file 'src/process.c'
--- a/src/process.c     2010-11-01 11:30:33 +0000
+++ b/src/process.c     2010-11-04 19:54:28 +0000
@@ -3656,23 +3656,9 @@
       immediate_quit = 1;
       QUIT;
 
-      /* This turns off all alarm-based interrupts; the
-        bind_polling_period call above doesn't always turn all the
-        short-interval ones off, especially if interrupt_input is
-        set.
-
-        It'd be nice to be able to control the connect timeout
-        though.  Would non-blocking connect calls be portable?
-
-        This used to be conditioned by HAVE_GETADDRINFO.  Why?  */
-
-      turn_on_atimers (0);
-
       ret = connect (s, lres->ai_addr, lres->ai_addrlen);
       xerrno = errno;
 
-      turn_on_atimers (1);
-
       if (ret == 0 || xerrno == EISCONN)
        {
          /* The unwind-protect will be discarded afterwards.
@@ -3692,6 +3678,40 @@
 #endif
 #endif
 
+#ifndef WINDOWSNT
+      if (xerrno == EINTR)
+       {
+         /* Unlike most other syscalls connect() cannot be called
+            again.  (That would return EALREADY.)  The proper way to
+            wait for completion is select(). */
+         int sc, len;
+         SELECT_TYPE fdset;
+       retry_select:
+         FD_ZERO (&fdset);
+         FD_SET (s, &fdset);
+         QUIT;
+         sc = select (s + 1, (SELECT_TYPE *)0, &fdset, (SELECT_TYPE *)0,
+                      (EMACS_TIME *)0);
+         if (sc == -1)
+           {
+             if (errno == EINTR)
+               goto retry_select;
+             else
+               report_file_error ("select failed", Qnil);
+           }
+         eassert (sc > 0);
+
+         len = sizeof xerrno;
+         eassert (FD_ISSET (s, &fdset));
+         if (getsockopt (s, SOL_SOCKET, SO_ERROR, &xerrno, &len) == -1)
+           report_file_error ("getsockopt failed", Qnil);
+         if (xerrno)
+           errno = xerrno, report_file_error ("error during connect", Qnil);
+         else
+           break;
+       }
+#endif /* !WINDOWSNT */
+
       immediate_quit = 0;
 
       /* Discard the unwind protect closing S.  */
@@ -3699,8 +3719,10 @@
       emacs_close (s);
       s = -1;
 
+#ifdef WINDOWSNT
       if (xerrno == EINTR)
        goto retry_connect;
+#endif
     }
 
   if (s >= 0)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]