Commit c6b7d8b4 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Make it possible to use VSS_connect() for nonblocking connects.



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@4450 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 588fefb1
...@@ -104,7 +104,7 @@ telnet_mgt(const char *T_arg, int argc, char *argv[]) ...@@ -104,7 +104,7 @@ telnet_mgt(const char *T_arg, int argc, char *argv[])
exit(2); exit(2);
} }
sock = VSS_connect(ta[0]); sock = VSS_connect(ta[0], 0);
for (i = 0; i < n; ++i) { for (i = 0; i < n; ++i) {
free(ta[i]); free(ta[i]);
......
...@@ -581,7 +581,8 @@ replay_thread(void *arg) ...@@ -581,7 +581,8 @@ replay_thread(void *arg)
for (;;) { for (;;) {
thread_log(1, 0, "sleeping before connect..."); thread_log(1, 0, "sleeping before connect...");
usleep(1000 * (thr->fd % 3001)); usleep(1000 * (thr->fd % 3001));
if ((thr->sock = VSS_connect(addr_info)) >= 0) thr->sock = VSS_connect(addr_info, 0);
if (thr->sock >= 0)
break; break;
thread_log(0, errno, "connect failed"); thread_log(0, errno, "connect failed");
} }
......
...@@ -34,5 +34,5 @@ int VSS_parse(const char *str, char **addr, char **port); ...@@ -34,5 +34,5 @@ int VSS_parse(const char *str, char **addr, char **port);
int VSS_resolve(const char *addr, const char *port, struct vss_addr ***ta); int VSS_resolve(const char *addr, const char *port, struct vss_addr ***ta);
int VSS_bind(const struct vss_addr *addr); int VSS_bind(const struct vss_addr *addr);
int VSS_listen(const struct vss_addr *addr, int depth); int VSS_listen(const struct vss_addr *addr, int depth);
int VSS_connect(const struct vss_addr *addr); int VSS_connect(const struct vss_addr *addr, int nonblock);
int VSS_open(const char *str); int VSS_open(const char *str);
...@@ -239,9 +239,9 @@ VSS_listen(const struct vss_addr *va, int depth) ...@@ -239,9 +239,9 @@ VSS_listen(const struct vss_addr *va, int depth)
* Return the socket. * Return the socket.
*/ */
int int
VSS_connect(const struct vss_addr *va) VSS_connect(const struct vss_addr *va, int nonblock)
{ {
int sd; int sd, i;
sd = socket(va->va_family, va->va_socktype, va->va_protocol); sd = socket(va->va_family, va->va_socktype, va->va_protocol);
if (sd < 0) { if (sd < 0) {
...@@ -249,12 +249,14 @@ VSS_connect(const struct vss_addr *va) ...@@ -249,12 +249,14 @@ VSS_connect(const struct vss_addr *va)
perror("socket()"); perror("socket()");
return (-1); return (-1);
} }
if (connect(sd, &va->va_addr.sa, va->va_addrlen) != 0) { if (nonblock)
perror("connect()"); TCP_nonblocking(sd);
(void)close(sd); i = connect(sd, &va->va_addr.sa, va->va_addrlen);
return (-1); if (i == 0 || (nonblock && errno == EINPROGRESS))
} return (sd);
return (sd); perror("connect()");
(void)close(sd);
return (-1);
} }
/* /*
...@@ -279,7 +281,7 @@ VSS_open(const char *str) ...@@ -279,7 +281,7 @@ VSS_open(const char *str)
return (-1); return (-1);
} }
for (n = 0; n < nvaddr; n++) { for (n = 0; n < nvaddr; n++) {
retval = VSS_connect(vaddr[n]); retval = VSS_connect(vaddr[n], 0);
if (retval >= 0) if (retval >= 0)
break; break;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment