summaryrefslogtreecommitdiff
path: root/usr.sbin/rebound
diff options
context:
space:
mode:
authorTed Unangst <tedu@cvs.openbsd.org>2015-10-16 18:47:53 +0000
committerTed Unangst <tedu@cvs.openbsd.org>2015-10-16 18:47:53 +0000
commit8dbabbdf54f968070bc0e899d68d4f03d57488f7 (patch)
treecd5739daefc32dc2270d2ec0a036e61e8c3f97f5 /usr.sbin/rebound
parent4ed693815e29b1fede608c6fa3216a8d834ec2dd (diff)
life is simpler if all requests go in the fifo, and then just remove them
in the error case instead of duplicating code.
Diffstat (limited to 'usr.sbin/rebound')
-rw-r--r--usr.sbin/rebound/rebound.c71
1 files changed, 32 insertions, 39 deletions
diff --git a/usr.sbin/rebound/rebound.c b/usr.sbin/rebound/rebound.c
index e6ed797f158..dcad25a35c1 100644
--- a/usr.sbin/rebound/rebound.c
+++ b/usr.sbin/rebound/rebound.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rebound.c,v 1.22 2015/10/16 18:38:53 tedu Exp $ */
+/* $OpenBSD: rebound.c,v 1.23 2015/10/16 18:47:52 tedu Exp $ */
/*
* Copyright (c) 2015 Ted Unangst <tedu@openbsd.org>
*
@@ -139,6 +139,32 @@ cachelookup(struct dnspacket *dnsreq, size_t reqlen)
return hit;
}
+static void
+freerequest(struct request *req)
+{
+ struct dnscache *ent;
+
+ TAILQ_REMOVE(&reqfifo, req, fifo);
+ if (req->client != -1)
+ close(req->client);
+ if (req->s != -1)
+ close(req->s);
+ if ((ent = req->cacheent) && !ent->resp) {
+ free(ent->req);
+ free(ent);
+ }
+ free(req);
+}
+
+static void
+freecacheent(struct dnscache *ent)
+{
+ TAILQ_REMOVE(&cache, ent, cache);
+ free(ent->req);
+ free(ent->resp);
+ free(ent);
+}
+
static struct request *
newrequest(int ud, struct sockaddr *remoteaddr)
{
@@ -166,6 +192,7 @@ newrequest(int ud, struct sockaddr *remoteaddr)
if (!(req = calloc(1, sizeof(*req))))
return NULL;
+ TAILQ_INSERT_TAIL(&reqfifo, req, fifo);
req->ts = now;
req->ts.tv_sec += 30;
@@ -203,11 +230,9 @@ newrequest(int ud, struct sockaddr *remoteaddr)
goto fail;
return req;
+
fail:
- free(hit);
- if (req->s != -1)
- close(req->s);
- free(req);
+ freerequest(req);
return NULL;
}
@@ -240,32 +265,6 @@ sendreply(int ud, struct request *req)
}
}
-static void
-freerequest(struct request *req)
-{
- struct dnscache *ent;
-
- TAILQ_REMOVE(&reqfifo, req, fifo);
- if (req->client != -1)
- close(req->client);
- if (req->s != -1)
- close(req->s);
- if ((ent = req->cacheent) && !ent->resp) {
- free(ent->req);
- free(ent);
- }
- free(req);
-}
-
-static void
-freecacheent(struct dnscache *ent)
-{
- TAILQ_REMOVE(&cache, ent, cache);
- free(ent->req);
- free(ent->resp);
- free(ent);
-}
-
static struct request *
tcpphasetwo(struct request *req)
{
@@ -299,6 +298,7 @@ newtcprequest(int ld, struct sockaddr *remoteaddr)
if (!(req = calloc(1, sizeof(*req))))
return NULL;
+ TAILQ_INSERT_TAIL(&reqfifo, req, fifo);
req->ts = now;
req->ts.tv_sec += 30;
@@ -318,19 +318,13 @@ newtcprequest(int ld, struct sockaddr *remoteaddr)
if (errno != EINPROGRESS)
goto fail;
} else {
- TAILQ_INSERT_TAIL(&reqfifo, req, fifo);
return tcpphasetwo(req);
}
- TAILQ_INSERT_TAIL(&reqfifo, req, fifo);
return req;
fail:
- if (req->s != -1)
- close(req->s);
- if (req->client != -1)
- close(req->client);
- free(req);
+ freerequest(req);
return NULL;
}
@@ -433,7 +427,6 @@ launch(const char *confname, int ud, int ld, int kq)
EV_SET(&chlist[0], req->s, EVFILT_READ,
EV_ADD, 0, 0, NULL);
kevent(kq, chlist, 1, NULL, 0, NULL);
- TAILQ_INSERT_TAIL(&reqfifo, req, fifo);
}
} else if (kev[i].ident == ld) {
req = newtcprequest(ld,