Lines Matching defs: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;
348 daemon_open_shared_ports(struct daemon* daemon)
350 log_assert(daemon);
351 if(daemon->cfg->port != daemon->listening_port) {
356 daemon->reuseport = 0;
358 if(daemon->ports != NULL) {
359 for(i=0; i<daemon->num_ports; i++)
360 listening_ports_free(daemon->ports[i]);
361 free(daemon->ports);
362 daemon->ports = NULL;
365 acl_interface_init(daemon->acl_interface);
366 if(!resolve_interface_names(daemon->cfg->ifs,
367 daemon->cfg->num_ifs, NULL, &resif, &num_resif))
371 if(daemon->cfg->so_reuseport && daemon->cfg->num_threads > 0)
372 daemon->reuseport = 1;
375 p0 = listening_ports_open(daemon->cfg, resif, num_resif,
376 &daemon->reuseport);
382 if(daemon->reuseport) {
384 daemon->num_ports = (size_t)daemon->cfg->num_threads;
388 daemon->num_ports = 1;
390 if(!(daemon->ports = (struct listen_port**)calloc(
391 daemon->num_ports, sizeof(*daemon->ports)))) {
396 daemon->ports[0] = p0;
397 if(!setup_acl_for_ports(daemon->acl_interface,
398 daemon->ports[0])) {
403 if(daemon->reuseport) {
405 for(i=1; i<daemon->num_ports; i++) {
406 if(!(daemon->ports[i]=
407 listening_ports_open(daemon->cfg,
409 &daemon->reuseport))
410 || !daemon->reuseport ) {
411 for(i=0; i<daemon->num_ports; i++)
412 listening_ports_free(daemon->ports[i]);
413 free(daemon->ports);
414 daemon->ports = NULL;
418 if(!setup_acl_for_ports(daemon->acl_interface,
419 daemon->ports[i])) {
420 for(i=0; i<daemon->num_ports; i++)
421 listening_ports_free(daemon->ports[i]);
422 free(daemon->ports);
423 daemon->ports = NULL;
430 daemon->listening_port = daemon->cfg->port;
432 if(!daemon->cfg->remote_control_enable && daemon->rc_port) {
433 listening_ports_free(daemon->rc_ports);
434 daemon->rc_ports = NULL;
435 daemon->rc_port = 0;
437 if(daemon->cfg->remote_control_enable &&
438 daemon->cfg->control_port != daemon->rc_port) {
439 listening_ports_free(daemon->rc_ports);
440 if(!(daemon->rc_ports=daemon_remote_open_ports(daemon->cfg)))
442 daemon->rc_port = daemon->cfg->control_port;
448 daemon_privileged(struct daemon* daemon)
450 daemon->env->cfg = daemon->cfg;
451 daemon->env->alloc = &daemon->superalloc;
452 daemon->env->worker = NULL;
453 if(!modstack_call_startup(&daemon->mods, daemon->cfg->module_conf,
454 daemon->env)) {
462 * @param daemon: the daemon
464 static void daemon_setup_modules(struct daemon* daemon)
466 daemon->env->cfg = daemon->cfg;
467 daemon->env->alloc = &daemon->superalloc;
468 daemon->env->worker = NULL;
469 if(daemon->mods_inited) {
470 modstack_call_deinit(&daemon->mods, daemon->env);
472 daemon->env->need_to_validate = 0; /* set by module init below */
473 if(!modstack_call_init(&daemon->mods, daemon->cfg->module_conf,
474 daemon->env)) {
477 daemon->mods_inited = 1;
478 log_edns_known_options(VERB_ALGO, daemon->env);
484 * @param daemon: the daemon. Uses rand and cfg.
488 static int daemon_get_shufport(struct daemon* daemon, int* shufport)
493 if(daemon->cfg->outgoing_avail_ports[i]) {
494 shufport[avail++] = daemon->cfg->
504 k = ub_random_max(daemon->rand, n+1); /* 0<= k<= n */
516 * @param daemon: the daemon that maintains the alloc caches to be cleared.
519 daemon_clear_allocs(struct daemon* daemon)
523 /* daemon->num may be different during reloads (after configuration
526 for(i=0; i<daemon->old_num; i++) {
527 alloc_clear(daemon->worker_allocs[i]);
528 free(daemon->worker_allocs[i]);
530 free(daemon->worker_allocs);
531 daemon->worker_allocs = NULL;
533 alloc_clear_special(&daemon->superalloc);
539 * Creates the daemon random generator if it does not exist yet.
541 * @param daemon: the daemon with (new) config settings.
544 daemon_create_workers(struct daemon* daemon)
548 log_assert(daemon && daemon->cfg);
549 if(!daemon->rand) {
550 daemon->rand = ub_initstate(NULL);
551 if(!daemon->rand)
553 hash_set_raninit((uint32_t)ub_random(daemon->rand));
557 fatal_exit("out of memory during daemon init");
558 numport = daemon_get_shufport(daemon, shufport);
561 daemon->num = (daemon->cfg->num_threads?daemon->cfg->num_threads:1);
562 if(daemon->reuseport && (int)daemon->num < (int)daemon->num_ports) {
564 "so continuing with %d threads.", (int)daemon->num,
565 (int)daemon->num_ports);
566 daemon->num = (int)daemon->num_ports;
568 daemon->workers = (struct worker**)calloc((size_t)daemon->num,
570 if(!daemon->workers)
571 fatal_exit("out of memory during daemon init");
572 if(daemon->cfg->dnstap) {
574 daemon->dtenv = dt_create(daemon->cfg);
575 if (!daemon->dtenv)
581 for(i=0; i<daemon->num; i++) {
582 if(!(daemon->workers[i] = worker_create(daemon, i,
583 shufport+numport*i/daemon->num,
584 numport*(i+1)/daemon->num - numport*i/daemon->num)))
589 if(!daemon->worker_allocs) {
590 daemon->worker_allocs = (struct alloc_cache**)calloc(
591 (size_t)daemon->num, sizeof(struct alloc_cache*));
592 if(!daemon->worker_allocs)
594 for(i=0; i<daemon->num; i++) {
599 alloc_init(alloc, &daemon->superalloc, i);
600 daemon->worker_allocs[i] = alloc;
609 * @param daemon: daemon to close pipes in.
612 static void close_other_pipes(struct daemon* daemon, int thr)
615 for(i=0; i<daemon->num; i++)
619 tube_close_read(daemon->workers[i]->cmd);
622 tube_delete(daemon->workers[i]->cmd);
623 daemon->workers[i]->cmd = NULL;
644 close_other_pipes(worker->daemon, worker->thread_num);
647 if(worker->daemon->cfg->so_reuseport)
648 port_num = worker->thread_num % worker->daemon->num_ports;
652 if(!worker_init(worker, worker->daemon->cfg,
653 worker->daemon->ports[port_num], 0))
662 * @param daemon: the daemon with other threads to fork.
665 daemon_start_others(struct daemon* daemon)
668 log_assert(daemon);
671 for(i=1; i<daemon->num; i++) {
672 ub_thread_create(&daemon->workers[i]->thr_id,
673 thread_start, daemon->workers[i]);
676 tube_close_read(daemon->workers[i]->cmd);
683 * @param daemon: the daemon with other threads.
686 daemon_stop_others(struct daemon* daemon)
689 log_assert(daemon);
693 for(i=1; i<daemon->num; i++) {
694 worker_send_cmd(daemon->workers[i], worker_cmd_quit);
697 for(i=1; i<daemon->num; i++) {
700 ub_thread_join(daemon->workers[i]->thr_id);
706 daemon_fork(struct daemon* daemon)
713 log_assert(daemon);
714 if(!(daemon->views = views_create()))
717 if(!views_apply_cfg(daemon->views, daemon->cfg))
720 if(!acl_list_apply_cfg(daemon->acl, daemon->cfg, daemon->views))
722 if(!acl_interface_apply_cfg(daemon->acl_interface, daemon->cfg,
723 daemon->views))
725 if(!tcl_list_apply_cfg(daemon->tcl, daemon->cfg))
727 if(daemon->cfg->dnscrypt) {
729 daemon->dnscenv = dnsc_create();
730 if (!daemon->dnscenv)
732 dnsc_apply_cfg(daemon->dnscenv, daemon->cfg);
738 if(daemon->cfg->cookie_secret_file &&
739 daemon->cfg->cookie_secret_file[0]) {
740 if(!(daemon->cookie_secrets = cookie_secrets_create()))
742 if(!cookie_secrets_apply_cfg(daemon->cookie_secrets,
743 daemon->cfg->cookie_secret_file))
747 if(!(daemon->local_zones = local_zones_create()))
749 if(!local_zones_apply_cfg(daemon->local_zones, daemon->cfg))
751 if(!(daemon->env->fwds = forwards_create()) ||
752 !forwards_apply_cfg(daemon->env->fwds, daemon->cfg))
754 if(!(daemon->env->hints = hints_create()) ||
755 !hints_apply_cfg(daemon->env->hints, daemon->cfg))
759 if(!(daemon->respip_set = respip_set_create()))
761 if(!respip_global_apply_cfg(daemon->respip_set, daemon->cfg))
763 if(!respip_views_apply_cfg(daemon->views, daemon->cfg,
766 daemon->use_response_ip = !respip_set_is_empty(daemon->respip_set) ||
770 daemon_setup_modules(daemon);
773 if(!auth_zones_apply_cfg(daemon->env->auth_zones, daemon->cfg, 1,
774 &daemon->use_rpz, daemon->env, &daemon->mods))
778 if(!edns_strings_apply_cfg(daemon->env->edns_strings, daemon->cfg))
782 daemon->env->cachedb_enabled = cachedb_is_enabled(&daemon->mods,
783 daemon->env);
788 if(daemon->use_response_ip &&
789 modstack_find(&daemon->mods, "respip") < 0)
794 if(daemon->use_rpz &&
795 modstack_find(&daemon->mods, "respip") < 0)
801 daemon_create_workers(daemon);
805 if(!worker_init(daemon->workers[0], daemon->cfg, daemon->ports[0], 1))
812 daemon_start_others(daemon);
819 if(!worker_init(daemon->workers[0], daemon->cfg, daemon->ports[0], 1))
822 signal_handling_playback(daemon->workers[0]);
824 if (!shm_main_init(daemon))
837 worker_work(daemon->workers[0]);
839 if (daemon->workers[0]->need_to_exit)
847 daemon_stop_others(daemon);
850 shm_main_shutdown(daemon);
852 daemon->reuse_cache = daemon->workers[0]->reuse_cache;
853 daemon->need_to_exit = daemon->workers[0]->need_to_exit;
857 daemon_cleanup(struct daemon* daemon)
860 log_assert(daemon);
872 if(!daemon->reuse_cache || daemon->need_to_exit) {
873 slabhash_clear(&daemon->env->rrset_cache->table);
874 slabhash_clear(daemon->env->msg_cache);
876 daemon->old_num = daemon->num; /* save the current num */
877 forwards_delete(daemon->env->fwds);
878 daemon->env->fwds = NULL;
879 hints_delete(daemon->env->hints);
880 daemon->env->hints = NULL;
881 local_zones_delete(daemon->local_zones);
882 daemon->local_zones = NULL;
883 respip_set_delete(daemon->respip_set);
884 daemon->respip_set = NULL;
885 views_delete(daemon->views);
886 daemon->views = NULL;
887 if(daemon->env->auth_zones)
888 auth_zones_cleanup(daemon->env->auth_zones);
890 daemon_remote_clear(daemon->rc);
891 for(i=0; i<daemon->num; i++)
892 worker_delete(daemon->workers[i]);
893 free(daemon->workers);
894 daemon->workers = NULL;
899 if(!daemon->reuse_cache || daemon->need_to_exit)
900 daemon_clear_allocs(daemon);
901 daemon->num = 0;
903 dt_delete(daemon->dtenv);
904 daemon->dtenv = NULL;
907 dnsc_delete(daemon->dnscenv);
908 daemon->dnscenv = NULL;
910 daemon->cfg = NULL;
914 daemon_delete(struct daemon* daemon)
917 if(!daemon)
919 modstack_call_deinit(&daemon->mods, daemon->env);
920 modstack_call_destartup(&daemon->mods, daemon->env);
921 modstack_free(&daemon->mods);
922 daemon_remote_delete(daemon->rc);
923 for(i = 0; i < daemon->num_ports; i++)
924 listening_ports_free(daemon->ports[i]);
925 free(daemon->ports);
926 listening_ports_free(daemon->rc_ports);
927 if(daemon->env) {
928 slabhash_delete(daemon->env->msg_cache);
929 rrset_cache_delete(daemon->env->rrset_cache);
930 infra_delete(daemon->env->infra_cache);
931 edns_known_options_delete(daemon->env);
932 edns_strings_delete(daemon->env->edns_strings);
933 auth_zones_delete(daemon->env->auth_zones);
935 ub_randfree(daemon->rand);
936 alloc_clear(&daemon->superalloc);
937 acl_list_delete(daemon->acl);
938 acl_list_delete(daemon->acl_interface);
939 tcl_list_delete(daemon->tcl);
940 cookie_secrets_delete(daemon->cookie_secrets);
942 free(daemon->chroot);
943 free(daemon->pidfile);
944 free(daemon->env);
947 SSL_CTX_free((SSL_CTX*)daemon->listen_sslctx);
948 SSL_CTX_free((SSL_CTX*)daemon->connect_sslctx);
950 free(daemon);
999 void daemon_apply_cfg(struct daemon* daemon, struct config_file* cfg)
1003 daemon->cfg = cfg;
1024 if(daemon->worker_allocs &&
1025 (new_num != daemon->old_num ||
1026 !slabhash_is_size(daemon->env->msg_cache, cfg->msg_cache_size,
1028 !slabhash_is_size(&daemon->env->rrset_cache->table,
1032 slabhash_clear(&daemon->env->rrset_cache->table);
1033 slabhash_clear(daemon->env->msg_cache);
1034 daemon_clear_allocs(daemon);
1037 if(!slabhash_is_size(daemon->env->msg_cache, cfg->msg_cache_size,
1039 slabhash_delete(daemon->env->msg_cache);
1040 daemon->env->msg_cache = slabhash_create(cfg->msg_cache_slabs,
1044 if(!daemon->env->msg_cache) {
1048 if((daemon->env->rrset_cache = rrset_cache_adjust(
1049 daemon->env->rrset_cache, cfg, &daemon->superalloc)) == 0)
1051 if((daemon->env->infra_cache = infra_adjust(daemon->env->infra_cache,