diff options
author | Michael Adam <obnox@samba.org> | 2013-11-08 13:19:32 +0100 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2013-11-09 13:34:33 +0100 |
commit | fa26ad4d566f2c3a34f1c6e7158a9268267f2582 (patch) | |
tree | bcca16f21fc3c100f206dd228e3d1e28f0b6564e /src | |
parent | 2ebfd456eff002cfba45aa88dad4b2a0cb9edc1a (diff) |
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>
Diffstat (limited to 'src')
-rw-r--r-- | src/sock.c | 44 |
1 files changed, 22 insertions, 22 deletions
@@ -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; } /* |