summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2013-11-08 13:19:32 +0100
committerMichael Adam <obnox@samba.org>2013-11-09 13:34:33 +0100
commitfa26ad4d566f2c3a34f1c6e7158a9268267f2582 (patch)
treebcca16f21fc3c100f206dd228e3d1e28f0b6564e /src
parent2ebfd456eff002cfba45aa88dad4b2a0cb9edc1a (diff)
downloadtinyproxy-fa26ad4d566f2c3a34f1c6e7158a9268267f2582.tar.gz
tinyproxy-fa26ad4d566f2c3a34f1c6e7158a9268267f2582.zip
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.c44
1 files 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;
}
/*