mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
See changelog.
git-svn-id: file:///svn/unbound/trunk@43 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
parent
5bb085a328
commit
0bd808133c
7 changed files with 200 additions and 18 deletions
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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
90
daemon/worker.c
Normal 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
86
daemon/worker.h
Normal 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 */
|
||||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue