From: Wouter Wijngaards Date: Tue, 30 Jan 2007 16:36:46 +0000 (+0000) Subject: See changelog. X-Git-Tag: release-0.0~82 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0bd808133c0455bb4c11ae552ac84b1aa97d5744;p=thirdparty%2Funbound.git See changelog. git-svn-id: file:///svn/unbound/trunk@43 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/Makefile.in b/Makefile.in index 0bb59758c..9c2a46bb8 100644 --- a/Makefile.in +++ b/Makefile.in @@ -52,7 +52,7 @@ UNITTEST_SRC=testcode/unitmain.c UNITTEST_OBJ=$(addprefix $(BUILD),$(UNITTEST_SRC:.c=.o)) DAEMON_SRC=$(wildcard daemon/*.c) DAEMON_OBJ=$(addprefix $(BUILD),$(DAEMON_SRC:.c=.o)) -TESTBOUND_SRC=testcode/testbound.c testcode/ldns-testpkts.c +TESTBOUND_SRC=testcode/testbound.c testcode/ldns-testpkts.c daemon/worker.c TESTBOUND_OBJ=$(addprefix $(BUILD),$(TESTBOUND_SRC:.c=.o)) ALL_SRC=$(COMMON_SRC) $(UNITTEST_SRC) $(DAEMON_SRC) $(TESTBOUND_SRC) ALL_OBJ=$(addprefix $(BUILD),$(ALL_SRC:.c=.o) $(LIBOBJS)) diff --git a/daemon/unbound.c b/daemon/unbound.c index bffc7d2b1..91e930beb 100644 --- a/daemon/unbound.c +++ b/daemon/unbound.c @@ -42,8 +42,7 @@ #include "config.h" #include "util/log.h" -#include "util/netevent.h" -#include "services/listen_dnsport.h" +#include "daemon/worker.h" /** default port to listen for queries, passed to getaddrinfo */ #define UNBOUND_DNS_PORT "53" @@ -76,8 +75,7 @@ extern char* optarg; int main(int argc, char* argv[]) { - struct comm_base *base = 0; - struct listen_dnsport* front = 0; + struct worker* worker = NULL; int do_ip4=1, do_ip6=1, do_udp=1, do_tcp=1; const char* port = UNBOUND_DNS_PORT; int c; @@ -111,23 +109,17 @@ main(int argc, char* argv[]) } /* setup */ - base = comm_base_create(); - if(!base) - fatal_exit("could not create event handling base"); - front = listen_create(base, 0, NULL, port, do_ip4, do_ip6, - do_udp, do_tcp, BUFSZ); - if(!front) { - comm_base_delete(base); - fatal_exit("could not create listening sockets"); + worker = worker_init(port, do_ip4, do_ip6, do_udp, do_tcp, BUFSZ); + if(!worker) { + fatal_exit("could not initialize"); } /* drop user priviliges and chroot if needed */ - log_info("Start of %s.", PACKAGE_STRING); + worker_work(worker); /* cleanup */ verbose(VERB_ALGO, "Exit cleanup."); - listen_delete(front); - comm_base_delete(base); + worker_delete(worker); return 0; } diff --git a/daemon/worker.c b/daemon/worker.c new file mode 100644 index 000000000..38540dffc --- /dev/null +++ b/daemon/worker.c @@ -0,0 +1,90 @@ +/* + * daemon/worker.c - worker that handles a pending list of requests. + * + * Copyright (c) 2007, NLnet Labs. All rights reserved. + * + * This software is open source. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of the NLNET LABS nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * \file + * + * This file implements the worker that handles callbacks on events, for + * pending requests. + */ +#include "config.h" +#include "util/log.h" +#include "daemon/worker.h" +#include "util/netevent.h" +#include "services/listen_dnsport.h" + +/** handles callbacks from listening event interface */ +static int worker_handle_request(ldns_buffer* packet, void* arg) +{ + log_info("worker handle request"); + return 0; +} + +struct worker* worker_init(const char* port, int do_ip4, int do_ip6, + int do_udp, int do_tcp, size_t buffer_size) +{ + struct worker* worker = (struct worker*)malloc(sizeof(struct worker)); + if(!worker) + return NULL; + worker->base = comm_base_create(); + if(!worker->base) { + log_err("could not create event handling base"); + return NULL; + } + worker->front = listen_create(worker->base, 0, NULL, port, + do_ip4, do_ip6, do_udp, do_tcp, buffer_size, + worker_handle_request, worker); + if(!worker->front) { + comm_base_delete(worker->base); + log_err("could not create listening sockets"); + return NULL; + } + return worker; +} + + +void worker_work(struct worker* worker) +{ + comm_base_dispatch(worker->base); +} + +void worker_delete(struct worker* worker) +{ + if(!worker) + return; + listen_delete(worker->front); + comm_base_delete(worker->base); + free(worker); +} diff --git a/daemon/worker.h b/daemon/worker.h new file mode 100644 index 000000000..aa184992d --- /dev/null +++ b/daemon/worker.h @@ -0,0 +1,86 @@ +/* + * daemon/worker.h - worker that handles a pending list of requests. + * + * Copyright (c) 2007, NLnet Labs. All rights reserved. + * + * This software is open source. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of the NLNET LABS nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * \file + * + * This file describes the worker structure that holds a list of + * pending requests and handles them. + */ + +#ifndef DAEMON_WORKER_H +#define DAEMON_WORKER_H + +#include "config.h" +struct comm_base; +struct listen_dnsport; + +/** + * Structure holding working information for unbound. + * Holds globally visible information. + */ +struct worker { + /** the event base this worker works with */ + struct comm_base* base; + + /** the frontside listening interface where request events come in */ + struct listen_dnsport* front; +}; + +/** + * Initialize worker. + * Allocates event base, listens to ports + * @param port: the port number to bind to. + * @param do_ip4: listen to ip4 queries. + * @param do_ip6: listen to ip6 queries. + * @param do_udp: listen to udp queries. + * @param do_tcp: listen to tcp queries. + * @param buffer_size: size of datagram buffer. + * @return: The worker, or NULL on error. + */ +struct worker* worker_init(const char* port, int do_ip4, int do_ip6, + int do_udp, int do_tcp, size_t buffer_size); + +/** + * Make worker work. + */ +void worker_work(struct worker* worker); + +/** + * Delete worker. + */ +void worker_delete(struct worker* worker); + +#endif /* DAEMON_WORKER_H */ diff --git a/doc/Changelog b/doc/Changelog index 798d1fb4a..7a22eebad 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,5 +1,6 @@ 30 January 2007: Wouter - links in example/ldns-testpkts.c and .h for premade packet support. + - added callback argument to listen_dnsport and daemon/worker. 29 January 2007: Wouter - unbound.8 a short manpage. diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c index e4a6a3004..448bd468a 100644 --- a/services/listen_dnsport.c +++ b/services/listen_dnsport.c @@ -265,7 +265,7 @@ listen_create_if(const char* ifname, struct listen_dnsport* front, struct listen_dnsport* listen_create(struct comm_base* base, int num_ifs, const char* ifs[], const char* port, int do_ip4, int do_ip6, int do_udp, int do_tcp, - size_t bufsize) + size_t bufsize, listen_dnsport_cb_t* cb, void *cb_arg) { struct addrinfo hints; int i; @@ -274,6 +274,8 @@ listen_create(struct comm_base* base, int num_ifs, const char* ifs[], if(!front) return NULL; front->cps = NULL; + front->cb = cb; + front->cb_arg = cb_arg; front->udp_buff = ldns_buffer_new(bufsize); if(!front->udp_buff) { free(front); diff --git a/services/listen_dnsport.h b/services/listen_dnsport.h index 9c1511017..a4b0e05e7 100644 --- a/services/listen_dnsport.h +++ b/services/listen_dnsport.h @@ -46,6 +46,9 @@ struct comm_base; struct listen_list; +/** The callback type for a incoming request packet */ +typedef int listen_dnsport_cb_t(ldns_buffer* packet, void* arg); + /** * Listening for queries structure. * Contains list of query-listen sockets. @@ -60,6 +63,12 @@ struct listen_dnsport { /** list of comm points used to get incoming events */ struct listen_list *cps; + + /** callback function that accepts incoming message. */ + listen_dnsport_cb_t* cb; + + /** callback argument */ + void *cb_arg; }; /** @@ -86,12 +95,14 @@ struct listen_list { * @param do_udp: listen to udp queries. * @param do_tcp: listen to tcp queries. * @param bufsize: size of datagram buffer. + * @param cb: callback function when a request arrives. + * @param cb_arg: user data argument for callback function. * @return: the malloced listening structure, ready for use. NULL on error. */ struct listen_dnsport* listen_create(struct comm_base* base, int num_ifs, const char* ifs[], const char* port, int do_ip4, int do_ip6, int do_udp, int do_tcp, - size_t bufsize); + size_t bufsize, listen_dnsport_cb_t* cb, void *cb_arg); /** * delete the listening structure