diff options
Diffstat (limited to 'server.c')
-rw-r--r-- | server.c | 81 |
1 files changed, 47 insertions, 34 deletions
@@ -1,4 +1,4 @@ -/* $OpenBSD: server.c,v 1.5 2014/07/14 00:19:48 reyk Exp $ */ +/* $OpenBSD: server.c,v 1.7 2014/07/23 13:26:39 reyk Exp $ */ /* * Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org> @@ -148,6 +148,28 @@ server_launch(void) } } +void +server_purge(struct server *srv) +{ + struct client *clt; + + /* shutdown and remove server */ + if (event_initialized(&srv->srv_ev)) + event_del(&srv->srv_ev); + if (evtimer_initialized(&srv->srv_evt)) + evtimer_del(&srv->srv_evt); + + close(srv->srv_s); + TAILQ_REMOVE(env->sc_servers, srv, srv_entry); + + /* cleanup sessions */ + while ((clt = + SPLAY_ROOT(&srv->srv_clients)) != NULL) + server_close(clt, NULL); + + free(srv); +} + int server_socket_af(struct sockaddr_storage *ss, in_port_t port) { @@ -389,7 +411,6 @@ void server_error(struct bufferevent *bev, short error, void *arg) { struct client *clt = arg; - struct evbuffer *dst; if (error & EVBUFFER_TIMEOUT) { server_close(clt, "buffer event timeout"); @@ -403,20 +424,7 @@ server_error(struct bufferevent *bev, short error, void *arg) bufferevent_disable(bev, EV_READ|EV_WRITE); clt->clt_done = 1; - - if (bev != clt->clt_bev) { - dst = EVBUFFER_OUTPUT(clt->clt_bev); - if (EVBUFFER_LENGTH(dst)) - return; - } else - return; - - if (clt->clt_persist) { - server_reset_http(clt, 1); - bufferevent_enable(clt->clt_bev, EV_READ|EV_WRITE); - return; - } else - server_close(clt, "done"); + server_close(clt, "done"); return; } server_close(clt, "buffer event error"); @@ -448,8 +456,7 @@ server_accept(int fd, short event, void *arg) event_del(&srv->srv_ev); evtimer_add(&srv->srv_evt, &evtpause); - log_debug("%s: deferring connections %d", - __func__, getdtablecount()); + log_debug("%s: deferring connections", __func__); } return; } @@ -469,6 +476,7 @@ server_accept(int fd, short event, void *arg) clt->clt_id = ++server_cltid; clt->clt_serverid = srv->srv_conf.id; clt->clt_pid = getpid(); + clt->clt_inflight = 1; switch (ss.ss_family) { case AF_INET: clt->clt_port = ((struct sockaddr_in *)&ss)->sin_port; @@ -514,13 +522,27 @@ server_accept(int fd, short event, void *arg) * the client struct was not completly set up, but still * counted as an inflight client. account for this. */ - server_inflight--; - log_debug("%s: inflight decremented, now %d", - __func__, server_inflight); + server_inflight_dec(clt, __func__); } } void +server_inflight_dec(struct client *clt, const char *why) +{ + if (clt != NULL) { + /* the flight already left inflight mode. */ + if (clt->clt_inflight == 0) + return; + clt->clt_inflight = 0; + } + + /* the file was never opened, thus this was an inflight client. */ + server_inflight--; + log_debug("%s: inflight decremented, now %d, %s", + __func__, server_inflight, why); +} + +void server_close(struct client *clt, const char *msg) { char ibuf[128], obuf[128], *ptr = NULL; @@ -556,23 +578,14 @@ server_close(struct client *clt, const char *msg) else if (clt->clt_output != NULL) evbuffer_free(clt->clt_output); - if (clt->clt_s != -1) { - close(clt->clt_s); - if (clt->clt_fd == -1 && 0) { - /* - * the output was never connected, - * thus this was an inflight client. - */ - server_inflight--; - log_debug("%s: clients inflight decremented, now %d", - __func__, server_inflight); - } - } - if (clt->clt_file != NULL) bufferevent_free(clt->clt_file); if (clt->clt_fd != -1) close(clt->clt_fd); + if (clt->clt_s != -1) + close(clt->clt_s); + + server_inflight_dec(clt, __func__); if (clt->clt_log != NULL) evbuffer_free(clt->clt_log); |