diff options
author | Jun-ichiro itojun Hagino <itojun@cvs.openbsd.org> | 2000-02-18 04:12:21 +0000 |
---|---|---|
committer | Jun-ichiro itojun Hagino <itojun@cvs.openbsd.org> | 2000-02-18 04:12:21 +0000 |
commit | efd9b5b2701001e506716293d6c7e6bb16e9999c (patch) | |
tree | 204d31f2765ad500121b36db08743db50b615bf6 | |
parent | 856a0b03de5207c5d6d3e1ef0f5f4f8b7c59b0f7 (diff) |
do not perform sleep() every time we get ECONNREFUSED.
try all the set of addresses before go to sleep() and retry.
not sure if we still need sleep() - retry logic. why is it so persistent?
-rw-r--r-- | lib/libc/net/rcmd.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/lib/libc/net/rcmd.c b/lib/libc/net/rcmd.c index 3cd3029a03d..874c8107822 100644 --- a/lib/libc/net/rcmd.c +++ b/lib/libc/net/rcmd.c @@ -34,7 +34,7 @@ */ #if defined(LIBC_SCCS) && !defined(lint) -static char *rcsid = "$OpenBSD: rcmd.c,v 1.34 2000/01/30 05:17:49 itojun Exp $"; +static char *rcsid = "$OpenBSD: rcmd.c,v 1.35 2000/02/18 04:12:20 itojun Exp $"; #endif /* LIBC_SCCS and not lint */ #include <sys/param.h> @@ -90,6 +90,7 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af) pid_t pid; int s, lport, timo; char c, *p; + int refused; /* call rcmdsh() with specified remote shell if appropriate. */ if (!issetugid() && (p = getenv("RSH"))) { @@ -130,6 +131,7 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af) ; /*XXX*/ r = res; + refused = 0; oldmask = sigblock(sigmask(SIGURG)); for (timo = 1, lport = IPPORT_RESERVED - 1;;) { s = rresvport_af(&lport, r->ai_family); @@ -157,11 +159,8 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af) lport--; continue; } - if (errno == ECONNREFUSED && timo <= 16) { - (void)sleep(timo); - timo *= 2; - continue; - } + if (errno == ECONNREFUSED) + refused++; if (r->ai_next) { int oerrno = errno; char hbuf[NI_MAXHOST]; @@ -186,6 +185,13 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af) (void)fprintf(stderr, "Trying %s...\n", hbuf); continue; } + if (refused && timo <= 16) { + (void)sleep(timo); + timo *= 2; + r = res; + refused = 0; + continue; + } (void)fprintf(stderr, "%s: %s\n", res->ai_canonname, strerror(errno)); sigsetmask(oldmask); |