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))
#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"
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;
}
/* 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;
}
--- /dev/null
+/*
+ * 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);
+}
--- /dev/null
+/*
+ * 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 */
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.
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;
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);
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.
/** 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;
};
/**
* @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