Browse Source

ccan/io: fix io_connect.

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>
Rusty Russell 11 years ago
parent
commit
12e924346b
1 changed files with 6 additions and 3 deletions
  1. 6 3
      ccan/io/io.c

+ 6 - 3
ccan/io/io.c

@@ -385,10 +385,13 @@ static int do_connect(int fd, struct io_plan *plan)
 
 
 	if (err == 0) {
 	if (err == 0) {
 		/* Restore blocking if it was initially. */
 		/* Restore blocking if it was initially. */
-		fcntl(fd, F_SETFD, plan->u1.s);
+		fcntl(fd, F_SETFL, plan->u1.s);
 		return 1;
 		return 1;
-	}
-	return 0;
+	} 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,