From fa26ad4d566f2c3a34f1c6e7158a9268267f2582 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Fri, 8 Nov 2013 13:19:32 +0100 Subject: 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 --- src/sock.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/sock.c b/src/sock.c index d2db37b..113ea88 100644 --- a/src/sock.c +++ b/src/sock.c @@ -170,8 +170,8 @@ int listen_sock (const char *addr, uint16_t port, vector_t listen_fds) { struct addrinfo hints, *result, *rp; char portstr[6]; - int listenfd; const int on = 1; + int ret = -1; assert (port > 0); 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) { + int listenfd; + listenfd = socket (rp->ai_family, rp->ai_socktype, rp->ai_protocol); 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, sizeof (on)); - if (bind (listenfd, rp->ai_addr, rp->ai_addrlen) == 0) - break; /* success */ + if (bind(listenfd, rp->ai_addr, rp->ai_addrlen) != 0) { + close (listenfd); + continue; + } - close (listenfd); - } + if (listen(listenfd, MAXLISTEN) < 0) { + log_message(LOG_ERR, + "listen failed: %s", strerror(errno)); - if (rp == NULL) { - /* was not able to bind to any address */ - log_message (LOG_ERR, - "Unable to bind listening socket " - "to any address."); + close (listenfd); + continue; + } - freeaddrinfo (result); - return -1; - } + log_message(LOG_INFO, "listening on fd [%d]", listenfd); - if (listen (listenfd, MAXLISTEN) < 0) { - log_message (LOG_ERR, - "Unable to start listening socket because of %s", - strerror (errno)); + vector_append (listen_fds, &listenfd, sizeof(int)); - close (listenfd); - freeaddrinfo (result); - return -1; + /* success, don't continue */ + ret = 0; + break; } - vector_append(listen_fds, &listenfd, sizeof(int)); + if (ret != 0) { + log_message (LOG_ERR, "Unable to listen on any address."); + } freeaddrinfo (result); - return 0; + return ret; } /* -- cgit v1.2.3