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. More...
 
static void signal_handling_record (void)
 Signal handling during the time when netevent is disabled. More...
 
static void signal_handling_playback (struct worker *wrk)
 Replay old signals. More...
 
struct daemondaemon_init (void)
 Initialize daemon structure. More...
 
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). More...
 
int daemon_privileged (struct daemon *daemon)
 Do daemon setup that needs privileges like opening privileged ports or opening device files. More...
 
static void daemon_setup_modules (struct daemon *daemon)
 Setup modules. More...
 
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). More...
 
static void daemon_clear_allocs (struct daemon *daemon)
 Clear and delete per-worker alloc caches, and free memory maintained in superalloc. More...
 
static void daemon_create_workers (struct daemon *daemon)
 Allocate empty worker structures. More...
 
static void * thread_start (void *arg)
 Function to start one thread. More...
 
static void daemon_start_others (struct daemon *daemon)
 Fork and init the other threads. More...
 
static void daemon_stop_others (struct daemon *daemon)
 Stop the other threads. More...
 
void daemon_fork (struct daemon *daemon)
 Fork workers and start service. More...
 
void daemon_cleanup (struct daemon *daemon)
 Close off the worker thread information. More...
 
void daemon_delete (struct daemon *daemon)
 Delete workers, close listening ports. More...
 
void daemon_apply_cfg (struct daemon *daemon, struct config_file *cfg)
 Apply config settings. More...
 

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
sigsignal 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().

◆ signal_handling_playback()

static void signal_handling_playback ( struct worker wrk)
static

Replay old signals.

Parameters
wrkworker that handles signals.

References sig_record_quit, sig_record_reload, and worker_sighandler().

◆ daemon_init()

struct daemon* daemon_init ( void  )

Initialize daemon structure.

Returns
: The daemon structure, or NULL on error.

Referenced by run_daemon().

◆ daemon_open_shared_ports()

int daemon_open_shared_ports ( struct daemon daemon)

◆ 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
daemonthe daemon.
Returns
: false on error.

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

Referenced by perform_setup().

◆ daemon_setup_modules()

static void daemon_setup_modules ( struct daemon daemon)
static

◆ 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
daemonthe daemon. Uses rand and cfg.
shufportthe portlist output.
Returns
number of ports available.

References daemon::cfg, and config_file::outgoing_avail_ports.

◆ 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
daemonthe 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
daemonthe daemon with (new) config settings.

References daemon::cfg, log_assert, daemon::rand, and ub_initstate().

◆ thread_start()

static void* thread_start ( void *  arg)
static

Function to start one thread.

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

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

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

◆ daemon_stop_others()

static void daemon_stop_others ( struct daemon daemon)
static

Stop the other threads.

Parameters
daemonthe daemon with other threads.

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

◆ daemon_fork()

void daemon_fork ( struct daemon daemon)

Fork workers and start service.

When the routine exits, it is no longer forked.

Parameters
daemonthe daemon.

References log_assert, daemon::views, and views_create().

◆ daemon_cleanup()

◆ daemon_delete()

◆ daemon_apply_cfg()