sock: move listen() into the getaddrinfo result loop in listen_sock()

This also reverses the exit logic of the loop.
It prepares listening on multiple addresses.

Signed-off-by: Michael Adam <obnox@samba.org>
This commit is contained in:
Michael Adam 2013-11-08 13:19:32 +01:00
parent 2ebfd456ef
commit fa26ad4d56

View File

@ -170,8 +170,8 @@ int listen_sock (const char *addr, uint16_t port, vector_t listen_fds)
{ {
struct addrinfo hints, *result, *rp; struct addrinfo hints, *result, *rp;
char portstr[6]; char portstr[6];
int listenfd;
const int on = 1; const int on = 1;
int ret = -1;
assert (port > 0); assert (port > 0);
assert (listen_fds != NULL); assert (listen_fds != NULL);
@ -191,6 +191,8 @@ int listen_sock (const char *addr, uint16_t port, vector_t listen_fds)
} }
for (rp = result; rp != NULL; rp = rp->ai_next) { for (rp = result; rp != NULL; rp = rp->ai_next) {
int listenfd;
listenfd = socket (rp->ai_family, rp->ai_socktype, listenfd = socket (rp->ai_family, rp->ai_socktype,
rp->ai_protocol); rp->ai_protocol);
if (listenfd == -1) if (listenfd == -1)
@ -199,37 +201,35 @@ int listen_sock (const char *addr, uint16_t port, vector_t listen_fds)
setsockopt (listenfd, SOL_SOCKET, SO_REUSEADDR, &on, setsockopt (listenfd, SOL_SOCKET, SO_REUSEADDR, &on,
sizeof (on)); sizeof (on));
if (bind (listenfd, rp->ai_addr, rp->ai_addrlen) == 0) if (bind(listenfd, rp->ai_addr, rp->ai_addrlen) != 0) {
break; /* success */ close (listenfd);
continue;
}
close (listenfd); if (listen(listenfd, MAXLISTEN) < 0) {
log_message(LOG_ERR,
"listen failed: %s", strerror(errno));
close (listenfd);
continue;
}
log_message(LOG_INFO, "listening on fd [%d]", listenfd);
vector_append (listen_fds, &listenfd, sizeof(int));
/* success, don't continue */
ret = 0;
break;
} }
if (rp == NULL) { if (ret != 0) {
/* was not able to bind to any address */ log_message (LOG_ERR, "Unable to listen on any address.");
log_message (LOG_ERR,
"Unable to bind listening socket "
"to any address.");
freeaddrinfo (result);
return -1;
} }
if (listen (listenfd, MAXLISTEN) < 0) {
log_message (LOG_ERR,
"Unable to start listening socket because of %s",
strerror (errno));
close (listenfd);
freeaddrinfo (result);
return -1;
}
vector_append(listen_fds, &listenfd, sizeof(int));
freeaddrinfo (result); freeaddrinfo (result);
return 0; return ret;
} }
/* /*