xref: /freebsd/contrib/unbound/daemon/daemon.h (revision 4c75e3aa0f1368f18240b8bfd0e1e88f64994a1c)
1b7579f77SDag-Erling Smørgrav /*
2b7579f77SDag-Erling Smørgrav  * daemon/daemon.h - collection of workers that handles requests.
3b7579f77SDag-Erling Smørgrav  *
4b7579f77SDag-Erling Smørgrav  * Copyright (c) 2007, NLnet Labs. All rights reserved.
5b7579f77SDag-Erling Smørgrav  *
6b7579f77SDag-Erling Smørgrav  * This software is open source.
7b7579f77SDag-Erling Smørgrav  *
8b7579f77SDag-Erling Smørgrav  * Redistribution and use in source and binary forms, with or without
9b7579f77SDag-Erling Smørgrav  * modification, are permitted provided that the following conditions
10b7579f77SDag-Erling Smørgrav  * are met:
11b7579f77SDag-Erling Smørgrav  *
12b7579f77SDag-Erling Smørgrav  * Redistributions of source code must retain the above copyright notice,
13b7579f77SDag-Erling Smørgrav  * this list of conditions and the following disclaimer.
14b7579f77SDag-Erling Smørgrav  *
15b7579f77SDag-Erling Smørgrav  * Redistributions in binary form must reproduce the above copyright notice,
16b7579f77SDag-Erling Smørgrav  * this list of conditions and the following disclaimer in the documentation
17b7579f77SDag-Erling Smørgrav  * and/or other materials provided with the distribution.
18b7579f77SDag-Erling Smørgrav  *
19b7579f77SDag-Erling Smørgrav  * Neither the name of the NLNET LABS nor the names of its contributors may
20b7579f77SDag-Erling Smørgrav  * be used to endorse or promote products derived from this software without
21b7579f77SDag-Erling Smørgrav  * specific prior written permission.
22b7579f77SDag-Erling Smørgrav  *
23b7579f77SDag-Erling Smørgrav  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2417d15b25SDag-Erling Smørgrav  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2517d15b25SDag-Erling Smørgrav  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2617d15b25SDag-Erling Smørgrav  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2717d15b25SDag-Erling Smørgrav  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2817d15b25SDag-Erling Smørgrav  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
2917d15b25SDag-Erling Smørgrav  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
3017d15b25SDag-Erling Smørgrav  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3117d15b25SDag-Erling Smørgrav  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3217d15b25SDag-Erling Smørgrav  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3317d15b25SDag-Erling Smørgrav  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34b7579f77SDag-Erling Smørgrav  */
35b7579f77SDag-Erling Smørgrav 
36b7579f77SDag-Erling Smørgrav /**
37b7579f77SDag-Erling Smørgrav  * \file
38b7579f77SDag-Erling Smørgrav  *
39b7579f77SDag-Erling Smørgrav  * The daemon consists of global settings and a number of workers.
40b7579f77SDag-Erling Smørgrav  */
41b7579f77SDag-Erling Smørgrav 
42b7579f77SDag-Erling Smørgrav #ifndef DAEMON_H
43b7579f77SDag-Erling Smørgrav #define DAEMON_H
44b7579f77SDag-Erling Smørgrav 
45b7579f77SDag-Erling Smørgrav #include "util/locks.h"
46b7579f77SDag-Erling Smørgrav #include "util/alloc.h"
47b7579f77SDag-Erling Smørgrav #include "services/modstack.h"
48b7579f77SDag-Erling Smørgrav struct config_file;
49b7579f77SDag-Erling Smørgrav struct worker;
50b7579f77SDag-Erling Smørgrav struct listen_port;
51b7579f77SDag-Erling Smørgrav struct slabhash;
52b7579f77SDag-Erling Smørgrav struct module_env;
53b7579f77SDag-Erling Smørgrav struct rrset_cache;
54b7579f77SDag-Erling Smørgrav struct acl_list;
55b7579f77SDag-Erling Smørgrav struct local_zones;
56bc892140SDag-Erling Smørgrav struct views;
57b7579f77SDag-Erling Smørgrav struct ub_randstate;
58b7579f77SDag-Erling Smørgrav struct daemon_remote;
5965b390aaSDag-Erling Smørgrav struct respip_set;
6065b390aaSDag-Erling Smørgrav struct shm_main_info;
61b7579f77SDag-Erling Smørgrav 
62ff825849SDag-Erling Smørgrav #include "dnstap/dnstap_config.h"
63ff825849SDag-Erling Smørgrav #ifdef USE_DNSTAP
64ff825849SDag-Erling Smørgrav struct dt_env;
65ff825849SDag-Erling Smørgrav #endif
66ff825849SDag-Erling Smørgrav 
6765b390aaSDag-Erling Smørgrav #include "dnscrypt/dnscrypt_config.h"
6865b390aaSDag-Erling Smørgrav #ifdef USE_DNSCRYPT
6965b390aaSDag-Erling Smørgrav struct dnsc_env;
7065b390aaSDag-Erling Smørgrav #endif
7165b390aaSDag-Erling Smørgrav 
72b7579f77SDag-Erling Smørgrav /**
73b7579f77SDag-Erling Smørgrav  * Structure holding worker list.
74b7579f77SDag-Erling Smørgrav  * Holds globally visible information.
75b7579f77SDag-Erling Smørgrav  */
76b7579f77SDag-Erling Smørgrav struct daemon {
77b7579f77SDag-Erling Smørgrav 	/** The config settings */
78b7579f77SDag-Erling Smørgrav 	struct config_file* cfg;
79b7579f77SDag-Erling Smørgrav 	/** the chroot dir in use, NULL if none */
80b7579f77SDag-Erling Smørgrav 	char* chroot;
81b7579f77SDag-Erling Smørgrav 	/** pidfile that is used */
82b7579f77SDag-Erling Smørgrav 	char* pidfile;
83b7579f77SDag-Erling Smørgrav 	/** port number that has ports opened. */
84b7579f77SDag-Erling Smørgrav 	int listening_port;
8517d15b25SDag-Erling Smørgrav 	/** array of listening ports, opened.  Listening ports per worker,
8617d15b25SDag-Erling Smørgrav 	 * or just one element[0] shared by the worker threads. */
8717d15b25SDag-Erling Smørgrav 	struct listen_port** ports;
8817d15b25SDag-Erling Smørgrav 	/** size of ports array */
8917d15b25SDag-Erling Smørgrav 	size_t num_ports;
90ff825849SDag-Erling Smørgrav 	/** reuseport is enabled if true */
91ff825849SDag-Erling Smørgrav 	int reuseport;
92b7579f77SDag-Erling Smørgrav 	/** port number for remote that has ports opened. */
93b7579f77SDag-Erling Smørgrav 	int rc_port;
94b7579f77SDag-Erling Smørgrav 	/** listening ports for remote control */
95b7579f77SDag-Erling Smørgrav 	struct listen_port* rc_ports;
96b7579f77SDag-Erling Smørgrav 	/** remote control connections management (for first worker) */
97b7579f77SDag-Erling Smørgrav 	struct daemon_remote* rc;
98b7579f77SDag-Erling Smørgrav 	/** ssl context for listening to dnstcp over ssl, and connecting ssl */
99b7579f77SDag-Erling Smørgrav 	void* listen_sslctx, *connect_sslctx;
100b7579f77SDag-Erling Smørgrav 	/** num threads allocated */
101b7579f77SDag-Erling Smørgrav 	int num;
102b7579f77SDag-Erling Smørgrav 	/** the worker entries */
103b7579f77SDag-Erling Smørgrav 	struct worker** workers;
104b7579f77SDag-Erling Smørgrav 	/** do we need to exit unbound (or is it only a reload?) */
105b7579f77SDag-Erling Smørgrav 	int need_to_exit;
106b7579f77SDag-Erling Smørgrav 	/** master random table ; used for port div between threads on reload*/
107b7579f77SDag-Erling Smørgrav 	struct ub_randstate* rand;
108b7579f77SDag-Erling Smørgrav 	/** master allocation cache */
109b7579f77SDag-Erling Smørgrav 	struct alloc_cache superalloc;
110b7579f77SDag-Erling Smørgrav 	/** the module environment master value, copied and changed by threads*/
111b7579f77SDag-Erling Smørgrav 	struct module_env* env;
112b7579f77SDag-Erling Smørgrav 	/** stack of module callbacks */
113b7579f77SDag-Erling Smørgrav 	struct module_stack mods;
114b7579f77SDag-Erling Smørgrav 	/** access control, which client IPs are allowed to connect */
115b7579f77SDag-Erling Smørgrav 	struct acl_list* acl;
116*4c75e3aaSDag-Erling Smørgrav 	/** TCP connection limit, limit connections from client IPs */
117*4c75e3aaSDag-Erling Smørgrav 	struct tcl_list* tcl;
118b7579f77SDag-Erling Smørgrav 	/** local authority zones */
119b7579f77SDag-Erling Smørgrav 	struct local_zones* local_zones;
120b7579f77SDag-Erling Smørgrav 	/** last time of statistics printout */
121b7579f77SDag-Erling Smørgrav 	struct timeval time_last_stat;
122b7579f77SDag-Erling Smørgrav 	/** time when daemon started */
123b7579f77SDag-Erling Smørgrav 	struct timeval time_boot;
124bc892140SDag-Erling Smørgrav 	/** views structure containing view tree */
125bc892140SDag-Erling Smørgrav 	struct views* views;
126ff825849SDag-Erling Smørgrav #ifdef USE_DNSTAP
127ff825849SDag-Erling Smørgrav 	/** the dnstap environment master value, copied and changed by threads*/
128ff825849SDag-Erling Smørgrav 	struct dt_env* dtenv;
129ff825849SDag-Erling Smørgrav #endif
13065b390aaSDag-Erling Smørgrav 	struct shm_main_info* shm_info;
13165b390aaSDag-Erling Smørgrav 	/** response-ip set with associated actions and tags. */
13265b390aaSDag-Erling Smørgrav 	struct respip_set* respip_set;
13365b390aaSDag-Erling Smørgrav 	/** some response-ip tags or actions are configured if true */
13465b390aaSDag-Erling Smørgrav 	int use_response_ip;
13565b390aaSDag-Erling Smørgrav #ifdef USE_DNSCRYPT
13665b390aaSDag-Erling Smørgrav 	/** the dnscrypt environment */
13765b390aaSDag-Erling Smørgrav 	struct dnsc_env* dnscenv;
13865b390aaSDag-Erling Smørgrav #endif
139b7579f77SDag-Erling Smørgrav };
140b7579f77SDag-Erling Smørgrav 
141b7579f77SDag-Erling Smørgrav /**
142b7579f77SDag-Erling Smørgrav  * Initialize daemon structure.
143b7579f77SDag-Erling Smørgrav  * @return: The daemon structure, or NULL on error.
144b7579f77SDag-Erling Smørgrav  */
145b7579f77SDag-Erling Smørgrav struct daemon* daemon_init(void);
146b7579f77SDag-Erling Smørgrav 
147b7579f77SDag-Erling Smørgrav /**
148b7579f77SDag-Erling Smørgrav  * Open shared listening ports (if needed).
149b7579f77SDag-Erling Smørgrav  * The cfg member pointer must have been set for the daemon.
150b7579f77SDag-Erling Smørgrav  * @param daemon: the daemon.
151b7579f77SDag-Erling Smørgrav  * @return: false on error.
152b7579f77SDag-Erling Smørgrav  */
153b7579f77SDag-Erling Smørgrav int daemon_open_shared_ports(struct daemon* daemon);
154b7579f77SDag-Erling Smørgrav 
155b7579f77SDag-Erling Smørgrav /**
156b7579f77SDag-Erling Smørgrav  * Fork workers and start service.
157b7579f77SDag-Erling Smørgrav  * When the routine exits, it is no longer forked.
158b7579f77SDag-Erling Smørgrav  * @param daemon: the daemon.
159b7579f77SDag-Erling Smørgrav  */
160b7579f77SDag-Erling Smørgrav void daemon_fork(struct daemon* daemon);
161b7579f77SDag-Erling Smørgrav 
162b7579f77SDag-Erling Smørgrav /**
163b7579f77SDag-Erling Smørgrav  * Close off the worker thread information.
164b7579f77SDag-Erling Smørgrav  * Bring the daemon back into state ready for daemon_fork again.
165b7579f77SDag-Erling Smørgrav  * @param daemon: the daemon.
166b7579f77SDag-Erling Smørgrav  */
167b7579f77SDag-Erling Smørgrav void daemon_cleanup(struct daemon* daemon);
168b7579f77SDag-Erling Smørgrav 
169b7579f77SDag-Erling Smørgrav /**
170b7579f77SDag-Erling Smørgrav  * Delete workers, close listening ports.
171b7579f77SDag-Erling Smørgrav  * @param daemon: the daemon.
172b7579f77SDag-Erling Smørgrav  */
173b7579f77SDag-Erling Smørgrav void daemon_delete(struct daemon* daemon);
174b7579f77SDag-Erling Smørgrav 
175b7579f77SDag-Erling Smørgrav /**
176b7579f77SDag-Erling Smørgrav  * Apply config settings.
177b7579f77SDag-Erling Smørgrav  * @param daemon: the daemon.
178b7579f77SDag-Erling Smørgrav  * @param cfg: new config settings.
179b7579f77SDag-Erling Smørgrav  */
180b7579f77SDag-Erling Smørgrav void daemon_apply_cfg(struct daemon* daemon, struct config_file* cfg);
181b7579f77SDag-Erling Smørgrav 
182b7579f77SDag-Erling Smørgrav #endif /* DAEMON_H */
183