unbound: daemon/daemon.c File Reference

unbound 0.1

Functions | Variables
daemon.c File Reference

The daemon consists of global settings and a number of workers. More...

`#include "config.h"`
`#include <sys/time.h>`
`#include "daemon/daemon.h"`
`#include "daemon/worker.h"`
`#include "daemon/remote.h"`
`#include "daemon/acl_list.h"`
`#include "util/log.h"`
`#include "util/config_file.h"`
`#include "util/data/msgreply.h"`
`#include "util/shm_side/shm_main.h"`
`#include "util/storage/lookup3.h"`
`#include "util/storage/slabhash.h"`
`#include "util/tcp_conn_limit.h"`
`#include "util/edns.h"`
`#include "services/listen_dnsport.h"`
`#include "services/cache/rrset.h"`
`#include "services/cache/infra.h"`
`#include "services/localzone.h"`
`#include "services/view.h"`
`#include "services/modstack.h"`
`#include "services/authzone.h"`
`#include "util/module.h"`
`#include "util/random.h"`
`#include "util/tube.h"`
`#include "util/net_help.h"`
`#include "sldns/keyraw.h"`
`#include "respip/respip.h"`
`#include "iterator/iter_fwd.h"`
`#include "iterator/iter_hints.h"`
`#include <signal.h>`

## Functions
int | ub_c_lex_destroy (void)
| remove buffers for parsing and init
static RETSIGTYPE | record_sigh (int sig)
| used when no other sighandling happens, so we don't die when multiple signals in quick succession are sent to us.
static void | signal_handling_record (void)
| Signal handling during the time when netevent is disabled.
static void | signal_handling_playback (struct worker *wrk)
| Replay old signals.
struct daemon * | daemon_init (void)
| Initialize daemon structure.
static int | setup_acl_for_ports (struct acl_list *list, struct listen_port *port_list)
int | daemon_open_shared_ports (struct daemon *daemon)
| Open shared listening ports (if needed).
int | daemon_privileged (struct daemon *daemon)
| Do daemon setup that needs privileges like opening privileged ports or opening device files.
static void | daemon_setup_modules (struct daemon *daemon)
| Setup modules.
static int | daemon_get_shufport (struct daemon *daemon, int *shufport)
| Obtain allowed port numbers, concatenate the list, and shuffle them (ready to be handed out to threads).
static void | daemon_clear_allocs (struct daemon *daemon)
| Clear and delete per-worker alloc caches, and free memory maintained in superalloc.
static void | daemon_create_workers (struct daemon *daemon)
| Allocate empty worker structures.
static void * | thread_start (void *arg)
| Function to start one thread.
static void | daemon_start_others (struct daemon *daemon)
| Fork and init the other threads.
static void | daemon_stop_others (struct daemon *daemon)
| Stop the other threads.
void | daemon_fork (struct daemon *daemon)
| Fork workers and start service.
void | daemon_cleanup (struct daemon *daemon)
| Close off the worker thread information.
void | daemon_delete (struct daemon *daemon)
| Delete workers, close listening ports.
void | daemon_apply_cfg (struct daemon *daemon, struct config_file *cfg)
| Apply config settings.

## Variables
static int | sig_record_quit = 0
| How many quit requests happened.
static int | sig_record_reload = 0
| How many reload requests happened.

## Detailed Description

The daemon consists of global settings and a number of workers.

## Function Documentation

## ◆ record_sigh()

static RETSIGTYPE record_sigh | ( | int | sig | ) |
| static

used when no other sighandling happens, so we don't die when multiple signals in quick succession are sent to us.

Parameters

  sig | signal number.

Returns
  signal handler return type (void or int).

References sig_record_quit, and sig_record_reload.

Referenced by signal_handling_record().

## ◆ signal_handling_record()

static void signal_handling_record | ( | void |  | ) |
| static

Signal handling during the time when netevent is disabled.

Stores signals to replay later.

References log_err(), and record_sigh().

Referenced by daemon_cleanup(), and daemon_init().

## ◆ signal_handling_playback()

static void signal_handling_playback | ( | struct worker * | wrk | ) |
| static

Replay old signals.

Parameters

  wrk | worker that handles signals.

References sig_record_quit, sig_record_reload, and worker_sighandler().

Referenced by daemon_fork().

## ◆ daemon_init()

struct daemon * daemon_init | ( | void |  | ) |

Initialize daemon structure.

Returns
  : The daemon structure, or NULL on error.

References daemon::acl, daemon::acl_interface, acl_list_create(), acl_list_delete(), alloc_init(), module_env::auth_zones, auth_zones_create(), auth_zones_delete(), edns_known_options_delete(), edns_known_options_init(), module_env::edns_strings, edns_strings_create(), daemon::env, fatal_exit(), listen_setup_locks(), log_err(), daemon::mods, module_env::modstack, modstack_init(), daemon::need_to_exit, signal_handling_record(), daemon::superalloc, daemon::tcl, tcl_list_create(), tcl_list_delete(), daemon::time_boot, daemon::time_last_stat, and ub_openssl_lock_init().

Referenced by run_daemon(), and service_init().

## ◆ daemon_open_shared_ports()

int daemon_open_shared_ports | ( | struct daemon * | daemon | ) |

Open shared listening ports (if needed).

The cfg member pointer must have been set for the daemon.

Parameters

  daemon | the daemon.

Returns
  : false on error.

References daemon::acl_interface, acl_interface_init(), daemon::cfg, config_del_strarray(), config_file::control_port, daemon_remote_open_ports(), config_file::ifs, daemon::listening_port, listening_ports_free(), listening_ports_open(), log_assert, config_file::num_ifs, daemon::num_ports, config_file::num_threads, config_file::port, daemon::ports, daemon::rc_port, daemon::rc_ports, config_file::remote_control_enable, resolve_interface_names(), daemon::reuseport, and config_file::so_reuseport.

Referenced by run_daemon(), and service_init().

## ◆ daemon_privileged()

int daemon_privileged | ( | struct daemon * | daemon | ) |

Do daemon setup that needs privileges like opening privileged ports or opening device files.

The cfg member pointer must have been set for the daemon.

Parameters

  daemon | the daemon.

Returns
  : false on error.

References module_env::alloc, daemon::cfg, module_env::cfg, daemon::env, fatal_exit(), daemon::mods, modstack_call_startup(), config_file::module_conf, daemon::superalloc, and module_env::worker.

Referenced by perform_setup(), and service_init().

## ◆ daemon_setup_modules()

static void daemon_setup_modules | ( | struct daemon * | daemon | ) |
| static

Setup modules.

setup module stack.

Parameters

  daemon | the daemon

References module_env::alloc, daemon::cfg, module_env::cfg, daemon::env, fatal_exit(), log_edns_known_options(), daemon::mods, daemon::mods_inited, modstack_call_deinit(), modstack_call_init(), config_file::module_conf, module_env::need_to_validate, daemon::superalloc, VERB_ALGO, and module_env::worker.

Referenced by daemon_fork().

## ◆ daemon_get_shufport()

static int daemon_get_shufport | ( | struct daemon * | daemon,
|  | int * | shufport )
| static

Obtain allowed port numbers, concatenate the list, and shuffle them (ready to be handed out to threads).

Parameters

  daemon | the daemon. Uses rand and cfg.
  shufport | the portlist output.

Returns
  number of ports available.

References daemon::cfg, fatal_exit(), config_file::outgoing_avail_ports, daemon::rand, and ub_random_max().

Referenced by daemon_create_workers().

## ◆ daemon_clear_allocs()

static void daemon_clear_allocs | ( | struct daemon * | daemon | ) |
| static

Clear and delete per-worker alloc caches, and free memory maintained in superalloc.

The rrset and message caches must be empty at the time of call.

Parameters

  daemon | the daemon that maintains the alloc caches to be cleared.

References alloc_clear(), alloc_clear_special(), daemon::old_num, daemon::superalloc, and daemon::worker_allocs.

Referenced by daemon_apply_cfg(), and daemon_cleanup().

## ◆ daemon_create_workers()

static void daemon_create_workers | ( | struct daemon * | daemon | ) |
| static

Allocate empty worker structures.

With backptr and thread-number, from 0..numthread initialised. Used as user arguments to new threads. Creates the daemon random generator if it does not exist yet. The random generator stays existing between reloads with a unique state.

Parameters

  daemon | the daemon with (new) config settings.

References alloc_init(), daemon::cfg, daemon_get_shufport(), config_file::dnstap, fatal_exit(), log_assert, log_warn(), daemon::num, daemon::num_ports, config_file::num_threads, daemon::rand, daemon::reuseport, daemon::superalloc, ub_initstate(), ub_random(), VERB_ALGO, verbose(), daemon::worker_allocs, worker_create(), and daemon::workers.

Referenced by daemon_fork().

## ◆ thread_start()

static void * thread_start | ( | void * | arg | ) |
| static

Function to start one thread.

Parameters

  arg | user argument.

Returns
  : void* user return value could be used for thread_join results.

References daemon::cfg, worker::cmd, worker::daemon, fatal_exit(), log_thread_set(), daemon::num_ports, daemon::ports, config_file::so_reuseport, worker::thread_num, tube_close_write(), ub_thread_blocksigs(), worker_init(), and worker_work().

Referenced by daemon_start_others().

## ◆ daemon_start_others()

static void daemon_start_others | ( | struct daemon * | daemon | ) |
| static

Fork and init the other threads.

Main thread returns for special handling.

Parameters

  daemon | the daemon with other threads to fork.

References worker::cmd, log_assert, daemon::num, worker::thr_id, thread_start(), tube_close_read(), VERB_ALGO, verbose(), and daemon::workers.

Referenced by daemon_fork().

## ◆ daemon_stop_others()

static void daemon_stop_others | ( | struct daemon * | daemon | ) |
| static

Stop the other threads.

Parameters

  daemon | the daemon with other threads.

References log_assert, daemon::num, worker::thr_id, VERB_ALGO, verbose(), worker_cmd_quit, worker_send_cmd(), and daemon::workers.

Referenced by daemon_fork().

## ◆ daemon_fork()

void daemon_fork | ( | struct daemon * | daemon | ) |

Fork workers and start service.

When the routine exits, it is no longer forked.

Parameters

  daemon | the daemon.

References daemon::acl, daemon::acl_interface, acl_interface_apply_cfg(), acl_list_apply_cfg(), module_env::auth_zones, auth_zones_apply_cfg(), cachedb_is_enabled(), daemon::cfg, config_file::cookie_secret_file, daemon::cookie_secrets, cookie_secrets_apply_cfg(), cookie_secrets_create(), daemon_create_workers(), daemon_setup_modules(), daemon_start_others(), daemon_stop_others(), config_file::dnscrypt, module_env::edns_strings, edns_strings_apply_cfg(), daemon::env, fatal_exit(), forwards_apply_cfg(), forwards_create(), module_env::fwds, module_env::hints, hints_apply_cfg(), hints_create(), daemon::local_zones, local_zones_apply_cfg(), local_zones_create(), log_assert, log_info(), log_warn(), daemon::mods, modstack_find(), daemon::need_to_exit, worker::need_to_exit, daemon::ports, respip_global_apply_cfg(), daemon::respip_set, respip_set_create(), respip_set_is_empty(), respip_views_apply_cfg(), daemon::reuse_cache, worker::reuse_cache, signal_handling_playback(), daemon::tcl, tcl_list_apply_cfg(), daemon::use_response_ip, daemon::use_rpz, daemon::views, views_apply_cfg(), views_create(), worker_init(), worker_work(), and daemon::workers.

Referenced by run_daemon(), and service_main().

## ◆ daemon_cleanup()

void daemon_cleanup | ( | struct daemon * | daemon | ) |

Close off the worker thread information.

Bring the daemon back into state ready for daemon_fork again.

Parameters

  daemon | the daemon.

References module_env::auth_zones, auth_zones_cleanup(), daemon::cfg, daemon_clear_allocs(), daemon_remote_clear(), daemon::env, forwards_delete(), module_env::fwds, module_env::hints, hints_delete(), daemon::local_zones, local_zones_delete(), log_assert, log_thread_set(), module_env::msg_cache, daemon::need_to_exit, daemon::num, daemon::old_num, daemon::rc, daemon::respip_set, respip_set_delete(), daemon::reuse_cache, module_env::rrset_cache, signal_handling_record(), slabhash_clear(), rrset_cache::table, daemon::views, views_delete(), worker_delete(), and daemon::workers.

Referenced by run_daemon(), service_deinit(), and service_main().

## ◆ daemon_delete()

void daemon_delete | ( | struct daemon * | daemon | ) |

Delete workers, close listening ports.

Parameters

  daemon | the daemon.

References daemon::acl, daemon::acl_interface, acl_list_delete(), alloc_clear(), module_env::auth_zones, auth_zones_delete(), daemon::chroot, daemon::cookie_secrets, cookie_secrets_delete(), daemon_remote_delete(), edns_known_options_delete(), module_env::edns_strings, edns_strings_delete(), daemon::env, module_env::infra_cache, infra_delete(), listen_desetup_locks(), daemon::listen_sslctx, listen_sslctx_delete_ticket_keys(), listening_ports_free(), log_err(), daemon::mods, modstack_call_deinit(), modstack_call_destartup(), modstack_free(), module_env::msg_cache, daemon::num_ports, daemon::pidfile, daemon::ports, daemon::rand, daemon::rc, daemon::rc_ports, module_env::rrset_cache, rrset_cache_delete(), slabhash_delete(), daemon::superalloc, daemon::tcl, tcl_list_delete(), ub_c_lex_destroy(), ub_openssl_lock_delete(), and ub_randfree().

Referenced by run_daemon(), service_deinit(), and service_init().

## ◆ daemon_apply_cfg()

void daemon_apply_cfg | ( | struct daemon * | daemon,
|  | struct config_file * | cfg )

Apply config settings.

Parameters

  daemon | the daemon.
  cfg | new config settings.

References daemon::cfg, config_apply(), daemon_clear_allocs(), daemon::env, fatal_exit(), HASH_DEFAULT_STARTARRAY, infra_adjust(), module_env::infra_cache, log_warn(), module_env::msg_cache, config_file::msg_cache_size, config_file::msg_cache_slabs, msgreply_sizefunc(), config_file::num_threads, daemon::old_num, query_info_compare(), module_env::rrset_cache, rrset_cache_adjust(), config_file::rrset_cache_size, config_file::rrset_cache_slabs, slabhash_clear(), slabhash_create(), slabhash_delete(), slabhash_is_size(), daemon::superalloc, rrset_cache::table, and daemon::worker_allocs.

Referenced by apply_settings(), and service_init().