# HG changeset patch # User Chong Yidong # Date 1288900610 14400 # Node ID f3541be97c746ababee26790dd557a71eb2be030 # Parent 7be30ce79ffd80af0e225716058c9badd5e725d3# Parent e7a9eb3aa4ac2f2a686b441a21acb059ee8c7f4a Backport fix for Bug#5723 from trunk. diff -r 7be30ce79ffd -r f3541be97c74 src/ChangeLog --- a/src/ChangeLog Thu Nov 04 15:47:27 2010 -0400 +++ b/src/ChangeLog Thu Nov 04 15:56:50 2010 -0400 @@ -1,3 +1,18 @@ +2010-11-04 Chong Yidong + + * process.c (Fmake_network_process): Don't apply Bug#5173 fix for + Windows. + +2010-11-04 YAMAMOTO Mitsuharu + + * process.c (Fmake_network_process): Don't call turn_on_atimers around + `connect' (Bug#5723). + +2010-11-04 Helmut Eller + + * process.c (Fmake_network_process): Call `select' for interrupted + `connect' rather than creating new socket (Bug#5173). + 2010-11-04 Kenichi Handa * font.c (font_delete_unmatched): Check Vface_ignored_fonts. diff -r 7be30ce79ffd -r f3541be97c74 src/process.c --- a/src/process.c Thu Nov 04 15:47:27 2010 -0400 +++ b/src/process.c Thu Nov 04 15:56:50 2010 -0400 @@ -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)