See changelog.

git-svn-id: file:///svn/unbound/trunk@43 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
Wouter Wijngaards 2007-01-30 16:36:46 +00:00
parent 5bb085a328
commit 0bd808133c
7 changed files with 200 additions and 18 deletions

View file

@ -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))

View file

@ -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;
}

90
daemon/worker.c Normal file
View file

@ -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);
}

86
daemon/worker.h Normal file
View file

@ -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 */

View file

@ -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.

View file

@ -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);

View file

@ -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