diff options
author | Loïc Minier <lool@dooz.org> | 2008-03-24 15:38:27 -0400 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2008-03-24 15:38:27 -0400 |
commit | 556a351de83fc6f401b02213dae95731553c216d (patch) | |
tree | 3be1978d32679af40ae3cf768367777c43085686 | |
parent | 3de3e666e0653d4e8ae23fc3e6e31864ddad4059 (diff) |
Bug #10489: Don't retry unix socket connect()s on ENOENT.
If the socket isn't there, it's not gonna magically appear. Either it's
a server socket and you should have just waited for the SIGUSR1 from the
server, or it's a stale reference to an ICE socket.
However, do retry once, so fallback from abstract to filesystem namespace
works.
Originally Debian bug #385976.
-rw-r--r-- | Xtranssock.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/Xtranssock.c b/Xtranssock.c index 8a7d2ec..da4afe9 100644 --- a/Xtranssock.c +++ b/Xtranssock.c @@ -2146,8 +2146,13 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port) errno = olderrno; /* - * If the error was ENOENT, the server may be starting up - * and we should try again. + * If the error was ENOENT, the server may be starting up; we used + * to suggest to try again in this case with + * TRANS_TRY_CONNECT_AGAIN, but this introduced problems for + * processes still referencing stale sockets in their environment. + * Hence, we now return a hard error, TRANS_CONNECT_FAILED, and it + * is suggested that higher level stacks handle retries on their + * level when they face a slow starting server. * * If the error was EWOULDBLOCK or EINPROGRESS then the socket * was non-blocking and we should poll using select @@ -2161,14 +2166,14 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port) else if (olderrno == EINTR) return TRANS_TRY_CONNECT_AGAIN; else if (olderrno == ENOENT) { - /* - * If opening as abstract socket failed, try again "normally" - */ - if (abstract) + /* If opening as abstract socket failed, try again normally */ + if (abstract) { ciptr->transptr->flags &= ~(TRANS_ABSTRACT); - return TRANS_TRY_CONNECT_AGAIN; - } - else { + return TRANS_TRY_CONNECT_AGAIN; + } else { + return TRANS_CONNECT_FAILED; + } + } else { PRMSG (2,"SocketUNIXConnect: Can't connect: errno = %d\n", EGET(),0, 0); |