diff options
Diffstat (limited to 'server.c')
-rw-r--r-- | server.c | 30 |
1 files changed, 22 insertions, 8 deletions
@@ -1,4 +1,4 @@ -/* $OpenBSD: server.c,v 1.11 2014/07/25 16:23:19 reyk Exp $ */ +/* $OpenBSD: server.c,v 1.13 2014/07/25 23:30:58 reyk Exp $ */ /* * Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org> @@ -182,12 +182,13 @@ server_purge(struct server *srv) } struct server * -server_byaddr(struct sockaddr *addr) +server_byaddr(struct sockaddr *addr, in_port_t port) { struct server *srv; TAILQ_FOREACH(srv, env->sc_servers, srv_entry) { - if (sockaddr_cmp((struct sockaddr *)&srv->srv_conf.ss, + if (port == srv->srv_conf.port && + sockaddr_cmp((struct sockaddr *)&srv->srv_conf.ss, addr, srv->srv_conf.prefixlen) == 0) return (srv); } @@ -503,6 +504,19 @@ server_accept(int fd, short event, void *arg) clt->clt_srv_id = srv->srv_conf.id; clt->clt_pid = getpid(); clt->clt_inflight = 1; + + /* get local address */ + slen = sizeof(clt->clt_srv_ss); + if (getsockname(s, (struct sockaddr *)&clt->clt_srv_ss, + &slen) == -1) { + server_close(clt, "listen address lookup failed"); + return; + } + + /* get client address */ + memcpy(&clt->clt_ss, &ss, sizeof(clt->clt_ss)); + + /* get ports */ switch (ss.ss_family) { case AF_INET: clt->clt_port = ((struct sockaddr_in *)&ss)->sin_port; @@ -511,7 +525,6 @@ server_accept(int fd, short event, void *arg) clt->clt_port = ((struct sockaddr_in6 *)&ss)->sin6_port; break; } - memcpy(&clt->clt_ss, &ss, sizeof(clt->clt_ss)); getmonotime(&clt->clt_tv_start); memcpy(&clt->clt_tv_last, &clt->clt_tv_start, sizeof(clt->clt_tv_last)); @@ -571,7 +584,8 @@ server_inflight_dec(struct client *clt, const char *why) void server_close(struct client *clt, const char *msg) { - char ibuf[128], obuf[128], *ptr = NULL; + char ibuf[MAXHOSTNAMELEN], obuf[MAXHOSTNAMELEN]; + char *ptr = NULL; struct server *srv = clt->clt_srv; struct server_config *srv_conf = clt->clt_srv_conf; @@ -590,14 +604,14 @@ server_close(struct client *clt, const char *msg) memset(&ibuf, 0, sizeof(ibuf)); memset(&obuf, 0, sizeof(obuf)); (void)print_host(&clt->clt_ss, ibuf, sizeof(ibuf)); - (void)print_host(&srv_conf->ss, obuf, sizeof(obuf)); + (void)server_http_host(&clt->clt_srv_ss, obuf, sizeof(obuf)); if (EVBUFFER_LENGTH(clt->clt_log) && evbuffer_add_printf(clt->clt_log, "\r\n") != -1) ptr = evbuffer_readline(clt->clt_log); log_info("server %s, " - "client %d (%d active), %s -> %s:%d, " + "client %d (%d active), %s:%u -> %s, " "%s%s%s", srv_conf->name, clt->clt_id, server_clients, - ibuf, obuf, ntohs(clt->clt_port), msg, + ibuf, ntohs(clt->clt_port), obuf, msg, ptr == NULL ? "" : ",", ptr == NULL ? "" : ptr); if (ptr != NULL) free(ptr); |