From 618ef6acbb14ad90d19196e9253b4b2180423705 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Thu, 22 Feb 2007 13:36:29 +0000 Subject: [PATCH] config file is used. git-svn-id: file:///svn/unbound/trunk@135 be551aaa-1e26-0410-a405-d3ace91eadb9 --- configure.ac | 4 +- daemon/unbound.c | 100 +++++++++++++++++--------------------- daemon/worker.c | 30 ++++++------ daemon/worker.h | 15 ++---- doc/Changelog | 4 ++ doc/example.conf | 54 ++++++++++++++++++++ doc/unbound.8 | 13 +---- doc/unbound.conf.5 | 24 +++++++++ services/listen_dnsport.c | 12 +++-- services/listen_dnsport.h | 2 +- testcode/fake_event.c | 2 +- testdata/fwd_tcp.tpkg | Bin 1468 -> 1596 bytes testdata/fwd_udp.tpkg | Bin 1461 -> 1594 bytes util/config_file.c | 13 +++++ util/config_file.h | 16 ++++++ util/configlexer.lex | 9 ++++ util/configparser.y | 91 ++++++++++++++++++++++++++++++++-- 17 files changed, 284 insertions(+), 105 deletions(-) create mode 100644 doc/example.conf diff --git a/configure.ac b/configure.ac index 3ffe1cbcf..fe6e1b19c 100644 --- a/configure.ac +++ b/configure.ac @@ -567,8 +567,8 @@ struct sockaddr_storage; #include "ldns/ldns.h" -/** default port to listen for queries, passed to getaddrinfo */ -#define UNBOUND_DNS_PORT "53" +/** default port for DNS traffic. */ +#define UNBOUND_DNS_PORT 53 ]) AC_CONFIG_FILES([Makefile]) diff --git a/daemon/unbound.c b/daemon/unbound.c index 9abd10a4a..06c0beb4e 100644 --- a/daemon/unbound.c +++ b/daemon/unbound.c @@ -55,15 +55,51 @@ static void usage() printf(" start unbound daemon DNS resolver.\n"); printf("-h this help\n"); printf("-c file config file to read, unbound.conf(5).\n"); - printf("-p port the port to listen on\n"); printf("-v verbose (multiple times increase verbosity)\n"); - printf("-f ip set forwarder address\n"); - printf("-z port set forwarder port\n"); printf("Version %s\n", PACKAGE_VERSION); printf("BSD licensed, see LICENSE in source package for details.\n"); printf("Report bugs to %s\n", PACKAGE_BUGREPORT); } +/** + * Run the daemon. + * @param cfgfile: the config file name. + * @param cmdline_verbose: verbosity resulting from commandline -v. + * These increase verbosity as specified in the config file. + */ +static void run_daemon(const char* cfgfile, int cmdline_verbose) +{ + struct worker* worker = NULL; + struct config_file *cfg = NULL; + + if(!(cfg = config_create())) { + fprintf(stderr, "Could not init config defaults."); + exit(1); + } + if(cfgfile) { + if(!config_read(cfg, cfgfile)) { + config_delete(cfg); + exit(1); + } + verbosity = cmdline_verbose + cfg->verbosity; + } + log_info("Start of %s.", PACKAGE_STRING); + + /* setup */ + worker = worker_init(cfg, BUFSZ); + if(!worker) { + fatal_exit("could not initialize"); + } + + /* drop user priviliges and chroot if needed */ + log_info("start of service (%s).", PACKAGE_STRING); + worker_work(worker); + + /* cleanup */ + verbose(VERB_ALGO, "Exit cleanup."); + worker_delete(worker); +} + /** getopt global, in case header files fail to declare it. */ extern int optind; /** getopt global, in case header files fail to declare it. */ @@ -78,39 +114,20 @@ extern char* optarg; int main(int argc, char* argv[]) { - struct worker* worker = NULL; - int do_ip4=1, do_ip6=1, do_udp=1, do_tcp=1; - size_t numports=3; - int baseport=10000; - const char* port = UNBOUND_DNS_PORT; int c; - const char* fwd = "127.0.0.1"; - const char* fwdport = UNBOUND_DNS_PORT; const char* cfgfile = NULL; - struct config_file *cfg = NULL; + int cmdline_verbose = 0; log_init(); /* parse the options */ - while( (c=getopt(argc, argv, "c:f:hvp:z:")) != -1) { + while( (c=getopt(argc, argv, "c:hv")) != -1) { switch(c) { case 'c': cfgfile = optarg; break; - case 'f': - fwd = optarg; - break; - case 'z': - fwdport = optarg; - break; - case 'p': - if(!atoi(optarg)) - fatal_exit("invalid port '%s'", optarg); - port = optarg; - baseport = atoi(optarg)+2000; - verbose(VERB_ALGO, "using port: %s", port); - break; case 'v': - verbosity ++; + cmdline_verbose ++; + verbosity++; break; case '?': case 'h': @@ -127,35 +144,6 @@ main(int argc, char* argv[]) return 1; } - if(!(cfg = config_create())) { - fprintf(stderr, "Could not init config defaults."); - return 1; - } - if(cfgfile) { - if(!config_read(cfg, cfgfile)) { - config_delete(cfg); - return 1; - } - } - log_info("Start of %s.", PACKAGE_STRING); - - /* setup */ - worker = worker_init(port, do_ip4, do_ip6, do_udp, do_tcp, BUFSZ, - numports, baseport); - if(!worker) { - fatal_exit("could not initialize"); - } - if(!worker_set_fwd(worker, fwd, fwdport)) { - worker_delete(worker); - fatal_exit("could not set forwarder address"); - } - - /* drop user priviliges and chroot if needed */ - log_info("start of service (%s).", PACKAGE_STRING); - worker_work(worker); - - /* cleanup */ - verbose(VERB_ALGO, "Exit cleanup."); - worker_delete(worker); + run_daemon(cfgfile, cmdline_verbose); return 0; } diff --git a/daemon/worker.c b/daemon/worker.c index cd4b79a3c..65f8edb75 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -44,6 +44,7 @@ #include "util/net_help.h" #include "daemon/worker.h" #include "util/netevent.h" +#include "util/config_file.h" #include "services/listen_dnsport.h" #include "services/outside_network.h" @@ -207,8 +208,7 @@ worker_sighandler(int sig, void* arg) } struct worker* -worker_init(const char* port, int do_ip4, int do_ip6, int do_udp, int do_tcp, - size_t buffer_size, size_t numports, int base_port) +worker_init(struct config_file *cfg, size_t buffer_size) { struct worker* worker = (struct worker*)calloc(1, sizeof(struct worker)); @@ -229,16 +229,17 @@ worker_init(const char* port, int do_ip4, int do_ip6, int do_udp, int do_tcp, worker_delete(worker); 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); + worker->front = listen_create(worker->base, 0, NULL, cfg->port, + cfg->do_ip4, cfg->do_ip6, cfg->do_udp, cfg->do_tcp, + buffer_size, worker_handle_request, worker); if(!worker->front) { log_err("could not create listening sockets"); worker_delete(worker); return NULL; } worker->back = outside_network_create(worker->base, - buffer_size, numports, NULL, 0, do_ip4, do_ip6, base_port); + buffer_size, (size_t)cfg->outgoing_num_ports, NULL, 0, + cfg->do_ip4, cfg->do_ip6, cfg->outgoing_base_port); if(!worker->back) { log_err("could not create outgoing sockets"); worker_delete(worker); @@ -255,6 +256,13 @@ worker_init(const char* port, int do_ip4, int do_ip6, int do_udp, int do_tcp, worker_delete(worker); return NULL; } + /* set forwarder address */ + if(cfg->fwd_address && cfg->fwd_address[0]) { + if(!worker_set_fwd(worker, cfg->fwd_address, cfg->fwd_port)) { + worker_delete(worker); + fatal_exit("could not set forwarder address"); + } + } return worker; } @@ -277,17 +285,11 @@ worker_delete(struct worker* worker) } int -worker_set_fwd(struct worker* worker, const char* ip, const char* port) +worker_set_fwd(struct worker* worker, const char* ip, int port) { uint16_t p; log_assert(worker && ip); - if(port) - p = (uint16_t)atoi(port); - else p = (uint16_t)atoi(UNBOUND_DNS_PORT); - if(!p) { - log_err("Bad port number %s", port?port:"default_port"); - return 0; - } + p = (uint16_t) port; if(str_is_ip6(ip)) { struct sockaddr_in6* sa = (struct sockaddr_in6*)&worker->fwd_addr; diff --git a/daemon/worker.h b/daemon/worker.h index f27371adf..703e0805a 100644 --- a/daemon/worker.h +++ b/daemon/worker.h @@ -47,6 +47,7 @@ #include "util/netevent.h" struct listen_dnsport; struct outside_network; +struct config_file; /** size of table used for random numbers. large to be more secure. */ #define RND_STATE_SIZE 256 @@ -84,19 +85,11 @@ struct worker { /** * 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 cfg: configuration settings. * @param buffer_size: size of datagram buffer. - * @param numports: number of outgoing ports. - * @param base_port: -1 or specify base of outgoing port range. * @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, size_t numports, - int base_port); +struct worker* worker_init(struct config_file *cfg, size_t buffer_size); /** * Make worker work. @@ -115,6 +108,6 @@ void worker_delete(struct worker* worker); * @param port: port on server or NULL for default 53. * @return: false on error. */ -int worker_set_fwd(struct worker* worker, const char* ip, const char* port); +int worker_set_fwd(struct worker* worker, const char* ip, int port); #endif /* DAEMON_WORKER_H */ diff --git a/doc/Changelog b/doc/Changelog index 96f53ccb4..43d0511a2 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,7 @@ +22 February 2007: Wouter + - Have a config file. Removed commandline options, moved to config. + - tests use config file. + 21 February 2007: Wouter - put -c option in man page. - minievent fd array capped by FD_SETSIZE. diff --git a/doc/example.conf b/doc/example.conf new file mode 100644 index 000000000..7a945ea26 --- /dev/null +++ b/doc/example.conf @@ -0,0 +1,54 @@ +# +# Example configuration file. +# +# See unbound.conf(5) man page. +# +# this is a comment. + +#Use this to include other text into the file. +#include: "otherfile.conf" + +# The server clause sets the main parameters. +server: + # whitespace is not necessary, but looks cleaner. + + # verbosity number, 0 is least verbose. + verbosity: 2 + + # number of threads to create. 1 disables threading. + # num-threads: 1 + + # port to answer queries from + # port: 53 + + # unbound needs to send packets to authoritative nameservers. + # it uses a range of ports for that. + # the start number of the port range + # outgoing-port: 1053 + + # number of port to allocate per thread, determines the size of the + # port range. A larger port range gives more resistance to certain + # spoof attacks, as it gets harder to guess which port is used. + # But also takes more system resources (for open sockets). + # outgoing-range: 16 + + # Enable IPv4, "yes" or "no". + # do-ip4: yes + + # Enable IPv6, "yes" or "no". + # do-ip6: yes + + # Enable UDP, "yes" or "no". + # do-udp: yes + + # Enable TCP, "yes" or "no". + # do-tcp: yes + + # Set this to configure unbound to act as a forwarder. All queries are + # sent to the remote nameserver that will resolve them. + # Set to "" to disable forwarding, or give ip-address to enable. + # forward-to: "" + + # The port number to send forwarded queries to. + # forward-to-port: 53 + diff --git a/doc/unbound.8 b/doc/unbound.8 index af4cecff4..5b8cba8a6 100644 --- a/doc/unbound.8 +++ b/doc/unbound.8 @@ -42,9 +42,6 @@ unbound .Nm unbound .Op Fl h .Op Fl c Ar cfgfile -.Op Fl p Ar port -.Op Fl f Ar ip -.Op Fl z Ar port .Op Fl v .Sh DESCRIPTION @@ -63,17 +60,9 @@ Set the config file to read with settings for unbound. The syntax is described in .Xr unbound.conf 5 . -.It Fl p Ar port -Start listening on the given port. Default is port 53(DNS). - -.It Fl f Ar ip -Set forwarder address. DNS queries will be forwarded to this server. - -.It Fl z Ar ip -Set forwarder port. DNS queries will be forwarded to this port. - .It Fl v Increase verbosity. If given multiple times, more information is logged. +This is in addition to the verbosity (if any) from the config file. .El .Sh SEE ALSO diff --git a/doc/unbound.conf.5 b/doc/unbound.conf.5 index 6dd4a0a68..3dbbb50bf 100644 --- a/doc/unbound.conf.5 +++ b/doc/unbound.conf.5 @@ -47,6 +47,30 @@ gives operational information. Level 2 gives query level information, output per query. Level 3 gives algorithm level information. .It \fBnum-threads:\fR The number of threads to create to serve clients. Use 1 for no threading. +.It \fBport:\fR +The port number, default 53, on which the server responds to queries. +.It \fBoutgoing-port:\fR +The starting port number where the outgoing query port range is allocated. +Default is 1053. +.It \fBoutgoing-range:\fR +Number of ports to open. This number is opened per thread for every outgoing +query interface. Must be at least 1. Default is 16. +Larger numbers give more protection against spoofing attempts, but need +extra resources from the operating system. +.It \fBdo-ip4:\fR +Enable or disable whether ip4 queries are answered. Default is yes. +.It \fBdo-ip6:\fR +Enable or disable whether ip6 queries are answered. Default is yes. +.It \fBdo-udp:\fR +Enable or disable whether UDP queries are answered. Default is yes. +.It \fBdo-tcp:\fR +Enable or disable whether TCP queries are answered. Default is yes. +.It \fBforward-to:\fR +If set (not "") then forwarder mode is enabled. Default is "" (disabled). +The ip address is used to forward all DNS queries to. +.It \fBforward-to-port:\fR +The port on which the remote server is running that answers forwarded queries. +Default is 53. .Sh FILES .Bl -tag -width indent diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c index a24d55ff7..d9a7b889a 100644 --- a/services/listen_dnsport.c +++ b/services/listen_dnsport.c @@ -294,15 +294,17 @@ 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, + int port, int do_ip4, int do_ip6, int do_udp, int do_tcp, size_t bufsize, comm_point_callback_t* cb, void *cb_arg) { struct addrinfo hints; int i; + char portbuf[10]; struct listen_dnsport* front = (struct listen_dnsport*) malloc(sizeof(struct listen_dnsport)); if(!front) return NULL; + snprintf(portbuf, sizeof(portbuf), "%d", port); front->cps = NULL; front->udp_buff = ldns_buffer_new(bufsize); if(!front->udp_buff) { @@ -329,7 +331,7 @@ listen_create(struct comm_base* base, int num_ifs, const char* ifs[], if(num_ifs == 0) { if(do_ip6) { hints.ai_family = AF_INET6; - if(!listen_create_if(NULL, front, base, port, + if(!listen_create_if(NULL, front, base, portbuf, do_udp, do_tcp, &hints, bufsize, cb, cb_arg)) { listen_delete(front); return NULL; @@ -337,7 +339,7 @@ listen_create(struct comm_base* base, int num_ifs, const char* ifs[], } if(do_ip4) { hints.ai_family = AF_INET; - if(!listen_create_if(NULL, front, base, port, + if(!listen_create_if(NULL, front, base, portbuf, do_udp, do_tcp, &hints, bufsize, cb, cb_arg)) { listen_delete(front); return NULL; @@ -348,7 +350,7 @@ listen_create(struct comm_base* base, int num_ifs, const char* ifs[], if(!do_ip6) continue; hints.ai_family = AF_INET6; - if(!listen_create_if(ifs[i], front, base, port, + if(!listen_create_if(ifs[i], front, base, portbuf, do_udp, do_tcp, &hints, bufsize, cb, cb_arg)) { listen_delete(front); return NULL; @@ -357,7 +359,7 @@ listen_create(struct comm_base* base, int num_ifs, const char* ifs[], if(!do_ip4) continue; hints.ai_family = AF_INET; - if(!listen_create_if(ifs[i], front, base, port, + if(!listen_create_if(ifs[i], front, base, portbuf, do_udp, do_tcp, &hints, bufsize, cb, cb_arg)) { listen_delete(front); return NULL; diff --git a/services/listen_dnsport.h b/services/listen_dnsport.h index d07ac1eaf..289c8709d 100644 --- a/services/listen_dnsport.h +++ b/services/listen_dnsport.h @@ -93,7 +93,7 @@ struct listen_list { * @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 num_ifs, const char* ifs[], int port, int do_ip4, int do_ip6, int do_udp, int do_tcp, size_t bufsize, comm_point_callback_t* cb, void* cb_arg); diff --git a/testcode/fake_event.c b/testcode/fake_event.c index 5d3bd79cf..9a88c521b 100644 --- a/testcode/fake_event.c +++ b/testcode/fake_event.c @@ -480,7 +480,7 @@ run_scenario(struct replay_runtime* runtime) struct listen_dnsport* listen_create(struct comm_base* base, int ATTR_UNUSED(num_ifs), - const char* ATTR_UNUSED(ifs[]), const char* ATTR_UNUSED(port), + const char* ATTR_UNUSED(ifs[]), int ATTR_UNUSED(port), int ATTR_UNUSED(do_ip4), int ATTR_UNUSED(do_ip6), int ATTR_UNUSED(do_udp), int ATTR_UNUSED(do_tcp), size_t bufsize, comm_point_callback_t* cb, void* cb_arg) diff --git a/testdata/fwd_tcp.tpkg b/testdata/fwd_tcp.tpkg index 6b8cda115c1a7c2101a8b248d8014972eb49c9b0..f8d35662f04d65e7fcf12decc71d26c5f9d9293e 100644 GIT binary patch literal 1596 zc-jFx2E+LuiwFRWmEA=E1ML~@a@t1Ff4QgF$c#zGMM%Ox1{=l%aN{-x0=RCb?GPay zpjzk@eVBOKzI*phNC*elosQ$Qsn%oZbbGsdx3_z@yUbSRBrsgrw7k;ZX95MGR;xts z>e1GF4ST9msn*J>R#j?yimKJh)jgV`eVV2texb1rM zQDyKAuHM=A)c%(ht$JtwD+-zmD33aed*FY*|NF3CEJAAMi^YAi4?YV$gF>*Nu+)8A zINYF?W|mE1wV)1ILBZ!(kCLCDI0IQO$$@)4mvNZ9ruYR84q`?-@F*qp5tDQW)DK|B zJg^)PZS1u4DT;J;-?yCkTGTedmXs|NA;Vs0GUyM-jr{ZHkRP^so&E(JLZw_ef)_8y zW$#u0G8qyNCTCY0s-zdmR3xFsf`PP6nEsNW*}OZAh-SkzZtWV&Rgd;4^sv%B6V-&n zyTgWUI)0H4aeQLUBKX6>A7M8JqycqXhI_BHrkX%GoTCgQ8MYda-T23j=XJ(Oz z3W_cy(@KmX8U;=KmTfi%t$CorL8PAZP9y&;y)xdhZrro3rG8DpV9v~%3qvA4HK9nM z;FnIh+@DWNg)LncN`)9d?k6MSX>#mIGFQ$Qnh;J!E74-;Oj+od!lKZWr@C=H_jnH( z47&}9Tcs?KJbskop+zI+0?l<_diBW!(;C?7OnvOsgrNsJw6oH!$oPHg-JtUX4CV|% z_ZwmSaDr3dN^|rjZNiBkc<2v&&`J-CMU%`z#|SLu2tJdD$0T&0zkuIJ?xOYM_> z58pLZO(D6f*7Y9kpo&2%2 zTZxLc!;=iYW zW8haxeCdb?jNi@q{_yAGx#*xoL9gE(4*NsW>U?)O8squp-cBr&jJoaddA|p5 zFS{e&Agk3Xcizjj5=^T%y6O&-{+z1Fnj)7K`AAvMq}%Icr`A7#o%tX0gU6KdkpEZJ zO5*=YRpb7zAv*K_CxAQoALB9I6J~%ZDRIj8S2F%~>c>}LGPp$~GR6pvtsD@H5OHnU zHeWK%Ks1Xg#JNkHr}!Zb704KqifKhIkT6=uQX5vO1Yifd6!sIAUts@t`9Dv79#h6c z{;yWbN&N>w_`g=p{QoH+y7}uQhtDbVt>Cr}8p-X06E2Iv0uwXSuk#Fury_L_nfj^7 z8F}7Q3|Ji`RjbJg{;5(LQCw3*x%+8$J^w4=zWDz!Wjy5nwVImT|0@5TfZzYs%>SPP zw(tL_rt=k5fYW6@5fQ|Z#=3IX1k;)WCKhr!(~$`8J++yk+Y25N9o`tCMw%{9enJJm zBWDU|CnAN41@IEox_akJqWTxtdc;Sn6tf{&P~#eO$6rxT;^p3`xRy$Lq*zQ`tBOeb z-%EtrK8?S7ECAlOu72@~FA+^8K8<(zzv&x~YGV)i|Itx(i{{Iy4O803G zll6Lh29O`9=UdFdOJ7zt|N?4XMPC;$KxNFqG| literal 1468 zc-jHH1w;BDiwFQNfYe0*1ML`VbJ|AGU%6kgku^>-EV7&h>+`MIvpZQ z2dD^1xsy!X$A9mhgg`hr?qnQy(r7(Kr`y}d?c;7&lchZltw6CIR@(bQpd!@k)#O<_ z+Ip^FPgAS4s)nO-Wlz=0b*;V!)i0$`79t*+3}A2RM=%oW@qDqkPxgWP5wj?SGYSinEMpJ(F3}n6C?+(u45UQ2x5j=lRF8U{f zi}jLpF*&{5P_1W?OhXcC&3ury3A1k!v|6{-NN6@()6uTA!t@xAu^pBsv(Zeryr(x^ z+v7#C#N))7B=&hC%ptv7&Kzq7a=h-HbS&KBkwQXNn)wS_N@BNk<#?qmpNT^fDkui9 zR%;y$$tq~!yW;v&D7OwYI7rNM)@{m9vO5zKtHCGt6?s>FY-kQw3?9|;d!yWrsnobg~ zoU&^S_t1x_4^i-49Io&ZRS@~&nG4#2mpo(`!D7+U46RvjMHnp-!3YYCOV{E+Ad!uFrUxieR=#bqsRX7$;c-aJbLzPS(9%7W^ z(Dq58kOmDJPu4`vOs0$mAjxG(OteZiy)Jo?>!txzC?uw`eUAd_DWu5wBMHf{rnvGmSJc8@AL2> zW!#tlHLbeNf3;Q?`CmqKp8t;kx9WdiR0xmQ0c514CI6>n{Oi(R?7;Tn29d}Z?|Xmg zLCgpdbH{bXmQjOvSkxe`T@kx5=M;E^OJih;$y7*jWw~awx|uhuGUenBb{XtPEdK-l z-*x{#q>TIWzh2kY`LBuZL?ZuddHz2JZ0CQ{A^eZN0A!oW_(VugnpGdz!WLu-SXe08 zN=G7M_Iua2Om`-Z#KUXr<2Lj*75s&qu~mw~xP(dth=yj>3vwy$CDYC!e#sQ}8p)RNCdmno%F}LcaM8{9!p_-mGyYk=W)`P~_ zeffWMRNLggT1~$Hsd@fC2Ar6j_OV!Rq-Oy6nKJJ9UIR2mC0)ub<^*9pahkNwV1m&Z zVoF+b8e){%z-SmT4Z8`XNF@&Y(H;hkpQXNogqnC;$Nb)7u;X diff --git a/testdata/fwd_udp.tpkg b/testdata/fwd_udp.tpkg index 57229abd86faed71461b683cbaa7b81e05371d78..8a079cdef0e6860f477bbe10ac9d82aaa145b0d7 100644 GIT binary patch literal 1594 zc-jFv2F3XwiwFQwmEA=E1ML`VbJ|AGU%6kgkr_Lg6rl%#DK?A=;KpqX1mn7ywnKz; zfMTIj^a$~^{qNm7At4-GcRG&KHmt|!Ztr&YZXb7hJ6+o2*!E@H3Ceq)2^54{%}Bo0 z%EosEd#YkoYr3i#ssFj zH*ocq-ShUZRBFQhny%Ok6T;WLkV zQJu6Gc8B`ZvqQwMTQ8~W*U2DQZ%6h6N(L;9av1E95zV6_?2%Ud@zilC=QA+FklJ-} zYC3L=+{l+U(`SQi@sBEdP#O2czpiN2Tj#%_)GE99e+<}%{Zc6(ETz&u*@uwDfkh#j zQ&^ZGZX7d_yC9{5>{ zYQpK=VZ*h(u*9c$A#tXOex7i3NN<;O$C^V?%zG;xakF@&kdT$sV$NCZz< zC{Z{J%O_m!FDK>04P73V57Y5cKbw&*laC%}Yvp{Q3Gqa<{#UIQD*TxY8$EHm1oou%m{&L7g?0|rmT zV8$T!zY)$4$G8NpG!L)pCLD)Rfbqa5EzQW9H_0^iEPmw*KI4SPIQE}DgWpKuy!F%g zaxfkZ-!xQBA%&~f*=Rg^IqY6EbnJ4e7#~q^(@@}uf8n?R#WhueeEu9`2Aeh`g+l6r z=zv9)N8ogZmp@2FP2z}V*`^=LUhKN5I~EFws%*T#0oTc;6!AymLlaCGu8**V9=Ybt zhtUDv=a+Ju-9@4;v@c4v9UD9rC5n3@ICEteRWbh~Dp~r|a!IRG8P2952g6NPh6>TY#O+!H%WYQ-j(uTm)O}C1> z5Khmg!igM<-YG5b*iv|l3I%@YTWJT61>5pJe)v74jQieys-b83pIQ;`KTTJ6`QKwe zawgPC0e>efbRv9cX{4|ZUc4wpb3B;&!wOG8eiYR~+|(!H&fw=>DPnbyRIMf}_@_$w zfzpa1xw}txhswVaw#9#v_&uDA`{G|$l~w&mRVuo|OYSHN5E6cH0cyCFrJ$i z`@^&E&U!#UnhW2hcqJ@kQXGw5fnHSOwYIES3KM(vlte2du>-bXh+{&J>d z*d4rj1FwhBYC*5x9S-|L(&~JFc`?G=#lIOlHo54wM`!&WyuR#S@CI2fmxZ%lp_Pra zdKXvSVTLcLimWNJuE-T-wTf=9vpZb=DQvC(urPW^8TZA1RW;K3uc0fV{-af^yZC<$ zxK;mQ{7v_W6`-7ywB++wGX8eyhws2+*RNS{*Xy!^DP+=Y^;{H1js(aDuz)+BRkU4!X`OBzVL)SDF6a%qp0ib?BK32FZa siBLDBX}`xJ;J8)gi&uMzXezs8X$L#l!47t?gRdL@1Q+3jfdD7~0Gb9IKL7v# literal 1461 zc-jHA1xorKiwFQJfYe0*1ML`VbJ|AGU%6kgku^>-DMAtmrZ_OcfE%|l5P|DvIvpZQ z2dEa3qLV`0$A9mh9v}#gI~m8BHd>FZd+p=)al7l;%9=)&FIjd_Iru^#BQzRX@~zjl zz9}3ivR2m=9M$RvvZ6NB`T=NPN}xPMEHnaugOwMBG`RiTUHku0nC0xh9y9Y^d2j>Q zckG_Gf34Pt?XOnlYF)0P{WV!@9DsbUQrrUHxcyHIMhC`{HX*e>`I!dH_S_~Yl1zG( znSt$x@xrMWtc<_{!-b392z3uQK0-sPV{z)lb3gmnwNQNF*n&OyJ>`b?z1xN z#9bK;-lMyR9?U(6{O@9Sh36;&j~5q{Ya5=kFhCFHhgL>tF4|-kxh7ANF`a2bV;cES zp2DA`bl&-8dNG<#^fxUIZ&yTsLH~W3n(Y&BH|x`Z(U)E zzdpth`p||p--a@MmltK1+&Iw|+8?=Ewgs*iCW?C$Q|8JRmH7MzRIqXjlQ{)(qm>O4 z=1{zqk|J^0$=_SnS_c-lg^AIDoMZ2d?eqARjc=37hj?Y*3&O`-RJ5f;whaYYSO_1X z2wMy@H{Q!`90!Fri=D_e>8;%IjxDeqEM)k(@BhC1p9KE><(Rwb|7x25RUFi+GSB~Y zxv2ji1df3}P}vg}XJCA^h&a^GemENd{a`G8hf3(V5)mhpSAZRwOh|u#p*=n6;~8?^ znRH)*=bN5I;azy+<6lmc=>5^FH}G1AP6r0VzOD~-(&_zpF`i%~_%~DABIAB{ayA^m z>x=%F56Eh@DxD2Vo%K#-CZ%OR6kYWvM2oQuGJC&-edt9ro7$*dW~}kGtZ( zu4q~RuT^E0$G=+C{|^H@^}oj}ga_;Za$K^K|5H5vb?MJm6LnO<#sI=s+4QCNQiMuW6E(ZLCRIyEp!nl0Oi1TJ9?E{$*_mNrG5KnSN{RU-0&1*1RwxWT+ zTm7U>%auJs#wP1}64c>O0-+A0*?fR~6<verbosity = 1; cfg->num_threads = 1; + cfg->port = UNBOUND_DNS_PORT; + cfg->do_ip4 = 1; + cfg->do_ip6 = 1; + cfg->do_udp = 1; + cfg->do_tcp = 1; + cfg->outgoing_base_port = cfg->port + 1000; + cfg->outgoing_num_ports = 16; + cfg->fwd_address = strdup(""); + if(!cfg->fwd_address) { + free(cfg); + return NULL; + } + cfg->fwd_port = UNBOUND_DNS_PORT; return cfg; } diff --git a/util/config_file.h b/util/config_file.h index f11c65a4f..8e00d32c8 100644 --- a/util/config_file.h +++ b/util/config_file.h @@ -53,6 +53,22 @@ struct config_file { /** number of threads to create */ int num_threads; + /** port on which queries are answered. */ + int port; + /** do ip4 query support. */ + int do_ip4; + /** do ip6 query support. */ + int do_ip6; + /** do udp query support. */ + int do_udp; + /** do tcp query support. */ + int do_tcp; + + /** outgoing port range base number */ + int outgoing_base_port; + /** outgoing port range number of ports (per thread, per if) */ + int outgoing_num_ports; + /** forwarder address. string. If not NULL fwder mode is enabled. */ char* fwd_address; /** forwarder port */ diff --git a/util/configlexer.lex b/util/configlexer.lex index 55bdb95e4..8068da8c5 100644 --- a/util/configlexer.lex +++ b/util/configlexer.lex @@ -99,6 +99,15 @@ ANY [^\"\n\r\\]|\\. server{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_SERVER;} num-threads{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_NUM_THREADS;} verbosity{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_VERBOSITY;} +port{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_PORT;} +outgoing-port{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_OUTGOING_PORT;} +outgoing-range{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_OUTGOING_RANGE;} +do-ip4{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_DO_IP4;} +do-ip6{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_DO_IP6;} +do-udp{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_DO_UDP;} +do-tcp{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_DO_TCP;} +forward-to{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_FORWARD_TO;} +forward-to-port{COLON} { LEXOUT(("v(%s) ", yytext)); return VAR_FORWARD_TO_PORT;} {NEWLINE} { LEXOUT(("NL\n")); cfg_parser->line++;} /* Quoted strings. Strip leading and ending quotes */ diff --git a/util/configparser.y b/util/configparser.y index 2bffa5955..3632062b8 100644 --- a/util/configparser.y +++ b/util/configparser.y @@ -67,7 +67,11 @@ static int server_settings_seen = 0; %token SPACE LETTER NEWLINE COMMENT COLON ANY ZONESTR %token STRING -%token VAR_SERVER VAR_VERBOSITY VAR_NUM_THREADS +%token VAR_SERVER VAR_VERBOSITY VAR_NUM_THREADS VAR_PORT +%token VAR_OUTGOING_PORT VAR_OUTGOING_RANGE +%token VAR_DO_IP4 VAR_DO_IP6 VAR_DO_UDP VAR_DO_TCP +%token VAR_FORWARD_TO VAR_FORWARD_TO_PORT + %% toplevelvars: /* empty */ | toplevelvars toplevelvar ; @@ -83,7 +87,10 @@ serverstart: VAR_SERVER } ; contents_server: contents_server content_server | ; -content_server: server_num_threads | server_verbosity; +content_server: server_num_threads | server_verbosity | server_port | + server_outgoing_port | server_outgoing_range | server_do_ip4 | + server_do_ip6 | server_do_udp | server_do_tcp | server_forward_to | + server_forward_to_port; server_num_threads: VAR_NUM_THREADS STRING { OUTYY(("P(server_num_threads:%s)\n", $2)); @@ -102,7 +109,85 @@ server_verbosity: VAR_VERBOSITY STRING free($2); } ; - +server_port: VAR_PORT STRING + { + OUTYY(("P(server_port:%s)\n", $2)); + if(atoi($2) == 0) + yyerror("port number expected"); + else cfg_parser->cfg->port = atoi($2); + free($2); + } + ; +server_outgoing_port: VAR_OUTGOING_PORT STRING + { + OUTYY(("P(server_outgoing_port:%s)\n", $2)); + if(atoi($2) == 0) + yyerror("port number expected"); + else cfg_parser->cfg->outgoing_base_port = atoi($2); + free($2); + } + ; +server_outgoing_range: VAR_OUTGOING_RANGE STRING + { + OUTYY(("P(server_outgoing_range:%s)\n", $2)); + if(atoi($2) == 0) + yyerror("number expected"); + else cfg_parser->cfg->outgoing_num_ports = atoi($2); + free($2); + } + ; +server_do_ip4: VAR_DO_IP4 STRING + { + OUTYY(("P(server_do_ip4:%s)\n", $2)); + if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->do_ip4 = (strcmp($2, "yes")==0); + free($2); + } + ; +server_do_ip6: VAR_DO_IP6 STRING + { + OUTYY(("P(server_do_ip6:%s)\n", $2)); + if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->do_ip6 = (strcmp($2, "yes")==0); + free($2); + } + ; +server_do_udp: VAR_DO_UDP STRING + { + OUTYY(("P(server_do_udp:%s)\n", $2)); + if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->do_udp = (strcmp($2, "yes")==0); + free($2); + } + ; +server_do_tcp: VAR_DO_TCP STRING + { + OUTYY(("P(server_do_tcp:%s)\n", $2)); + if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0) + yyerror("expected yes or no."); + else cfg_parser->cfg->do_tcp = (strcmp($2, "yes")==0); + free($2); + } + ; +server_forward_to: VAR_FORWARD_TO STRING + { + OUTYY(("P(server_forward_to:%s)\n", $2)); + free(cfg_parser->cfg->fwd_address); + cfg_parser->cfg->fwd_address = $2; + } + ; +server_forward_to_port: VAR_FORWARD_TO_PORT STRING + { + OUTYY(("P(server_forward_to_port:%s)\n", $2)); + if(atoi($2) == 0) + yyerror("number expected"); + else cfg_parser->cfg->fwd_port = atoi($2); + free($2); + } + ; %% /* parse helper routines could be here */ -- 2.47.2