Lines Matching refs:daemon
2 * daemon/daemon.c - collection of workers that handles requests.
39 * The daemon consists of global settings and a number of workers.
69 #include "daemon/daemon.h"
70 #include "daemon/worker.h"
71 #include "daemon/remote.h"
72 #include "daemon/acl_list.h"
99 #include <systemd/sd-daemon.h>
202 struct daemon*
205 struct daemon* daemon = (struct daemon*)calloc(1,
206 sizeof(struct daemon));
211 if(!daemon)
261 daemon->need_to_exit = 0;
262 modstack_init(&daemon->mods);
263 if(!(daemon->env = (struct module_env*)calloc(1,
264 sizeof(*daemon->env)))) {
265 free(daemon);
268 daemon->env->modstack = &daemon->mods;
270 if(!edns_known_options_init(daemon->env)) {
271 free(daemon->env);
272 free(daemon);
275 alloc_init(&daemon->superalloc, NULL, 0);
276 daemon->acl = acl_list_create();
277 if(!daemon->acl) {
278 edns_known_options_delete(daemon->env);
279 free(daemon->env);
280 free(daemon);
283 daemon->acl_interface = acl_list_create();
284 if(!daemon->acl_interface) {
285 acl_list_delete(daemon->acl);
286 edns_known_options_delete(daemon->env);
287 free(daemon->env);
288 free(daemon);
291 daemon->tcl = tcl_list_create();
292 if(!daemon->tcl) {
293 acl_list_delete(daemon->acl_interface);
294 acl_list_delete(daemon->acl);
295 edns_known_options_delete(daemon->env);
296 free(daemon->env);
297 free(daemon);
301 if(gettimeofday(&daemon->time_boot, NULL) < 0)
303 daemon->time_last_stat = daemon->time_boot;
304 if((daemon->env->auth_zones = auth_zones_create()) == 0) {
305 acl_list_delete(daemon->acl_interface);
306 acl_list_delete(daemon->acl);
307 tcl_list_delete(daemon->tcl);
308 edns_known_options_delete(daemon->env);
309 free(daemon->env);
310 free(daemon);
313 if(!(daemon->env->edns_strings = edns_strings_create())) {
314 auth_zones_delete(daemon->env->auth_zones);
315 acl_list_delete(daemon->acl_interface);
316 acl_list_delete(daemon->acl);
317 tcl_list_delete(daemon->tcl);
318 edns_known_options_delete(daemon->env);
319 free(daemon->env);
320 free(daemon);
323 return daemon;
347 daemon_open_shared_ports(struct daemon* daemon)
349 log_assert(daemon);
350 if(daemon->cfg->port != daemon->listening_port) {
355 daemon->reuseport = 0;
357 if(daemon->ports != NULL) {
358 for(i=0; i<daemon->num_ports; i++)
359 listening_ports_free(daemon->ports[i]);
360 free(daemon->ports);
361 daemon->ports = NULL;
364 acl_interface_init(daemon->acl_interface);
365 if(!resolve_interface_names(daemon->cfg->ifs,
366 daemon->cfg->num_ifs, NULL, &resif, &num_resif))
370 if(daemon->cfg->so_reuseport && daemon->cfg->num_threads > 0)
371 daemon->reuseport = 1;
374 p0 = listening_ports_open(daemon->cfg, resif, num_resif,
375 &daemon->reuseport);
381 if(daemon->reuseport) {
383 daemon->num_ports = (size_t)daemon->cfg->num_threads;
387 daemon->num_ports = 1;
389 if(!(daemon->ports = (struct listen_port**)calloc(
390 daemon->num_ports, sizeof(*daemon->ports)))) {
395 daemon->ports[0] = p0;
396 if(!setup_acl_for_ports(daemon->acl_interface,
397 daemon->ports[0])) {
402 if(daemon->reuseport) {
404 for(i=1; i<daemon->num_ports; i++) {
405 if(!(daemon->ports[i]=
406 listening_ports_open(daemon->cfg,
408 &daemon->reuseport))
409 || !daemon->reuseport ) {
410 for(i=0; i<daemon->num_ports; i++)
411 listening_ports_free(daemon->ports[i]);
412 free(daemon->ports);
413 daemon->ports = NULL;
417 if(!setup_acl_for_ports(daemon->acl_interface,
418 daemon->ports[i])) {
419 for(i=0; i<daemon->num_ports; i++)
420 listening_ports_free(daemon->ports[i]);
421 free(daemon->ports);
422 daemon->ports = NULL;
429 daemon->listening_port = daemon->cfg->port;
431 if(!daemon->cfg->remote_control_enable && daemon->rc_port) {
432 listening_ports_free(daemon->rc_ports);
433 daemon->rc_ports = NULL;
434 daemon->rc_port = 0;
436 if(daemon->cfg->remote_control_enable &&
437 daemon->cfg->control_port != daemon->rc_port) {
438 listening_ports_free(daemon->rc_ports);
439 if(!(daemon->rc_ports=daemon_remote_open_ports(daemon->cfg)))
441 daemon->rc_port = daemon->cfg->control_port;
447 daemon_privileged(struct daemon* daemon)
449 daemon->env->cfg = daemon->cfg;
450 daemon->env->alloc = &daemon->superalloc;
451 daemon->env->worker = NULL;
452 if(!modstack_call_startup(&daemon->mods, daemon->cfg->module_conf,
453 daemon->env)) {
461 * @param daemon: the daemon
463 static void daemon_setup_modules(struct daemon* daemon)
465 daemon->env->cfg = daemon->cfg;
466 daemon->env->alloc = &daemon->superalloc;
467 daemon->env->worker = NULL;
468 if(daemon->mods_inited) {
469 modstack_call_deinit(&daemon->mods, daemon->env);
471 daemon->env->need_to_validate = 0; /* set by module init below */
472 if(!modstack_call_init(&daemon->mods, daemon->cfg->module_conf,
473 daemon->env)) {
476 daemon->mods_inited = 1;
477 log_edns_known_options(VERB_ALGO, daemon->env);
483 * @param daemon: the daemon. Uses rand and cfg.
487 static int daemon_get_shufport(struct daemon* daemon, int* shufport)
492 if(daemon->cfg->outgoing_avail_ports[i]) {
493 shufport[avail++] = daemon->cfg->
503 k = ub_random_max(daemon->rand, n+1); /* 0<= k<= n */
515 * @param daemon: the daemon that maintains the alloc caches to be cleared.
518 daemon_clear_allocs(struct daemon* daemon)
522 /* daemon->num may be different during reloads (after configuration
525 for(i=0; i<daemon->old_num; i++) {
526 alloc_clear(daemon->worker_allocs[i]);
527 free(daemon->worker_allocs[i]);
529 free(daemon->worker_allocs);
530 daemon->worker_allocs = NULL;
532 alloc_clear_special(&daemon->superalloc);
538 * Creates the daemon random generator if it does not exist yet.
540 * @param daemon: the daemon with (new) config settings.
543 daemon_create_workers(struct daemon* daemon)
547 log_assert(daemon && daemon->cfg);
548 if(!daemon->rand) {
549 daemon->rand = ub_initstate(NULL);
550 if(!daemon->rand)
552 hash_set_raninit((uint32_t)ub_random(daemon->rand));
556 fatal_exit("out of memory during daemon init");
557 numport = daemon_get_shufport(daemon, shufport);
561 daemon->doq_table = doq_table_create(daemon->cfg, daemon->rand);
562 if(!daemon->doq_table)
566 daemon->num = (daemon->cfg->num_threads?daemon->cfg->num_threads:1);
567 if(daemon->reuseport && (int)daemon->num < (int)daemon->num_ports) {
569 "so continuing with %d threads.", (int)daemon->num,
570 (int)daemon->num_ports);
571 daemon->num = (int)daemon->num_ports;
573 daemon->workers = (struct worker**)calloc((size_t)daemon->num,
575 if(!daemon->workers)
576 fatal_exit("out of memory during daemon init");
577 if(daemon->cfg->dnstap) {
579 daemon->dtenv = dt_create(daemon->cfg);
580 if (!daemon->dtenv)
586 for(i=0; i<daemon->num; i++) {
587 if(!(daemon->workers[i] = worker_create(daemon, i,
588 shufport+numport*i/daemon->num,
589 numport*(i+1)/daemon->num - numport*i/daemon->num)))
594 if(!daemon->worker_allocs) {
595 daemon->worker_allocs = (struct alloc_cache**)calloc(
596 (size_t)daemon->num, sizeof(struct alloc_cache*));
597 if(!daemon->worker_allocs)
599 for(i=0; i<daemon->num; i++) {
604 alloc_init(alloc, &daemon->superalloc, i);
605 daemon->worker_allocs[i] = alloc;
614 * @param daemon: daemon to close pipes in.
617 static void close_other_pipes(struct daemon* daemon, int thr)
620 for(i=0; i<daemon->num; i++)
624 tube_close_read(daemon->workers[i]->cmd);
627 tube_delete(daemon->workers[i]->cmd);
628 daemon->workers[i]->cmd = NULL;
649 close_other_pipes(worker->daemon, worker->thread_num);
652 if(worker->daemon->cfg->so_reuseport)
653 port_num = worker->thread_num % worker->daemon->num_ports;
657 if(!worker_init(worker, worker->daemon->cfg,
658 worker->daemon->ports[port_num], 0))
667 * @param daemon: the daemon with other threads to fork.
670 daemon_start_others(struct daemon* daemon)
673 log_assert(daemon);
676 for(i=1; i<daemon->num; i++) {
677 ub_thread_create(&daemon->workers[i]->thr_id,
678 thread_start, daemon->workers[i]);
681 tube_close_read(daemon->workers[i]->cmd);
688 * @param daemon: the daemon with other threads.
691 daemon_stop_others(struct daemon* daemon)
694 log_assert(daemon);
698 for(i=1; i<daemon->num; i++) {
699 worker_send_cmd(daemon->workers[i], worker_cmd_quit);
702 for(i=1; i<daemon->num; i++) {
705 ub_thread_join(daemon->workers[i]->thr_id);
711 daemon_fork(struct daemon* daemon)
718 log_assert(daemon);
719 if(!(daemon->env->views = views_create()))
722 if(!views_apply_cfg(daemon->env->views, daemon->cfg))
725 if(!acl_list_apply_cfg(daemon->acl, daemon->cfg, daemon->env->views))
727 if(!acl_interface_apply_cfg(daemon->acl_interface, daemon->cfg,
728 daemon->env->views))
730 if(!tcl_list_apply_cfg(daemon->tcl, daemon->cfg))
732 if(daemon->cfg->dnscrypt) {
734 daemon->dnscenv = dnsc_create();
735 if (!daemon->dnscenv)
737 dnsc_apply_cfg(daemon->dnscenv, daemon->cfg);
743 if(daemon->cfg->cookie_secret_file &&
744 daemon->cfg->cookie_secret_file[0]) {
745 if(!(daemon->cookie_secrets = cookie_secrets_create()))
747 if(!cookie_secrets_apply_cfg(daemon->cookie_secrets,
748 daemon->cfg->cookie_secret_file))
752 if(!(daemon->local_zones = local_zones_create()))
754 if(!local_zones_apply_cfg(daemon->local_zones, daemon->cfg))
756 if(!(daemon->env->fwds = forwards_create()) ||
757 !forwards_apply_cfg(daemon->env->fwds, daemon->cfg))
759 if(!(daemon->env->hints = hints_create()) ||
760 !hints_apply_cfg(daemon->env->hints, daemon->cfg))
764 if(!(daemon->env->respip_set = respip_set_create()))
766 if(!respip_global_apply_cfg(daemon->env->respip_set, daemon->cfg))
768 if(!respip_views_apply_cfg(daemon->env->views, daemon->cfg,
771 daemon->use_response_ip = !respip_set_is_empty(
772 daemon->env->respip_set) || have_view_respip_cfg;
775 daemon_setup_modules(daemon);
778 if(!auth_zones_apply_cfg(daemon->env->auth_zones, daemon->cfg, 1,
779 &daemon->use_rpz, daemon->env, &daemon->mods))
783 if(!edns_strings_apply_cfg(daemon->env->edns_strings, daemon->cfg))
787 daemon->env->cachedb_enabled = cachedb_is_enabled(&daemon->mods,
788 daemon->env);
793 if(daemon->use_response_ip &&
794 modstack_find(&daemon->mods, "respip") < 0)
799 if(daemon->use_rpz &&
800 modstack_find(&daemon->mods, "respip") < 0)
806 daemon_create_workers(daemon);
810 if(!worker_init(daemon->workers[0], daemon->cfg, daemon->ports[0], 1))
817 daemon_start_others(daemon);
824 if(!worker_init(daemon->workers[0], daemon->cfg, daemon->ports[0], 1))
827 signal_handling_playback(daemon->workers[0]);
829 if (!shm_main_init(daemon))
842 worker_work(daemon->workers[0]);
844 if (daemon->workers[0]->need_to_exit)
852 daemon_stop_others(daemon);
855 shm_main_shutdown(daemon);
857 daemon->reuse_cache = daemon->workers[0]->reuse_cache;
858 daemon->need_to_exit = daemon->workers[0]->need_to_exit;
862 daemon_cleanup(struct daemon* daemon)
865 log_assert(daemon);
877 if(!daemon->reuse_cache || daemon->need_to_exit) {
878 slabhash_clear(&daemon->env->rrset_cache->table);
879 slabhash_clear(daemon->env->msg_cache);
881 daemon->old_num = daemon->num; /* save the current num */
882 forwards_delete(daemon->env->fwds);
883 daemon->env->fwds = NULL;
884 hints_delete(daemon->env->hints);
885 daemon->env->hints = NULL;
886 local_zones_delete(daemon->local_zones);
887 daemon->local_zones = NULL;
888 respip_set_delete(daemon->env->respip_set);
889 daemon->env->respip_set = NULL;
890 views_delete(daemon->env->views);
891 daemon->env->views = NULL;
892 if(daemon->env->auth_zones)
893 auth_zones_cleanup(daemon->env->auth_zones);
895 daemon_remote_clear(daemon->rc);
896 if(daemon->fast_reload_thread)
897 fast_reload_thread_stop(daemon->fast_reload_thread);
898 if(daemon->fast_reload_printq_list)
899 fast_reload_printq_list_delete(daemon->fast_reload_printq_list);
900 for(i=0; i<daemon->num; i++)
901 worker_delete(daemon->workers[i]);
902 free(daemon->workers);
903 daemon->workers = NULL;
908 if(!daemon->reuse_cache || daemon->need_to_exit)
909 daemon_clear_allocs(daemon);
910 daemon->num = 0;
912 dt_delete(daemon->dtenv);
913 daemon->dtenv = NULL;
916 dnsc_delete(daemon->dnscenv);
917 daemon->dnscenv = NULL;
920 doq_table_delete(daemon->doq_table);
921 daemon->doq_table = NULL;
923 daemon->cfg = NULL;
927 daemon_delete(struct daemon* daemon)
930 if(!daemon)
932 modstack_call_deinit(&daemon->mods, daemon->env);
933 modstack_call_destartup(&daemon->mods, daemon->env);
934 modstack_free(&daemon->mods);
935 daemon_remote_delete(daemon->rc);
936 for(i = 0; i < daemon->num_ports; i++)
937 listening_ports_free(daemon->ports[i]);
938 free(daemon->ports);
939 listening_ports_free(daemon->rc_ports);
940 if(daemon->env) {
941 slabhash_delete(daemon->env->msg_cache);
942 rrset_cache_delete(daemon->env->rrset_cache);
943 infra_delete(daemon->env->infra_cache);
944 edns_known_options_delete(daemon->env);
945 edns_strings_delete(daemon->env->edns_strings);
946 auth_zones_delete(daemon->env->auth_zones);
948 ub_randfree(daemon->rand);
949 alloc_clear(&daemon->superalloc);
950 acl_list_delete(daemon->acl);
951 acl_list_delete(daemon->acl_interface);
952 tcl_list_delete(daemon->tcl);
953 cookie_secrets_delete(daemon->cookie_secrets);
955 free(daemon->chroot);
956 free(daemon->pidfile);
957 free(daemon->cfgfile);
958 free(daemon->env);
961 SSL_CTX_free((SSL_CTX*)daemon->listen_dot_sslctx);
962 SSL_CTX_free((SSL_CTX*)daemon->listen_doh_sslctx);
963 SSL_CTX_free((SSL_CTX*)daemon->connect_dot_sslctx);
966 SSL_CTX_free((SSL_CTX*)daemon->listen_quic_sslctx);
968 free(daemon);
1017 void daemon_apply_cfg(struct daemon* daemon, struct config_file* cfg)
1021 daemon->cfg = cfg;
1042 if(daemon->worker_allocs &&
1043 (new_num != daemon->old_num ||
1044 !slabhash_is_size(daemon->env->msg_cache, cfg->msg_cache_size,
1046 !slabhash_is_size(&daemon->env->rrset_cache->table,
1050 slabhash_clear(&daemon->env->rrset_cache->table);
1051 slabhash_clear(daemon->env->msg_cache);
1052 daemon_clear_allocs(daemon);
1055 if(!slabhash_is_size(daemon->env->msg_cache, cfg->msg_cache_size,
1057 slabhash_delete(daemon->env->msg_cache);
1058 daemon->env->msg_cache = slabhash_create(cfg->msg_cache_slabs,
1062 if(!daemon->env->msg_cache) {
1066 if((daemon->env->rrset_cache = rrset_cache_adjust(
1067 daemon->env->rrset_cache, cfg, &daemon->superalloc)) == 0)
1069 if((daemon->env->infra_cache = infra_adjust(daemon->env->infra_cache,