aboutsummaryrefslogtreecommitdiff
path: root/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'server.c')
-rw-r--r--server.c81
1 files changed, 47 insertions, 34 deletions
diff --git a/server.c b/server.c
index 876849b..38151ea 100644
--- a/server.c
+++ b/server.c
@@ -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);