3ab5146898
Add patch-src:process.c. Due to the change in src/sys/kern/uipc_syscalls.c between rev. 1.153 and 1.154, connectiton attempt fails with EALREADY after connect (2) is interrupted. The patch fixes this problem. Obtained from: http://www.init-main.com/d/resource/process.c.diff Patch author: takawata Reviewed by: nakaji@jp.freebsd.org
91 lines
1.9 KiB
C
91 lines
1.9 KiB
C
--- src/process.c.orig Mon Mar 17 07:06:56 2003
|
|
+++ src/process.c Tue Aug 12 01:17:12 2003
|
|
@@ -1850,6 +1850,7 @@
|
|
for (lres = res; lres; lres = lres->ai_next)
|
|
{
|
|
s = socket (lres->ai_family, lres->ai_socktype, lres->ai_protocol);
|
|
+
|
|
if (s < 0)
|
|
{
|
|
xerrno = errno;
|
|
@@ -1882,19 +1883,43 @@
|
|
It'd be nice to be able to control the connect timeout
|
|
though. Would non-blocking connect calls be portable? */
|
|
turn_on_atimers (0);
|
|
+
|
|
ret = connect (s, lres->ai_addr, lres->ai_addrlen);
|
|
xerrno = errno;
|
|
turn_on_atimers (1);
|
|
|
|
- if (ret == 0 || xerrno == EISCONN)
|
|
+ if (ret == 0 || xerrno == EISCONN )
|
|
/* The unwind-protect will be discarded afterwards.
|
|
Likewise for immediate_quit. */
|
|
break;
|
|
|
|
immediate_quit = 0;
|
|
|
|
- if (xerrno == EINTR)
|
|
- goto loop;
|
|
+#if 1
|
|
+ if ( (errno == EINTR ) || (errno == EINPROGRESS)){
|
|
+ fd_set fds;
|
|
+ int e;
|
|
+ struct timeval tv;
|
|
+ tv.tv_sec =60;
|
|
+ tv.tv_usec = 0;
|
|
+ FD_ZERO(&fds);
|
|
+ FD_SET(s, &fds);
|
|
+ resel:
|
|
+ e = select(s+1, NULL, &fds, NULL, &tv);
|
|
+
|
|
+ if( e == -1){
|
|
+ if(errno == EINTR)
|
|
+ goto resel;
|
|
+ else
|
|
+ xerrno = ETIMEDOUT;
|
|
+ }
|
|
+ else {
|
|
+ xerrno = 0;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
+
|
|
if (xerrno == EADDRINUSE && retry < 20)
|
|
{
|
|
/* A delay here is needed on some FreeBSD systems,
|
|
@@ -2000,11 +2025,30 @@
|
|
&& errno != EISCONN)
|
|
{
|
|
int xerrno = errno;
|
|
-
|
|
+
|
|
immediate_quit = 0;
|
|
|
|
- if (errno == EINTR)
|
|
- goto loop;
|
|
+#if 1
|
|
+ if ( (errno == EINTR ) || (errno == EINPROGRESS)){
|
|
+ fd_set fds;
|
|
+ int e;
|
|
+ struct timeval tv;
|
|
+ tv.tv_sec =60;
|
|
+ tv_tv_usec = 0;
|
|
+ FD_CLEAR(&fds);
|
|
+ FD_SET(s, &fds);
|
|
+ resel:
|
|
+ e = select(s+1, NULL, fds, NULL, &tv);
|
|
+ if( e != 0){
|
|
+ if(errno == EINTR)
|
|
+ goto resel;
|
|
+ else
|
|
+ xerrno = ETIMEDOUT;
|
|
+ }
|
|
+ else
|
|
+ xerrno = 0;
|
|
+ }
|
|
+#endif
|
|
if (errno == EADDRINUSE && retry < 20)
|
|
{
|
|
/* A delay here is needed on some FreeBSD systems,
|