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);
562 daemon->doq_table = doq_table_create(daemon->cfg, daemon->rand);
563 if(!daemon->doq_table)
567 daemon->num = (daemon->cfg->num_threads?daemon->cfg->num_threads:1);
568 if(daemon->reuseport && (int)daemon->num < (int)daemon->num_ports) {
570 "so continuing with %d threads.", (int)daemon->num,
571 (int)daemon->num_ports);
572 daemon->num = (int)daemon->num_ports;
574 daemon->workers = (struct worker**)calloc((size_t)daemon->num,
576 if(!daemon->workers)
577 fatal_exit("out of memory during daemon init");
578 if(daemon->cfg->dnstap) {
580 daemon->dtenv = dt_create(daemon->cfg);
581 if (!daemon->dtenv)
587 for(i=0; i<daemon->num; i++) {
588 if(!(daemon->workers[i] = worker_create(daemon, i,
589 shufport+numport*i/daemon->num,
590 numport*(i+1)/daemon->num - numport*i/daemon->num)))
595 if(!daemon->worker_allocs) {
596 daemon->worker_allocs = (struct alloc_cache**)calloc(
597 (size_t)daemon->num, sizeof(struct alloc_cache*));
598 if(!daemon->worker_allocs)
600 for(i=0; i<daemon->num; i++) {
605 alloc_init(alloc, &daemon->superalloc, i);
606 daemon->worker_allocs[i] = alloc;
615 * @param daemon: daemon to close pipes in.
618 static void close_other_pipes(struct daemon* daemon, int thr)
621 for(i=0; i<daemon->num; i++)
625 tube_close_read(daemon->workers[i]->cmd);
628 tube_delete(daemon->workers[i]->cmd);
629 daemon->workers[i]->cmd = NULL;
650 close_other_pipes(worker->daemon, worker->thread_num);
653 if(worker->daemon->cfg->so_reuseport)
654 port_num = worker->thread_num % worker->daemon->num_ports;
658 if(!worker_init(worker, worker->daemon->cfg,
659 worker->daemon->ports[port_num], 0))
668 * @param daemon: the daemon with other threads to fork.
671 daemon_start_others(struct daemon* daemon)
674 log_assert(daemon);
677 for(i=1; i<daemon->num; i++) {
678 ub_thread_create(&daemon->workers[i]->thr_id,
679 thread_start, daemon->workers[i]);
682 tube_close_read(daemon->workers[i]->cmd);
689 * @param daemon: the daemon with other threads.
692 daemon_stop_others(struct daemon* daemon)
695 log_assert(daemon);
699 for(i=1; i<daemon->num; i++) {
700 worker_send_cmd(daemon->workers[i], worker_cmd_quit);
703 for(i=1; i<daemon->num; i++) {
706 ub_thread_join(daemon->workers[i]->thr_id);
712 daemon_fork(struct daemon* daemon)
719 log_assert(daemon);
720 if(!(daemon->views = views_create()))
723 if(!views_apply_cfg(daemon->views, daemon->cfg))
726 if(!acl_list_apply_cfg(daemon->acl, daemon->cfg, daemon->views))
728 if(!acl_interface_apply_cfg(daemon->acl_interface, daemon->cfg,
729 daemon->views))
731 if(!tcl_list_apply_cfg(daemon->tcl, daemon->cfg))
733 if(daemon->cfg->dnscrypt) {
735 daemon->dnscenv = dnsc_create();
736 if (!daemon->dnscenv)
738 dnsc_apply_cfg(daemon->dnscenv, daemon->cfg);
744 if(daemon->cfg->cookie_secret_file &&
745 daemon->cfg->cookie_secret_file[0]) {
746 if(!(daemon->cookie_secrets = cookie_secrets_create()))
748 if(!cookie_secrets_apply_cfg(daemon->cookie_secrets,
749 daemon->cfg->cookie_secret_file))
753 if(!(daemon->local_zones = local_zones_create()))
755 if(!local_zones_apply_cfg(daemon->local_zones, daemon->cfg))
757 if(!(daemon->env->fwds = forwards_create()) ||
758 !forwards_apply_cfg(daemon->env->fwds, daemon->cfg))
760 if(!(daemon->env->hints = hints_create()) ||
761 !hints_apply_cfg(daemon->env->hints, daemon->cfg))
765 if(!(daemon->respip_set = respip_set_create()))
767 if(!respip_global_apply_cfg(daemon->respip_set, daemon->cfg))
769 if(!respip_views_apply_cfg(daemon->views, daemon->cfg,
772 daemon->use_response_ip = !respip_set_is_empty(daemon->respip_set) ||
776 daemon_setup_modules(daemon);
779 if(!auth_zones_apply_cfg(daemon->env->auth_zones, daemon->cfg, 1,
780 &daemon->use_rpz, daemon->env, &daemon->mods))
784 if(!edns_strings_apply_cfg(daemon->env->edns_strings, daemon->cfg))
788 daemon->env->cachedb_enabled = cachedb_is_enabled(&daemon->mods,
789 daemon->env);
794 if(daemon->use_response_ip &&
795 modstack_find(&daemon->mods, "respip") < 0)
800 if(daemon->use_rpz &&
801 modstack_find(&daemon->mods, "respip") < 0)
807 daemon_create_workers(daemon);
811 if(!worker_init(daemon->workers[0], daemon->cfg, daemon->ports[0], 1))
818 daemon_start_others(daemon);
825 if(!worker_init(daemon->workers[0], daemon->cfg, daemon->ports[0], 1))
828 signal_handling_playback(daemon->workers[0]);
830 if (!shm_main_init(daemon))
843 worker_work(daemon->workers[0]);
845 if (daemon->workers[0]->need_to_exit)
853 daemon_stop_others(daemon);
856 shm_main_shutdown(daemon);
858 daemon->reuse_cache = daemon->workers[0]->reuse_cache;
859 daemon->need_to_exit = daemon->workers[0]->need_to_exit;
863 daemon_cleanup(struct daemon* daemon)
866 log_assert(daemon);
878 if(!daemon->reuse_cache || daemon->need_to_exit) {
879 slabhash_clear(&daemon->env->rrset_cache->table);
880 slabhash_clear(daemon->env->msg_cache);
882 daemon->old_num = daemon->num; /* save the current num */
883 forwards_delete(daemon->env->fwds);
884 daemon->env->fwds = NULL;
885 hints_delete(daemon->env->hints);
886 daemon->env->hints = NULL;
887 local_zones_delete(daemon->local_zones);
888 daemon->local_zones = NULL;
889 respip_set_delete(daemon->respip_set);
890 daemon->respip_set = NULL;
891 views_delete(daemon->views);
892 daemon->views = NULL;
893 if(daemon->env->auth_zones)
894 auth_zones_cleanup(daemon->env->auth_zones);
896 daemon_remote_clear(daemon->rc);
897 for(i=0; i<daemon->num; i++)
898 worker_delete(daemon->workers[i]);
899 free(daemon->workers);
900 daemon->workers = NULL;
905 if(!daemon->reuse_cache || daemon->need_to_exit)
906 daemon_clear_allocs(daemon);
907 daemon->num = 0;
909 dt_delete(daemon->dtenv);
910 daemon->dtenv = NULL;
913 dnsc_delete(daemon->dnscenv);
914 daemon->dnscenv = NULL;
917 doq_table_delete(daemon->doq_table);
918 daemon->doq_table = NULL;
920 daemon->cfg = NULL;
924 daemon_delete(struct daemon* daemon)
927 if(!daemon)
929 modstack_call_deinit(&daemon->mods, daemon->env);
930 modstack_call_destartup(&daemon->mods, daemon->env);
931 modstack_free(&daemon->mods);
932 daemon_remote_delete(daemon->rc);
933 for(i = 0; i < daemon->num_ports; i++)
934 listening_ports_free(daemon->ports[i]);
935 free(daemon->ports);
936 listening_ports_free(daemon->rc_ports);
937 if(daemon->env) {
938 slabhash_delete(daemon->env->msg_cache);
939 rrset_cache_delete(daemon->env->rrset_cache);
940 infra_delete(daemon->env->infra_cache);
941 edns_known_options_delete(daemon->env);
942 edns_strings_delete(daemon->env->edns_strings);
943 auth_zones_delete(daemon->env->auth_zones);
945 ub_randfree(daemon->rand);
946 alloc_clear(&daemon->superalloc);
947 acl_list_delete(daemon->acl);
948 acl_list_delete(daemon->acl_interface);
949 tcl_list_delete(daemon->tcl);
950 cookie_secrets_delete(daemon->cookie_secrets);
952 free(daemon->chroot);
953 free(daemon->pidfile);
954 free(daemon->env);
957 SSL_CTX_free((SSL_CTX*)daemon->listen_sslctx);
958 SSL_CTX_free((SSL_CTX*)daemon->connect_sslctx);
960 free(daemon);
1009 void daemon_apply_cfg(struct daemon* daemon, struct config_file* cfg)
1013 daemon->cfg = cfg;
1034 if(daemon->worker_allocs &&
1035 (new_num != daemon->old_num ||
1036 !slabhash_is_size(daemon->env->msg_cache, cfg->msg_cache_size,
1038 !slabhash_is_size(&daemon->env->rrset_cache->table,
1042 slabhash_clear(&daemon->env->rrset_cache->table);
1043 slabhash_clear(daemon->env->msg_cache);
1044 daemon_clear_allocs(daemon);
1047 if(!slabhash_is_size(daemon->env->msg_cache, cfg->msg_cache_size,
1049 slabhash_delete(daemon->env->msg_cache);
1050 daemon->env->msg_cache = slabhash_create(cfg->msg_cache_slabs,
1054 if(!daemon->env->msg_cache) {
1058 if((daemon->env->rrset_cache = rrset_cache_adjust(
1059 daemon->env->rrset_cache, cfg, &daemon->superalloc)) == 0)
1061 if((daemon->env->infra_cache = infra_adjust(daemon->env->infra_cache,