getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &len) gives err == ECONNREFUSED
when connection is refused. Handle this (and other error cases).
And we need F_SETFL not F_SETFD to restore blocking on the socket!
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
if (err == 0) {
/* Restore blocking if it was initially. */
if (err == 0) {
/* Restore blocking if it was initially. */
- fcntl(fd, F_SETFD, plan->u1.s);
+ fcntl(fd, F_SETFL, plan->u1.s);
+ } else if (err == EINPROGRESS)
+ return 0;
+
+ errno = err;
+ return -1;
}
struct io_plan io_connect_(int fd, const struct addrinfo *addr,
}
struct io_plan io_connect_(int fd, const struct addrinfo *addr,