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"
97 #include <systemd/sd-daemon.h>
197 struct daemon*
200 struct daemon* daemon = (struct daemon*)calloc(1,
201 sizeof(struct daemon));
206 if(!daemon)
256 daemon->need_to_exit = 0;
257 modstack_init(&daemon->mods);
258 if(!(daemon->env = (struct module_env*)calloc(1,
259 sizeof(*daemon->env)))) {
260 free(daemon);
264 if(!edns_known_options_init(daemon->env)) {
265 free(daemon->env);
266 free(daemon);
269 alloc_init(&daemon->superalloc, NULL, 0);
270 daemon->acl = acl_list_create();
271 if(!daemon->acl) {
272 edns_known_options_delete(daemon->env);
273 free(daemon->env);
274 free(daemon);
277 daemon->acl_interface = acl_list_create();
278 if(!daemon->acl_interface) {
279 acl_list_delete(daemon->acl);
280 edns_known_options_delete(daemon->env);
281 free(daemon->env);
282 free(daemon);
285 daemon->tcl = tcl_list_create();
286 if(!daemon->tcl) {
287 acl_list_delete(daemon->acl_interface);
288 acl_list_delete(daemon->acl);
289 edns_known_options_delete(daemon->env);
290 free(daemon->env);
291 free(daemon);
295 if(gettimeofday(&daemon->time_boot, NULL) < 0)
297 daemon->time_last_stat = daemon->time_boot;
298 if((daemon->env->auth_zones = auth_zones_create()) == 0) {
299 acl_list_delete(daemon->acl_interface);
300 acl_list_delete(daemon->acl);
301 tcl_list_delete(daemon->tcl);
302 edns_known_options_delete(daemon->env);
303 free(daemon->env);
304 free(daemon);
307 if(!(daemon->env->edns_strings = edns_strings_create())) {
308 auth_zones_delete(daemon->env->auth_zones);
309 acl_list_delete(daemon->acl_interface);
310 acl_list_delete(daemon->acl);
311 tcl_list_delete(daemon->tcl);
312 edns_known_options_delete(daemon->env);
313 free(daemon->env);
314 free(daemon);
317 return daemon;
344 daemon_open_shared_ports(struct daemon* daemon)
346 log_assert(daemon);
347 if(daemon->cfg->port != daemon->listening_port) {
352 daemon->reuseport = 0;
354 if(daemon->ports != NULL) {
355 for(i=0; i<daemon->num_ports; i++)
356 listening_ports_free(daemon->ports[i]);
357 free(daemon->ports);
358 daemon->ports = NULL;
361 acl_interface_init(daemon->acl_interface);
362 if(!resolve_interface_names(daemon->cfg->ifs,
363 daemon->cfg->num_ifs, NULL, &resif, &num_resif))
367 if(daemon->cfg->so_reuseport && daemon->cfg->num_threads > 0)
368 daemon->reuseport = 1;
371 p0 = listening_ports_open(daemon->cfg, resif, num_resif,
372 &daemon->reuseport);
378 if(daemon->reuseport) {
380 daemon->num_ports = (size_t)daemon->cfg->num_threads;
384 daemon->num_ports = 1;
386 if(!(daemon->ports = (struct listen_port**)calloc(
387 daemon->num_ports, sizeof(*daemon->ports)))) {
392 daemon->ports[0] = p0;
393 if(!setup_acl_for_ports(daemon->acl_interface,
394 daemon->ports[0])) {
399 if(daemon->reuseport) {
401 for(i=1; i<daemon->num_ports; i++) {
402 if(!(daemon->ports[i]=
403 listening_ports_open(daemon->cfg,
405 &daemon->reuseport))
406 || !daemon->reuseport ) {
407 for(i=0; i<daemon->num_ports; i++)
408 listening_ports_free(daemon->ports[i]);
409 free(daemon->ports);
410 daemon->ports = NULL;
414 if(!setup_acl_for_ports(daemon->acl_interface,
415 daemon->ports[i])) {
416 for(i=0; i<daemon->num_ports; i++)
417 listening_ports_free(daemon->ports[i]);
418 free(daemon->ports);
419 daemon->ports = NULL;
426 daemon->listening_port = daemon->cfg->port;
428 if(!daemon->cfg->remote_control_enable && daemon->rc_port) {
429 listening_ports_free(daemon->rc_ports);
430 daemon->rc_ports = NULL;
431 daemon->rc_port = 0;
433 if(daemon->cfg->remote_control_enable &&
434 daemon->cfg->control_port != daemon->rc_port) {
435 listening_ports_free(daemon->rc_ports);
436 if(!(daemon->rc_ports=daemon_remote_open_ports(daemon->cfg)))
438 daemon->rc_port = daemon->cfg->control_port;
445 * @param daemon: the daemon
447 static void daemon_setup_modules(struct daemon* daemon)
449 daemon->env->cfg = daemon->cfg;
450 daemon->env->alloc = &daemon->superalloc;
451 daemon->env->worker = NULL;
452 daemon->env->need_to_validate = 0; /* set by module init below */
453 if(!modstack_setup(&daemon->mods, daemon->cfg->module_conf,
454 daemon->env)) {
457 log_edns_known_options(VERB_ALGO, daemon->env);
463 * @param daemon: the daemon. Uses rand and cfg.
467 static int daemon_get_shufport(struct daemon* daemon, int* shufport)
472 if(daemon->cfg->outgoing_avail_ports[i]) {
473 shufport[avail++] = daemon->cfg->
483 k = ub_random_max(daemon->rand, n+1); /* 0<= k<= n */
495 * @param daemon: the daemon that maintains the alloc caches to be cleared.
498 daemon_clear_allocs(struct daemon* daemon)
502 for(i=0; i<daemon->num; i++) {
503 alloc_clear(daemon->worker_allocs[i]);
504 free(daemon->worker_allocs[i]);
506 free(daemon->worker_allocs);
507 daemon->worker_allocs = NULL;
509 alloc_clear_special(&daemon->superalloc);
515 * Creates the daemon random generator if it does not exist yet.
517 * @param daemon: the daemon with (new) config settings.
520 daemon_create_workers(struct daemon* daemon)
524 log_assert(daemon && daemon->cfg);
525 if(!daemon->rand) {
526 daemon->rand = ub_initstate(NULL);
527 if(!daemon->rand)
529 hash_set_raninit((uint32_t)ub_random(daemon->rand));
533 fatal_exit("out of memory during daemon init");
534 numport = daemon_get_shufport(daemon, shufport);
537 daemon->num = (daemon->cfg->num_threads?daemon->cfg->num_threads:1);
538 if(daemon->reuseport && (int)daemon->num < (int)daemon->num_ports) {
540 "so continuing with %d threads.", (int)daemon->num,
541 (int)daemon->num_ports);
542 daemon->num = (int)daemon->num_ports;
544 daemon->workers = (struct worker**)calloc((size_t)daemon->num,
546 if(!daemon->workers)
547 fatal_exit("out of memory during daemon init");
548 if(daemon->cfg->dnstap) {
550 daemon->dtenv = dt_create(daemon->cfg);
551 if (!daemon->dtenv)
557 for(i=0; i<daemon->num; i++) {
558 if(!(daemon->workers[i] = worker_create(daemon, i,
559 shufport+numport*i/daemon->num,
560 numport*(i+1)/daemon->num - numport*i/daemon->num)))
565 if(!daemon->worker_allocs) {
566 daemon->worker_allocs = (struct alloc_cache**)calloc(
567 (size_t)daemon->num, sizeof(struct alloc_cache*));
568 if(!daemon->worker_allocs)
570 for(i=0; i<daemon->num; i++) {
575 alloc_init(alloc, &daemon->superalloc, i);
576 daemon->worker_allocs[i] = alloc;
585 * @param daemon: daemon to close pipes in.
588 static void close_other_pipes(struct daemon* daemon, int thr)
591 for(i=0; i<daemon->num; i++)
595 tube_close_read(daemon->workers[i]->cmd);
598 tube_delete(daemon->workers[i]->cmd);
599 daemon->workers[i]->cmd = NULL;
620 close_other_pipes(worker->daemon, worker->thread_num);
623 if(worker->daemon->cfg->so_reuseport)
624 port_num = worker->thread_num % worker->daemon->num_ports;
628 if(!worker_init(worker, worker->daemon->cfg,
629 worker->daemon->ports[port_num], 0))
638 * @param daemon: the daemon with other threads to fork.
641 daemon_start_others(struct daemon* daemon)
644 log_assert(daemon);
647 for(i=1; i<daemon->num; i++) {
648 ub_thread_create(&daemon->workers[i]->thr_id,
649 thread_start, daemon->workers[i]);
652 tube_close_read(daemon->workers[i]->cmd);
659 * @param daemon: the daemon with other threads.
662 daemon_stop_others(struct daemon* daemon)
665 log_assert(daemon);
669 for(i=1; i<daemon->num; i++) {
670 worker_send_cmd(daemon->workers[i], worker_cmd_quit);
673 for(i=1; i<daemon->num; i++) {
676 ub_thread_join(daemon->workers[i]->thr_id);
682 daemon_fork(struct daemon* daemon)
689 log_assert(daemon);
690 if(!(daemon->views = views_create()))
693 if(!views_apply_cfg(daemon->views, daemon->cfg))
696 if(!acl_list_apply_cfg(daemon->acl, daemon->cfg, daemon->views))
698 if(!acl_interface_apply_cfg(daemon->acl_interface, daemon->cfg,
699 daemon->views))
701 if(!tcl_list_apply_cfg(daemon->tcl, daemon->cfg))
703 if(daemon->cfg->dnscrypt) {
705 daemon->dnscenv = dnsc_create();
706 if (!daemon->dnscenv)
708 dnsc_apply_cfg(daemon->dnscenv, daemon->cfg);
715 if(!(daemon->local_zones = local_zones_create()))
717 if(!local_zones_apply_cfg(daemon->local_zones, daemon->cfg))
721 if(!(daemon->respip_set = respip_set_create()))
723 if(!respip_global_apply_cfg(daemon->respip_set, daemon->cfg))
725 if(!respip_views_apply_cfg(daemon->views, daemon->cfg,
728 daemon->use_response_ip = !respip_set_is_empty(daemon->respip_set) ||
732 daemon_setup_modules(daemon);
735 if(!auth_zones_apply_cfg(daemon->env->auth_zones, daemon->cfg, 1,
736 &daemon->use_rpz, daemon->env, &daemon->mods))
740 if(!edns_strings_apply_cfg(daemon->env->edns_strings, daemon->cfg))
746 if(daemon->use_response_ip &&
747 modstack_find(&daemon->mods, "respip") < 0)
752 if(daemon->use_rpz &&
753 modstack_find(&daemon->mods, "respip") < 0)
759 daemon_create_workers(daemon);
763 if(!worker_init(daemon->workers[0], daemon->cfg, daemon->ports[0], 1))
770 daemon_start_others(daemon);
777 if(!worker_init(daemon->workers[0], daemon->cfg, daemon->ports[0], 1))
780 signal_handling_playback(daemon->workers[0]);
782 if (!shm_main_init(daemon))
795 worker_work(daemon->workers[0]);
797 if (daemon->workers[0]->need_to_exit)
805 daemon_stop_others(daemon);
808 shm_main_shutdown(daemon);
810 daemon->reuse_cache = daemon->workers[0]->reuse_cache;
811 daemon->need_to_exit = daemon->workers[0]->need_to_exit;
815 daemon_cleanup(struct daemon* daemon)
818 log_assert(daemon);
830 if(!daemon->reuse_cache || daemon->need_to_exit) {
831 slabhash_clear(&daemon->env->rrset_cache->table);
832 slabhash_clear(daemon->env->msg_cache);
834 daemon->old_num = daemon->num; /* save the current num */
835 local_zones_delete(daemon->local_zones);
836 daemon->local_zones = NULL;
837 respip_set_delete(daemon->respip_set);
838 daemon->respip_set = NULL;
839 views_delete(daemon->views);
840 daemon->views = NULL;
841 if(daemon->env->auth_zones)
842 auth_zones_cleanup(daemon->env->auth_zones);
844 daemon_remote_clear(daemon->rc);
845 for(i=0; i<daemon->num; i++)
846 worker_delete(daemon->workers[i]);
847 free(daemon->workers);
848 daemon->workers = NULL;
853 if(!daemon->reuse_cache || daemon->need_to_exit)
854 daemon_clear_allocs(daemon);
855 daemon->num = 0;
857 dt_delete(daemon->dtenv);
858 daemon->dtenv = NULL;
861 dnsc_delete(daemon->dnscenv);
862 daemon->dnscenv = NULL;
864 daemon->cfg = NULL;
868 daemon_delete(struct daemon* daemon)
871 if(!daemon)
873 modstack_desetup(&daemon->mods, daemon->env);
874 daemon_remote_delete(daemon->rc);
875 for(i = 0; i < daemon->num_ports; i++)
876 listening_ports_free(daemon->ports[i]);
877 free(daemon->ports);
878 listening_ports_free(daemon->rc_ports);
879 if(daemon->env) {
880 slabhash_delete(daemon->env->msg_cache);
881 rrset_cache_delete(daemon->env->rrset_cache);
882 infra_delete(daemon->env->infra_cache);
883 edns_known_options_delete(daemon->env);
884 edns_strings_delete(daemon->env->edns_strings);
885 auth_zones_delete(daemon->env->auth_zones);
887 ub_randfree(daemon->rand);
888 alloc_clear(&daemon->superalloc);
889 acl_list_delete(daemon->acl);
890 acl_list_delete(daemon->acl_interface);
891 tcl_list_delete(daemon->tcl);
893 free(daemon->chroot);
894 free(daemon->pidfile);
895 free(daemon->env);
898 SSL_CTX_free((SSL_CTX*)daemon->listen_sslctx);
899 SSL_CTX_free((SSL_CTX*)daemon->connect_sslctx);
901 free(daemon);
950 void daemon_apply_cfg(struct daemon* daemon, struct config_file* cfg)
954 daemon->cfg = cfg;
975 if(daemon->worker_allocs &&
976 (new_num != daemon->old_num ||
977 !slabhash_is_size(daemon->env->msg_cache, cfg->msg_cache_size,
979 !slabhash_is_size(&daemon->env->rrset_cache->table,
983 slabhash_clear(&daemon->env->rrset_cache->table);
984 slabhash_clear(daemon->env->msg_cache);
985 daemon_clear_allocs(daemon);
988 if(!slabhash_is_size(daemon->env->msg_cache, cfg->msg_cache_size,
990 slabhash_delete(daemon->env->msg_cache);
991 daemon->env->msg_cache = slabhash_create(cfg->msg_cache_slabs,
995 if(!daemon->env->msg_cache) {
999 if((daemon->env->rrset_cache = rrset_cache_adjust(
1000 daemon->env->rrset_cache, cfg, &daemon->superalloc)) == 0)
1002 if((daemon->env->infra_cache = infra_adjust(daemon->env->infra_cache,