aboutsummaryrefslogtreecommitdiff
path: root/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'server.c')
-rw-r--r--server.c56
1 files changed, 43 insertions, 13 deletions
diff --git a/server.c b/server.c
index 38151ea..21ccff2 100644
--- a/server.c
+++ b/server.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server.c,v 1.7 2014/07/23 13:26:39 reyk Exp $ */
+/* $OpenBSD: server.c,v 1.11 2014/07/25 16:23:19 reyk Exp $ */
/*
* Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org>
@@ -151,7 +151,8 @@ server_launch(void)
void
server_purge(struct server *srv)
{
- struct client *clt;
+ struct client *clt;
+ struct server_config *srv_conf;
/* shutdown and remove server */
if (event_initialized(&srv->srv_ev))
@@ -167,9 +168,33 @@ server_purge(struct server *srv)
SPLAY_ROOT(&srv->srv_clients)) != NULL)
server_close(clt, NULL);
+ /* cleanup hosts */
+ while ((srv_conf =
+ TAILQ_FIRST(&srv->srv_hosts)) != NULL) {
+ TAILQ_REMOVE(&srv->srv_hosts, srv_conf, entry);
+
+ /* It might point to our own "default" entry */
+ if (srv_conf != &srv->srv_conf)
+ free(srv_conf);
+ }
+
free(srv);
}
+struct server *
+server_byaddr(struct sockaddr *addr)
+{
+ struct server *srv;
+
+ TAILQ_FOREACH(srv, env->sc_servers, srv_entry) {
+ if (sockaddr_cmp((struct sockaddr *)&srv->srv_conf.ss,
+ addr, srv->srv_conf.prefixlen) == 0)
+ return (srv);
+ }
+
+ return (NULL);
+}
+
int
server_socket_af(struct sockaddr_storage *ss, in_port_t port)
{
@@ -316,9 +341,9 @@ server_socket_listen(struct sockaddr_storage *ss, in_port_t port,
void
server_input(struct client *clt)
{
- struct server *srv = clt->clt_server;
- evbuffercb inrd = server_read;
- evbuffercb inwr = server_write;
+ struct server_config *srv_conf = clt->clt_srv_conf;
+ evbuffercb inrd = server_read;
+ evbuffercb inwr = server_write;
if (server_httpdesc_init(clt) == -1) {
server_close(clt,
@@ -340,7 +365,7 @@ server_input(struct client *clt)
}
bufferevent_settimeout(clt->clt_bev,
- srv->srv_conf.timeout.tv_sec, srv->srv_conf.timeout.tv_sec);
+ srv_conf->timeout.tv_sec, srv_conf->timeout.tv_sec);
bufferevent_enable(clt->clt_bev, EV_READ|EV_WRITE);
}
@@ -472,9 +497,10 @@ server_accept(int fd, short event, void *arg)
clt->clt_s = s;
clt->clt_fd = -1;
clt->clt_toread = TOREAD_UNLIMITED;
- clt->clt_server = srv;
+ clt->clt_srv = srv;
+ clt->clt_srv_conf = &srv->srv_conf;
clt->clt_id = ++server_cltid;
- clt->clt_serverid = srv->srv_conf.id;
+ clt->clt_srv_id = srv->srv_conf.id;
clt->clt_pid = getpid();
clt->clt_inflight = 1;
switch (ss.ss_family) {
@@ -545,11 +571,15 @@ 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;
- struct server *srv = clt->clt_server;
+ char ibuf[128], obuf[128], *ptr = NULL;
+ struct server *srv = clt->clt_srv;
+ struct server_config *srv_conf = clt->clt_srv_conf;
SPLAY_REMOVE(client_tree, &srv->srv_clients, clt);
+ /* free the HTTP descriptors incl. headers */
+ server_close_http(clt);
+
event_del(&clt->clt_ev);
if (clt->clt_bev != NULL)
bufferevent_disable(clt->clt_bev, EV_READ|EV_WRITE);
@@ -560,13 +590,13 @@ 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->srv_conf.ss, obuf, sizeof(obuf));
+ (void)print_host(&srv_conf->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, "
- "%s%s%s", srv->srv_conf.name, clt->clt_id, server_clients,
+ "%s%s%s", srv_conf->name, clt->clt_id, server_clients,
ibuf, obuf, ntohs(clt->clt_port), msg,
ptr == NULL ? "" : ",", ptr == NULL ? "" : ptr);
if (ptr != NULL)
@@ -575,7 +605,7 @@ server_close(struct client *clt, const char *msg)
if (clt->clt_bev != NULL)
bufferevent_free(clt->clt_bev);
- else if (clt->clt_output != NULL)
+ if (clt->clt_output != NULL)
evbuffer_free(clt->clt_output);
if (clt->clt_file != NULL)