Lines Matching +full:pc +full:- +full:ack

2  * daemon/remote.c - remote control for the unbound daemon.
41 * unbound-control tool, or a TLS capable web browser.
105 #include "edns-subnet/subnetmod.h"
106 #include "edns-subnet/addrtree.h"
151 rc->ctx = SSL_CTX_new(SSLv23_server_method()); in remote_setup_ctx()
152 if(!rc->ctx) { in remote_setup_ctx()
156 if(!listen_sslctx_setup(rc->ctx)) { in remote_setup_ctx()
160 s_cert = fname_after_chroot(cfg->server_cert_file, cfg, 1); in remote_setup_ctx()
161 s_key = fname_after_chroot(cfg->server_key_file, cfg, 1); in remote_setup_ctx()
167 if (!SSL_CTX_use_certificate_chain_file(rc->ctx,s_cert)) { in remote_setup_ctx()
168 log_err("Error for server-cert-file: %s", s_cert); in remote_setup_ctx()
172 if(!SSL_CTX_use_PrivateKey_file(rc->ctx,s_key,SSL_FILETYPE_PEM)) { in remote_setup_ctx()
173 log_err("Error for server-key-file: %s", s_key); in remote_setup_ctx()
177 if(!SSL_CTX_check_private_key(rc->ctx)) { in remote_setup_ctx()
178 log_err("Error for server-key-file: %s", s_key); in remote_setup_ctx()
182 listen_sslctx_setup_2(rc->ctx); in remote_setup_ctx()
183 if(!SSL_CTX_load_verify_locations(rc->ctx, s_cert, NULL)) { in remote_setup_ctx()
190 SSL_CTX_set_client_CA_list(rc->ctx, SSL_load_client_CA_file(s_cert)); in remote_setup_ctx()
191 SSL_CTX_set_verify(rc->ctx, SSL_VERIFY_PEER, NULL); in remote_setup_ctx()
206 rc->max_active = 10; in daemon_remote_create()
208 if(!cfg->remote_control_enable) { in daemon_remote_create()
209 rc->ctx = NULL; in daemon_remote_create()
212 if(options_remote_is_address(cfg) && cfg->control_use_cert) { in daemon_remote_create()
217 rc->use_cert = 1; in daemon_remote_create()
220 rc->ctx = NULL; in daemon_remote_create()
221 rc->use_cert = 0; in daemon_remote_create()
223 for(p = cfg->control_ifs.first; p; p = p->next) { in daemon_remote_create()
224 if(p->str && p->str[0] != '/') in daemon_remote_create()
225 …ontrol-interface %s is not using TLS, but plain transfer, because first control-interface in confi… in daemon_remote_create()
236 listen_list_delete(rc->accept_list); in daemon_remote_clear()
237 rc->accept_list = NULL; in daemon_remote_clear()
239 p = rc->busy_list; in daemon_remote_clear()
241 np = p->next; in daemon_remote_clear()
242 if(p->ssl) in daemon_remote_clear()
243 SSL_free(p->ssl); in daemon_remote_clear()
244 comm_point_delete(p->c); in daemon_remote_clear()
248 rc->busy_list = NULL; in daemon_remote_clear()
249 rc->active = 0; in daemon_remote_clear()
250 rc->worker = NULL; in daemon_remote_clear()
257 if(rc->ctx) { in daemon_remote_delete()
258 SSL_CTX_free(rc->ctx); in daemon_remote_delete()
269 * @param cfg: config with username for chown of unix-sockets.
283 port[sizeof(port)-1]=0; in add_open()
289 fd = create_local_accept_sock(ip, &noproto, cfg->use_systemd); in add_open()
295 if(fd != -1) { in add_open()
298 if (cfg->username && cfg->username[0] && in add_open()
299 cfg_uid != (uid_t)-1) { in add_open()
300 if(chown(ip, cfg_uid, cfg_gid) == -1) in add_open()
332 cfg->ip_transparent, 0, 0, cfg->ip_freebind, in add_open()
333 cfg->use_systemd, cfg->ip_dscp, "unbound-control"); in add_open()
337 if(fd == -1 && noproto) { in add_open()
344 if(fd == -1) { in add_open()
356 n->next = *list; in add_open()
358 n->fd = fd; in add_open()
365 log_assert(cfg->remote_control_enable && cfg->control_port); in daemon_remote_open_ports()
366 if(cfg->control_ifs.first) { in daemon_remote_open_ports()
369 if(!resolve_interface_names(NULL, 0, cfg->control_ifs.first, in daemon_remote_open_ports()
374 if(!add_open(rcif[i], cfg->control_port, &l, 1, cfg)) { in daemon_remote_open_ports()
383 if(cfg->do_ip6 && in daemon_remote_open_ports()
384 !add_open("::1", cfg->control_port, &l, 0, cfg)) { in daemon_remote_open_ports()
388 if(cfg->do_ip4 && in daemon_remote_open_ports()
389 !add_open("127.0.0.1", cfg->control_port, &l, 1, cfg)) { in daemon_remote_open_ports()
406 n->next = rc->accept_list; in accept_open()
407 rc->accept_list = n; in accept_open()
409 n->com = comm_point_create_raw(rc->worker->base, fd, 0, in accept_open()
411 if(!n->com) in accept_open()
414 n->com->do_not_close = 1; in accept_open()
422 rc->worker = worker; in daemon_remote_open_accept()
423 for(p = ports; p; p = p->next) { in daemon_remote_open_accept()
424 if(!accept_open(rc, p->fd)) { in daemon_remote_open_accept()
435 for(p=rc->accept_list; p; p=p->next) { in daemon_remote_stop_accept()
436 comm_point_stop_listening(p->com); in daemon_remote_stop_accept()
443 for(p=rc->accept_list; p; p=p->next) { in daemon_remote_start_accept()
444 comm_point_start_listening(p->com, -1, -1); in daemon_remote_start_accept()
462 if(newfd == -1) in remote_accept_callback()
465 if(rc->active >= rc->max_active) { in remote_accept_callback()
478 n->fd = newfd; in remote_accept_callback()
480 n->c = comm_point_create_raw(rc->worker->base, newfd, 0, in remote_accept_callback()
482 if(!n->c) { in remote_accept_callback()
488 n->c->do_not_close = 0; in remote_accept_callback()
489 comm_point_stop_listening(n->c); in remote_accept_callback()
490 comm_point_start_listening(n->c, -1, REMOTE_CONTROL_TCP_TIMEOUT); in remote_accept_callback()
491 memcpy(&n->c->repinfo.remote_addr, &addr, addrlen); in remote_accept_callback()
492 n->c->repinfo.remote_addrlen = addrlen; in remote_accept_callback()
493 if(rc->use_cert) { in remote_accept_callback()
494 n->shake_state = rc_hs_read; in remote_accept_callback()
495 n->ssl = SSL_new(rc->ctx); in remote_accept_callback()
496 if(!n->ssl) { in remote_accept_callback()
498 comm_point_delete(n->c); in remote_accept_callback()
502 SSL_set_accept_state(n->ssl); in remote_accept_callback()
503 (void)SSL_set_mode(n->ssl, (long)SSL_MODE_AUTO_RETRY); in remote_accept_callback()
504 if(!SSL_set_fd(n->ssl, newfd)) { in remote_accept_callback()
506 SSL_free(n->ssl); in remote_accept_callback()
507 comm_point_delete(n->c); in remote_accept_callback()
512 n->ssl = NULL; in remote_accept_callback()
515 n->rc = rc; in remote_accept_callback()
516 n->next = rc->busy_list; in remote_accept_callback()
517 rc->busy_list = n; in remote_accept_callback()
518 rc->active ++; in remote_accept_callback()
522 (void)remote_control_callback(n->c, n, NETEVENT_NOERROR, NULL); in remote_accept_callback()
531 if( (*list)->c == c) { in state_list_remove_elem()
532 *list = (*list)->next; in state_list_remove_elem()
535 list = &(*list)->next; in state_list_remove_elem()
543 if(!s->rc) { in clean_point()
548 state_list_remove_elem(&rc->busy_list, s->c); in clean_point()
549 rc->active --; in clean_point()
550 if(s->ssl) { in clean_point()
551 SSL_shutdown(s->ssl); in clean_point()
552 SSL_free(s->ssl); in clean_point()
554 comm_point_delete(s->c); in clean_point()
564 if(res->ssl) { in ssl_print_text()
566 if((r=SSL_write(res->ssl, text, (int)strlen(text))) <= 0) { in ssl_print_text()
568 if((r2=SSL_get_error(res->ssl, r)) == SSL_ERROR_ZERO_RETURN) { in ssl_print_text()
579 ssize_t r = send(res->fd, text+at, strlen(text)-at, 0); in ssl_print_text()
580 if(r == -1) { in ssl_print_text()
621 if(res->ssl) { in ssl_read_line()
623 if((r=SSL_read(res->ssl, buf+len, 1)) <= 0) { in ssl_read_line()
625 if((r2=SSL_get_error(res->ssl, r)) == SSL_ERROR_ZERO_RETURN) { in ssl_read_line()
634 ssize_t rr = recv(res->fd, buf+len, 1, 0); in ssl_read_line()
656 buf[max-1] = 0; in ssl_read_line()
685 for(i=1; i<rc->worker->daemon->num; i++) { in distribute_cmd()
686 worker_send_cmd(rc->worker->daemon->workers[i], in distribute_cmd()
688 if(!tube_write_msg(rc->worker->daemon->workers[i]->cmd, in distribute_cmd()
700 worker->need_to_exit = 1; in do_stop()
701 comm_base_exit(worker->base); in do_stop()
709 worker->reuse_cache = reuse_cache; in do_reload()
710 worker->need_to_exit = 0; in do_reload()
711 comm_base_exit(worker->base); in do_reload()
793 (unsigned long)s->svr.num_queries)) return 0; in print_stats()
795 (unsigned long)s->svr.num_queries_ip_ratelimited)) return 0; in print_stats()
797 (unsigned long)s->svr.num_queries_cookie_valid)) return 0; in print_stats()
799 (unsigned long)s->svr.num_queries_cookie_client)) return 0; in print_stats()
801 (unsigned long)s->svr.num_queries_cookie_invalid)) return 0; in print_stats()
803 (unsigned long)s->svr.num_queries_discard_timeout)) return 0; in print_stats()
805 (unsigned long)s->svr.num_queries_wait_limit)) return 0; in print_stats()
807 (unsigned long)(s->svr.num_queries in print_stats()
808 - s->svr.num_queries_missed_cache))) return 0; in print_stats()
810 (unsigned long)s->svr.num_queries_missed_cache)) return 0; in print_stats()
812 (unsigned long)s->svr.num_queries_prefetch)) return 0; in print_stats()
814 (unsigned long)s->svr.num_queries_timed_out)) return 0; in print_stats()
816 (unsigned long)s->svr.max_query_time_us)) return 0; in print_stats()
818 (unsigned long)s->svr.ans_expired)) return 0; in print_stats()
820 (unsigned long)s->mesh_replies_sent)) return 0; in print_stats()
823 (unsigned long)s->svr.num_query_dnscrypt_crypted)) return 0; in print_stats()
825 (unsigned long)s->svr.num_query_dnscrypt_cert)) return 0; in print_stats()
827 (unsigned long)s->svr.num_query_dnscrypt_cleartext)) return 0; in print_stats()
829 (unsigned long)s->svr.num_query_dnscrypt_crypted_malformed)) return 0; in print_stats()
832 (unsigned long)s->svr.num_dns_error_reports)) return 0; in print_stats()
834 (s->svr.num_queries_missed_cache+s->svr.num_queries_prefetch)? in print_stats()
835 (double)s->svr.sum_query_list_size/ in print_stats()
836 (double)(s->svr.num_queries_missed_cache+ in print_stats()
837 s->svr.num_queries_prefetch) : 0.0)) return 0; in print_stats()
839 (unsigned long)s->svr.max_query_list_size)) return 0; in print_stats()
841 (unsigned long)s->mesh_jostled)) return 0; in print_stats()
843 (unsigned long)s->mesh_dropped)) return 0; in print_stats()
845 (unsigned long)s->mesh_num_states)) return 0; in print_stats()
847 (unsigned long)s->mesh_num_reply_states)) return 0; in print_stats()
849 sumwait.tv_sec = s->mesh_replies_sum_wait_sec; in print_stats()
850 sumwait.tv_usec = s->mesh_replies_sum_wait_usec; in print_stats()
852 timeval_divide(&avg, &sumwait, s->mesh_replies_sent); in print_stats()
856 s->mesh_time_median)) return 0; in print_stats()
858 (unsigned long)s->svr.tcp_accept_usage)) return 0; in print_stats()
868 nm[sizeof(nm)-1]=0; in print_thread_stats()
906 msg = slabhash_get_mem(daemon->env->msg_cache); in print_mem()
907 rrset = slabhash_get_mem(&daemon->env->rrset_cache->table); in print_mem()
908 val = mod_get_mem(&worker->env, "validator"); in print_mem()
909 iter = mod_get_mem(&worker->env, "iterator"); in print_mem()
910 respip = mod_get_mem(&worker->env, "respip"); in print_mem()
912 subnet = mod_get_mem(&worker->env, "subnetcache"); in print_mem()
915 ipsecmod = mod_get_mem(&worker->env, "ipsecmod"); in print_mem()
918 if(daemon->dnscenv) { in print_mem()
920 daemon->dnscenv->shared_secrets_cache); in print_mem()
921 dnscrypt_nonce = slabhash_get_mem(daemon->dnscenv->nonces_cache); in print_mem()
925 dynlib = mod_get_mem(&worker->env, "dynlib"); in print_mem()
959 (size_t)s->svr.mem_stream_wait)) in print_mem()
962 (size_t)s->svr.mem_http2_query_buffer)) in print_mem()
965 (size_t)s->svr.mem_http2_response_buffer)) in print_mem()
968 if(!print_longnum(ssl, "mem.quic"SQ, (size_t)s->svr.mem_quic)) in print_mem()
978 struct timeval now = *worker->env.now_tv; in print_uptime()
980 timeval_subtract(&up, &now, &worker->daemon->time_boot); in print_uptime()
981 timeval_subtract(&dt, &now, &worker->daemon->time_last_stat); in print_uptime()
983 worker->daemon->time_last_stat = now; in print_uptime()
1004 timehist_import(hist, s->svr.hist, NUM_BUCKETS_HIST); in print_hist()
1005 for(i=0; i<hist->num; i++) { in print_hist()
1008 (int)hist->buckets[i].lower.tv_sec, in print_hist()
1009 (int)hist->buckets[i].lower.tv_usec, in print_hist()
1010 (int)hist->buckets[i].upper.tv_sec, in print_hist()
1011 (int)hist->buckets[i].upper.tv_usec, in print_hist()
1012 (unsigned long)hist->buckets[i].count)) { in print_hist()
1031 if(inhibit_zero && s->svr.qtype[i] == 0) in print_ext()
1034 if(desc && desc->_name) { in print_ext()
1035 snprintf(nm, sizeof(nm), "%s", desc->_name); in print_ext()
1050 nm, (unsigned long)s->svr.qtype[i])) return 0; in print_ext()
1052 if(!inhibit_zero || s->svr.qtype_big) { in print_ext()
1054 (unsigned long)s->svr.qtype_big)) return 0; in print_ext()
1058 if(inhibit_zero && s->svr.qclass[i] == 0) in print_ext()
1061 if(lt && lt->name) { in print_ext()
1062 snprintf(nm, sizeof(nm), "%s", lt->name); in print_ext()
1067 nm, (unsigned long)s->svr.qclass[i])) return 0; in print_ext()
1069 if(!inhibit_zero || s->svr.qclass_big) { in print_ext()
1071 (unsigned long)s->svr.qclass_big)) return 0; in print_ext()
1075 if(inhibit_zero && s->svr.qopcode[i] == 0) in print_ext()
1078 if(lt && lt->name) { in print_ext()
1079 snprintf(nm, sizeof(nm), "%s", lt->name); in print_ext()
1084 nm, (unsigned long)s->svr.qopcode[i])) return 0; in print_ext()
1088 (unsigned long)s->svr.qtcp)) return 0; in print_ext()
1090 (unsigned long)s->svr.qtcp_outgoing)) return 0; in print_ext()
1092 (unsigned long)s->svr.qudp_outgoing)) return 0; in print_ext()
1094 (unsigned long)s->svr.qtls)) return 0; in print_ext()
1096 (unsigned long)s->svr.qtls_resume)) return 0; in print_ext()
1098 (unsigned long)s->svr.qipv6)) return 0; in print_ext()
1100 (unsigned long)s->svr.qhttps)) return 0; in print_ext()
1103 (unsigned long)s->svr.qquic)) return 0; in print_ext()
1107 (unsigned long)s->svr.qbit_QR)) return 0; in print_ext()
1109 (unsigned long)s->svr.qbit_AA)) return 0; in print_ext()
1111 (unsigned long)s->svr.qbit_TC)) return 0; in print_ext()
1113 (unsigned long)s->svr.qbit_RD)) return 0; in print_ext()
1115 (unsigned long)s->svr.qbit_RA)) return 0; in print_ext()
1117 (unsigned long)s->svr.qbit_Z)) return 0; in print_ext()
1119 (unsigned long)s->svr.qbit_AD)) return 0; in print_ext()
1121 (unsigned long)s->svr.qbit_CD)) return 0; in print_ext()
1123 (unsigned long)s->svr.qEDNS)) return 0; in print_ext()
1125 (unsigned long)s->svr.qEDNS_DO)) return 0; in print_ext()
1129 /* Always include RCODEs 0-5 */ in print_ext()
1130 if(inhibit_zero && i > LDNS_RCODE_REFUSED && s->svr.ans_rcode[i] == 0) in print_ext()
1133 if(lt && lt->name) { in print_ext()
1134 snprintf(nm, sizeof(nm), "%s", lt->name); in print_ext()
1139 nm, (unsigned long)s->svr.ans_rcode[i])) return 0; in print_ext()
1141 if(!inhibit_zero || s->svr.ans_rcode_nodata) { in print_ext()
1143 (unsigned long)s->svr.ans_rcode_nodata)) return 0; in print_ext()
1147 (unsigned long)s->svr.queries_ratelimited)) return 0; in print_ext()
1150 (unsigned long)s->svr.ans_secure)) return 0; in print_ext()
1152 (unsigned long)s->svr.ans_bogus)) return 0; in print_ext()
1154 (unsigned long)s->svr.rrset_bogus)) return 0; in print_ext()
1156 (unsigned long)s->svr.val_ops)) return 0; in print_ext()
1158 (unsigned long)s->svr.num_neg_cache_noerror)) return 0; in print_ext()
1160 (unsigned long)s->svr.num_neg_cache_nxdomain)) return 0; in print_ext()
1163 (unsigned long)s->svr.unwanted_queries)) return 0; in print_ext()
1165 (unsigned long)s->svr.unwanted_replies)) return 0; in print_ext()
1168 (unsigned)s->svr.msg_cache_count)) return 0; in print_ext()
1170 (unsigned)s->svr.rrset_cache_count)) return 0; in print_ext()
1172 (unsigned)s->svr.infra_cache_count)) return 0; in print_ext()
1174 (unsigned)s->svr.key_cache_count)) return 0; in print_ext()
1177 (unsigned)s->svr.msg_cache_max_collisions)) return 0; in print_ext()
1179 (unsigned)s->svr.rrset_cache_max_collisions)) return 0; in print_ext()
1184 if(inhibit_zero && s->svr.rpz_action[i] == 0) in print_ext()
1188 (unsigned long)s->svr.rpz_action[i])) return 0; in print_ext()
1192 (unsigned)s->svr.shared_secret_cache_count)) return 0; in print_ext()
1194 (unsigned)s->svr.nonce_cache_count)) return 0; in print_ext()
1196 (unsigned long)s->svr.num_query_dnscrypt_secret_missed_cache)) return 0; in print_ext()
1198 (unsigned long)s->svr.num_query_dnscrypt_replay)) return 0; in print_ext()
1201 (unsigned long)s->svr.num_query_authzone_up)) return 0; in print_ext()
1203 (unsigned long)s->svr.num_query_authzone_down)) return 0; in print_ext()
1206 (unsigned long)s->svr.num_query_subnet)) return 0; in print_ext()
1208 (unsigned long)s->svr.num_query_subnet_cache)) return 0; in print_ext()
1212 (unsigned long)s->svr.num_query_cachedb)) return 0; in print_ext()
1221 struct daemon* daemon = worker->daemon; in do_stats()
1226 log_assert(daemon->num > 0); in do_stats()
1228 for(i=0; i<daemon->num; i++) { in do_stats()
1229 server_stats_obtain(worker, daemon->workers[i], &s, reset); in do_stats()
1237 total.mesh_time_median /= (double)daemon->num; in do_stats()
1242 if(daemon->cfg->stat_extended) { in do_stats()
1247 if(!print_ext(ssl, &total, daemon->cfg->stat_inhibit_zero)) in do_stats()
1326 lock_rw_wrlock(&zones->lock); in perform_zone_add()
1330 lock_rw_wrlock(&z->lock); in perform_zone_add()
1331 z->type = t; /* update type anyway */ in perform_zone_add()
1332 lock_rw_unlock(&z->lock); in perform_zone_add()
1334 lock_rw_unlock(&zones->lock); in perform_zone_add()
1339 lock_rw_unlock(&zones->lock); in perform_zone_add()
1343 lock_rw_unlock(&zones->lock); in perform_zone_add()
1373 if(!perform_zone_add(ssl, worker->daemon->local_zones, in do_zones_add()
1394 lock_rw_wrlock(&zones->lock); in perform_zone_remove()
1400 lock_rw_unlock(&zones->lock); in perform_zone_remove()
1431 if(!perform_zone_remove(ssl, worker->daemon->local_zones, in do_zones_remove()
1455 if(!ssl_printf(ssl, "error parsing local-data at %sposition %d '%s': %s\n", in check_RR_syntax()
1505 if(perform_data_add(ssl, worker->daemon->local_zones, in do_datas_add()
1553 if(!perform_data_remove(ssl, worker->daemon->local_zones, in do_datas_remove()
1572 v = views_find_view(worker->env.views, arg, 1 /* get write lock*/); in do_view_zone_add()
1577 if(!v->local_zones) { in do_view_zone_add()
1578 if(!(v->local_zones = local_zones_create())){ in do_view_zone_add()
1579 lock_rw_unlock(&v->lock); in do_view_zone_add()
1583 if(!v->isfirst) { in do_view_zone_add()
1584 /* Global local-zone is not used for this view, in do_view_zone_add()
1585 * therefore add defaults to this view-specific in do_view_zone_add()
1586 * local-zone. */ in do_view_zone_add()
1589 local_zone_enter_defaults(v->local_zones, &lz_cfg); in do_view_zone_add()
1592 do_zone_add(ssl, v->local_zones, arg2); in do_view_zone_add()
1593 lock_rw_unlock(&v->lock); in do_view_zone_add()
1604 v = views_find_view(worker->env.views, arg, 1 /* get write lock*/); in do_view_zone_remove()
1609 if(!v->local_zones) { in do_view_zone_remove()
1610 lock_rw_unlock(&v->lock); in do_view_zone_remove()
1614 do_zone_remove(ssl, v->local_zones, arg2); in do_view_zone_remove()
1615 lock_rw_unlock(&v->lock); in do_view_zone_remove()
1626 v = views_find_view(worker->env.views, arg, 1 /* get write lock*/); in do_view_data_add()
1631 if(!v->local_zones) { in do_view_data_add()
1632 if(!(v->local_zones = local_zones_create())){ in do_view_data_add()
1633 lock_rw_unlock(&v->lock); in do_view_data_add()
1638 do_data_add(ssl, v->local_zones, arg2); in do_view_data_add()
1639 lock_rw_unlock(&v->lock); in do_view_data_add()
1651 v = views_find_view(worker->env.views, arg, 1 /* get write lock*/); in do_view_datas_add()
1656 if(!v->local_zones) { in do_view_datas_add()
1657 if(!(v->local_zones = local_zones_create())){ in do_view_datas_add()
1658 lock_rw_unlock(&v->lock); in do_view_datas_add()
1664 (void)snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "%s ", arg); in do_view_datas_add()
1677 if(perform_data_add(ssl, v->local_zones, buf+cmd_len, line)) in do_view_datas_add()
1680 lock_rw_unlock(&v->lock); in do_view_datas_add()
1692 v = views_find_view(worker->env.views, arg, 1 /* get write lock*/); in do_view_data_remove()
1697 if(!v->local_zones) { in do_view_data_remove()
1698 lock_rw_unlock(&v->lock); in do_view_data_remove()
1702 do_data_remove(ssl, v->local_zones, arg2); in do_view_data_remove()
1703 lock_rw_unlock(&v->lock); in do_view_data_remove()
1715 v = views_find_view(worker->env.views, arg, 1 /* get write lock*/); in do_view_datas_remove()
1720 if(!v->local_zones){ in do_view_datas_remove()
1721 lock_rw_unlock(&v->lock); in do_view_datas_remove()
1726 (void)snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "%s ", arg); in do_view_datas_remove()
1738 if(!perform_data_remove(ssl, v->local_zones, buf+cmd_len)) { in do_view_datas_remove()
1745 lock_rw_unlock(&v->lock); in do_view_datas_remove()
1785 sldns_wire2str_dname_buf(q->qname, q->qname_len, s, sizeof(s)); in cache_lookup_subnet_addrnode()
1786 sldns_wire2str_type_buf(q->qtype, tp, sizeof(tp)); in cache_lookup_subnet_addrnode()
1787 sldns_wire2str_class_buf(q->qclass, cl, sizeof(cl)); in cache_lookup_subnet_addrnode()
1788 sldns_wire2str_rcode_buf(FLAGS_GET_RCODE(d->flags), in cache_lookup_subnet_addrnode()
1791 ((d->flags&BIT_QR)?" QR":""), in cache_lookup_subnet_addrnode()
1792 ((d->flags&BIT_AA)?" AA":""), in cache_lookup_subnet_addrnode()
1793 ((d->flags&BIT_TC)?" TC":""), in cache_lookup_subnet_addrnode()
1794 ((d->flags&BIT_RD)?" RD":""), in cache_lookup_subnet_addrnode()
1795 ((d->flags&BIT_RA)?" RA":""), in cache_lookup_subnet_addrnode()
1796 ((d->flags&BIT_Z)?" Z":""), in cache_lookup_subnet_addrnode()
1797 ((d->flags&BIT_AD)?" AD":""), in cache_lookup_subnet_addrnode()
1798 ((d->flags&BIT_CD)?" CD":"")); in cache_lookup_subnet_addrnode()
1799 if(!rrset_array_lock(d->ref, d->rrset_count, in cache_lookup_subnet_addrnode()
1800 *inf->worker->env.now)) { in cache_lookup_subnet_addrnode()
1804 if(!ssl_printf(inf->ssl, "subnet %s/%d%s %s %s %s " ARG_LL "d\n", astr, in cache_lookup_subnet_addrnode()
1806 s, cl, tp, (long long)(ttl-*inf->worker->env.now))) { in cache_lookup_subnet_addrnode()
1807 rrset_array_unlock(d->ref, d->rrset_count); in cache_lookup_subnet_addrnode()
1810 ssl_printf(inf->ssl, in cache_lookup_subnet_addrnode()
1813 (int)d->flags, (int)d->qdcount, in cache_lookup_subnet_addrnode()
1814 (long long)(d->ttl-*inf->worker->env.now), in cache_lookup_subnet_addrnode()
1815 (int)d->security, in cache_lookup_subnet_addrnode()
1816 (unsigned)d->an_numrrsets, in cache_lookup_subnet_addrnode()
1817 (unsigned)d->ns_numrrsets, in cache_lookup_subnet_addrnode()
1818 (unsigned)d->ar_numrrsets, in cache_lookup_subnet_addrnode()
1819 (int)d->reason_bogus, in cache_lookup_subnet_addrnode()
1820 d->reason_bogus_str?d->reason_bogus_str:""); in cache_lookup_subnet_addrnode()
1821 for(i=0; i<d->rrset_count; i++) { in cache_lookup_subnet_addrnode()
1822 struct ub_packed_rrset_key* rk = d->rrsets[i]; in cache_lookup_subnet_addrnode()
1823 struct packed_rrset_data* rd = (struct packed_rrset_data*)rk->entry.data; in cache_lookup_subnet_addrnode()
1825 for(j=0; j<rd->count + rd->rrsig_count; j++) { in cache_lookup_subnet_addrnode()
1827 *inf->worker->env.now, s, sizeof(s))) { in cache_lookup_subnet_addrnode()
1828 ssl_printf(inf->ssl, "BADRR\n"); in cache_lookup_subnet_addrnode()
1830 ssl_printf(inf->ssl, "%s", s); in cache_lookup_subnet_addrnode()
1834 rrset_array_unlock(d->ref, d->rrset_count); in cache_lookup_subnet_addrnode()
1835 ssl_printf(inf->ssl, "\n"); in cache_lookup_subnet_addrnode()
1847 if(!edge || !edge->node) in addrtree_traverse_visit_edge()
1849 addrlen = edge->len; in addrtree_traverse_visit_edge()
1855 memcpy(addr, edge->str, n); in addrtree_traverse_visit_edge()
1856 addrtree_traverse_visit_node(edge->node, addr, addr_size, is_ipv6, in addrtree_traverse_visit_edge()
1868 if(n->elem && n->ttl >= now) { in addrtree_traverse_visit_node()
1869 func(q, (struct reply_info*)n->elem, addr, addr_size, is_ipv6, in addrtree_traverse_visit_node()
1870 n->scope, n->only_match_scope_zero, n->ttl, arg); in addrtree_traverse_visit_node()
1873 addrtree_traverse_visit_edge(n->edge[0], addr, addr_size, is_ipv6, in addrtree_traverse_visit_node()
1875 addrtree_traverse_visit_edge(n->edge[1], addr, addr_size, is_ipv6, in addrtree_traverse_visit_node()
1888 addrtree_traverse_visit_node(tree->root, (addrkey_t*)addr, in addrtree_traverse()
1897 struct msgreply_entry *k = (struct msgreply_entry*)e->key; in cache_lookup_subnet_msg()
1899 (struct subnet_msg_cache_data*)e->data; in cache_lookup_subnet_msg()
1900 if(!dname_subdomain_c(k->key.qname, inf->nm)) in cache_lookup_subnet_msg()
1903 if(d->tree4) { in cache_lookup_subnet_msg()
1904 addrtree_traverse(d->tree4, 0, *inf->worker->env.now, &k->key, in cache_lookup_subnet_msg()
1907 if(d->tree6) { in cache_lookup_subnet_msg()
1908 addrtree_traverse(d->tree6, 1, *inf->worker->env.now, &k->key, in cache_lookup_subnet_msg()
1918 struct ub_packed_rrset_key* k = (struct ub_packed_rrset_key*)e->key; in cache_lookup_rrset()
1919 struct packed_rrset_data* d = (struct packed_rrset_data*)e->data; in cache_lookup_rrset()
1920 if(*inf->worker->env.now < d->ttl && in cache_lookup_rrset()
1921 k->id != 0 && /* not deleted */ in cache_lookup_rrset()
1922 dname_subdomain_c(k->rk.dname, inf->nm)) { in cache_lookup_rrset()
1924 for(i=0; i<d->count + d->rrsig_count; i++) { in cache_lookup_rrset()
1926 if(!packed_rr_to_string(k, i, *inf->worker->env.now, in cache_lookup_rrset()
1928 ssl_printf(inf->ssl, "BADRR\n"); in cache_lookup_rrset()
1931 ssl_printf(inf->ssl, "%s", s); in cache_lookup_rrset()
1933 ssl_printf(inf->ssl, "\n"); in cache_lookup_rrset()
1941 struct msgreply_entry* k = (struct msgreply_entry*)e->key; in cache_lookup_msg()
1942 struct reply_info* d = (struct reply_info*)e->data; in cache_lookup_msg()
1943 if(*inf->worker->env.now < d->ttl && in cache_lookup_msg()
1944 dname_subdomain_c(k->key.qname, inf->nm)) { in cache_lookup_msg()
1947 sldns_wire2str_dname_buf(k->key.qname, k->key.qname_len, in cache_lookup_msg()
1949 sldns_wire2str_type_buf(k->key.qtype, tp, sizeof(tp)); in cache_lookup_msg()
1950 sldns_wire2str_class_buf(k->key.qclass, cl, sizeof(cl)); in cache_lookup_msg()
1951 sldns_wire2str_rcode_buf(FLAGS_GET_RCODE(d->flags), in cache_lookup_msg()
1954 ((d->flags&BIT_QR)?" QR":""), in cache_lookup_msg()
1955 ((d->flags&BIT_AA)?" AA":""), in cache_lookup_msg()
1956 ((d->flags&BIT_TC)?" TC":""), in cache_lookup_msg()
1957 ((d->flags&BIT_RD)?" RD":""), in cache_lookup_msg()
1958 ((d->flags&BIT_RA)?" RA":""), in cache_lookup_msg()
1959 ((d->flags&BIT_Z)?" Z":""), in cache_lookup_msg()
1960 ((d->flags&BIT_AD)?" AD":""), in cache_lookup_msg()
1961 ((d->flags&BIT_CD)?" CD":"")); in cache_lookup_msg()
1962 if(!rrset_array_lock(d->ref, d->rrset_count, in cache_lookup_msg()
1963 *inf->worker->env.now)) { in cache_lookup_msg()
1967 ssl_printf(inf->ssl, in cache_lookup_msg()
1970 (int)d->flags, (int)d->qdcount, in cache_lookup_msg()
1971 (long long)(d->ttl-*inf->worker->env.now), in cache_lookup_msg()
1972 (int)d->security, in cache_lookup_msg()
1973 (unsigned)d->an_numrrsets, in cache_lookup_msg()
1974 (unsigned)d->ns_numrrsets, in cache_lookup_msg()
1975 (unsigned)d->ar_numrrsets, in cache_lookup_msg()
1976 (int)d->reason_bogus, in cache_lookup_msg()
1977 d->reason_bogus_str?d->reason_bogus_str:""); in cache_lookup_msg()
1978 for(i=0; i<d->rrset_count; i++) { in cache_lookup_msg()
1979 struct ub_packed_rrset_key* rk = d->rrsets[i]; in cache_lookup_msg()
1980 struct packed_rrset_data* rd = (struct packed_rrset_data*)rk->entry.data; in cache_lookup_msg()
1982 for(j=0; j<rd->count + rd->rrsig_count; j++) { in cache_lookup_msg()
1984 *inf->worker->env.now, s, sizeof(s))) { in cache_lookup_msg()
1985 rrset_array_unlock(d->ref, d->rrset_count); in cache_lookup_msg()
1986 ssl_printf(inf->ssl, "BADRR\n"); in cache_lookup_msg()
1989 ssl_printf(inf->ssl, "%s", s); in cache_lookup_msg()
1992 rrset_array_unlock(d->ref, d->rrset_count); in cache_lookup_msg()
1993 ssl_printf(inf->ssl, "\n"); in cache_lookup_msg()
2013 m = modstack_find(worker->env.modstack, "subnetcache"); in do_cache_lookup_domain()
2014 if(m != -1) sn_env = (struct subnet_env*)worker->env.modinfo[m]; in do_cache_lookup_domain()
2016 lock_rw_rdlock(&sn_env->biglock); in do_cache_lookup_domain()
2017 slabhash_traverse(sn_env->subnet_msg_cache, 0, in do_cache_lookup_domain()
2019 lock_rw_unlock(&sn_env->biglock); in do_cache_lookup_domain()
2023 slabhash_traverse(&worker->env.rrset_cache->table, 0, in do_cache_lookup_domain()
2025 slabhash_traverse(worker->env.msg_cache, 0, &cache_lookup_msg, &inf); in do_cache_lookup_domain()
2097 rrset_cache_remove(worker->env.rrset_cache, nm, nmlen, t, c, 0); in do_cache_remove()
2099 rrset_cache_remove(worker->env.rrset_cache, nm, nmlen, t, c, in do_cache_remove()
2107 slabhash_remove(worker->env.msg_cache, h, &k); in do_cache_remove()
2111 slabhash_remove(worker->env.msg_cache, h, &k); in do_cache_remove()
2114 if(remcachedb && worker->env.cachedb_enabled) in do_cache_remove()
2115 cachedb_msg_remove_qinfo(&worker->env, &k); in do_cache_remove()
2123 parse_remcachedb(RES* ssl, char** arg, int* pc) in parse_remcachedb() argument
2128 *pc = 1; in parse_remcachedb()
2147 int pc = 0; /* '+c' option */ in do_flush_type() local
2148 if(!parse_remcachedb(ssl, &arg, &pc)) in do_flush_type()
2160 do_cache_remove(worker, nm, nmlen, t, LDNS_RR_CLASS_IN, pc); in do_flush_type()
2208 struct infra_key* k = (struct infra_key*)e->key; in infra_del_host()
2209 if(sockaddr_cmp(&inf->addr, inf->addrlen, &k->addr, k->addrlen) == 0) { in infra_del_host()
2210 struct infra_data* d = (struct infra_data*)e->data; in infra_del_host()
2211 d->probedelay = 0; in infra_del_host()
2212 d->timeout_A = 0; in infra_del_host()
2213 d->timeout_AAAA = 0; in infra_del_host()
2214 d->timeout_other = 0; in infra_del_host()
2215 rtt_init(&d->rtt); in infra_del_host()
2216 if(d->ttl > inf->expired) { in infra_del_host()
2217 d->ttl = inf->expired; in infra_del_host()
2218 inf->num_keys++; in infra_del_host()
2231 slabhash_clear(worker->env.infra_cache->hosts); in do_flush_infra()
2245 inf.expired = *worker->env.now; in do_flush_infra()
2246 inf.expired -= 3; /* handle 3 seconds skew between threads */ in do_flush_infra()
2253 slabhash_traverse(worker->env.infra_cache->hosts, 1, &infra_del_host, in do_flush_infra()
2262 mesh_delete_all(worker->env.mesh); in do_flush_requestlist()
2272 struct ub_packed_rrset_key* k = (struct ub_packed_rrset_key*)e->key; in zone_del_rrset()
2273 if(dname_subdomain_c(k->rk.dname, inf->name)) { in zone_del_rrset()
2275 (struct packed_rrset_data*)e->data; in zone_del_rrset()
2276 if(d->ttl > inf->expired) { in zone_del_rrset()
2277 d->ttl = inf->expired; in zone_del_rrset()
2278 inf->num_rrsets++; in zone_del_rrset()
2289 struct msgreply_entry* k = (struct msgreply_entry*)e->key; in zone_del_msg()
2290 if(dname_subdomain_c(k->key.qname, inf->name)) { in zone_del_msg()
2291 struct reply_info* d = (struct reply_info*)e->data; in zone_del_msg()
2292 if(d->ttl > inf->expired) { in zone_del_msg()
2293 d->ttl = inf->expired; in zone_del_msg()
2294 d->prefetch_ttl = inf->expired; in zone_del_msg()
2295 d->serve_expired_ttl = inf->expired; in zone_del_msg()
2296 inf->num_msgs++; in zone_del_msg()
2299 if(inf->remcachedb && inf->worker->env.cachedb_enabled) in zone_del_msg()
2300 cachedb_msg_remove_qinfo(&inf->worker->env, &k->key); in zone_del_msg()
2311 struct key_entry_key* k = (struct key_entry_key*)e->key; in zone_del_kcache()
2312 if(dname_subdomain_c(k->name, inf->name)) { in zone_del_kcache()
2313 struct key_entry_data* d = (struct key_entry_data*)e->data; in zone_del_kcache()
2314 if(d->ttl > inf->expired) { in zone_del_kcache()
2315 d->ttl = inf->expired; in zone_del_kcache()
2316 inf->num_keys++; in zone_del_kcache()
2329 int pc = 0; /* '+c' option */ in do_flush_zone() local
2330 if(!parse_remcachedb(ssl, &arg, &pc)) in do_flush_zone()
2340 inf.expired = *worker->env.now; in do_flush_zone()
2341 inf.expired -= 3; /* handle 3 seconds skew between threads */ in do_flush_zone()
2345 inf.remcachedb = pc; in do_flush_zone()
2346 slabhash_traverse(&worker->env.rrset_cache->table, 1, in do_flush_zone()
2349 slabhash_traverse(worker->env.msg_cache, 1, &zone_del_msg, &inf); in do_flush_zone()
2352 if(worker->env.key_cache) { in do_flush_zone()
2353 slabhash_traverse(worker->env.key_cache->slab, 1, in do_flush_zone()
2370 struct packed_rrset_data* d = (struct packed_rrset_data*)e->data; in bogus_del_rrset()
2371 if(d->security == sec_status_bogus && d->ttl > inf->expired) { in bogus_del_rrset()
2372 d->ttl = inf->expired; in bogus_del_rrset()
2373 inf->num_rrsets++; in bogus_del_rrset()
2383 struct reply_info* d = (struct reply_info*)e->data; in bogus_del_msg()
2384 if(d->security == sec_status_bogus && d->ttl > inf->expired) { in bogus_del_msg()
2385 d->ttl = inf->expired; in bogus_del_msg()
2386 d->prefetch_ttl = inf->expired; in bogus_del_msg()
2387 d->serve_expired_ttl = inf->expired; in bogus_del_msg()
2388 inf->num_msgs++; in bogus_del_msg()
2390 if(inf->remcachedb && inf->worker->env.cachedb_enabled) in bogus_del_msg()
2391 cachedb_msg_remove_qinfo(&inf->worker->env, in bogus_del_msg()
2392 &((struct msgreply_entry*)e->key)->key); in bogus_del_msg()
2403 struct key_entry_data* d = (struct key_entry_data*)e->data; in bogus_del_kcache()
2404 if(d->isbad && d->ttl > inf->expired) { in bogus_del_kcache()
2405 d->ttl = inf->expired; in bogus_del_kcache()
2406 inf->num_keys++; in bogus_del_kcache()
2415 int pc = 0; /* '+c' option */ in do_flush_bogus() local
2416 if(!parse_remcachedb(ssl, &arg, &pc)) in do_flush_bogus()
2420 inf.expired = *worker->env.now; in do_flush_bogus()
2421 inf.expired -= 3; /* handle 3 seconds skew between threads */ in do_flush_bogus()
2425 inf.remcachedb = pc; in do_flush_bogus()
2426 slabhash_traverse(&worker->env.rrset_cache->table, 1, in do_flush_bogus()
2429 slabhash_traverse(worker->env.msg_cache, 1, &bogus_del_msg, &inf); in do_flush_bogus()
2432 if(worker->env.key_cache) { in do_flush_bogus()
2433 slabhash_traverse(worker->env.key_cache->slab, 1, in do_flush_bogus()
2448 struct ub_packed_rrset_key* k = (struct ub_packed_rrset_key*)e->key; in negative_del_rrset()
2449 struct packed_rrset_data* d = (struct packed_rrset_data*)e->data; in negative_del_rrset()
2452 if((k->rk.flags & PACKED_RRSET_PARENT_SIDE) && d->count == 1 && in negative_del_rrset()
2453 d->rrsig_count == 0 && d->rr_len[0] == 0 && in negative_del_rrset()
2454 d->ttl > inf->expired) { in negative_del_rrset()
2455 d->ttl = inf->expired; in negative_del_rrset()
2456 inf->num_rrsets++; in negative_del_rrset()
2466 struct reply_info* d = (struct reply_info*)e->data; in negative_del_msg()
2469 if((FLAGS_GET_RCODE(d->flags) != 0 || d->an_numrrsets == 0) && in negative_del_msg()
2470 d->ttl > inf->expired) { in negative_del_msg()
2471 d->ttl = inf->expired; in negative_del_msg()
2472 d->prefetch_ttl = inf->expired; in negative_del_msg()
2473 d->serve_expired_ttl = inf->expired; in negative_del_msg()
2474 inf->num_msgs++; in negative_del_msg()
2476 if(inf->remcachedb && inf->worker->env.cachedb_enabled) in negative_del_msg()
2477 cachedb_msg_remove_qinfo(&inf->worker->env, in negative_del_msg()
2478 &((struct msgreply_entry*)e->key)->key); in negative_del_msg()
2489 struct key_entry_data* d = (struct key_entry_data*)e->data; in negative_del_kcache()
2492 if(d->isbad && d->ttl > inf->expired) { in negative_del_kcache()
2493 d->ttl = inf->expired; in negative_del_kcache()
2494 inf->num_keys++; in negative_del_kcache()
2503 int pc = 0; /* '+c' option */ in do_flush_negative() local
2504 if(!parse_remcachedb(ssl, &arg, &pc)) in do_flush_negative()
2508 inf.expired = *worker->env.now; in do_flush_negative()
2509 inf.expired -= 3; /* handle 3 seconds skew between threads */ in do_flush_negative()
2513 inf.remcachedb = pc; in do_flush_negative()
2514 slabhash_traverse(&worker->env.rrset_cache->table, 1, in do_flush_negative()
2517 slabhash_traverse(worker->env.msg_cache, 1, &negative_del_msg, &inf); in do_flush_negative()
2520 if(worker->env.key_cache) { in do_flush_negative()
2521 slabhash_traverse(worker->env.key_cache->slab, 1, in do_flush_negative()
2537 int pc = 0; /* '+c' option */ in do_flush_name() local
2538 if(!parse_remcachedb(ssl, &arg, &pc)) in do_flush_name()
2542 do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_A, LDNS_RR_CLASS_IN, pc); in do_flush_name()
2543 do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_AAAA, LDNS_RR_CLASS_IN, pc); in do_flush_name()
2544 do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_NS, LDNS_RR_CLASS_IN, pc); in do_flush_name()
2545 do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_SOA, LDNS_RR_CLASS_IN, pc); in do_flush_name()
2546 do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_CNAME, LDNS_RR_CLASS_IN, pc); in do_flush_name()
2547 do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_DNAME, LDNS_RR_CLASS_IN, pc); in do_flush_name()
2548 do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_MX, LDNS_RR_CLASS_IN, pc); in do_flush_name()
2549 do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_PTR, LDNS_RR_CLASS_IN, pc); in do_flush_name()
2550 do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_SRV, LDNS_RR_CLASS_IN, pc); in do_flush_name()
2551 do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_NAPTR, LDNS_RR_CLASS_IN, pc); in do_flush_name()
2552 do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_SVCB, LDNS_RR_CLASS_IN, pc); in do_flush_name()
2553 do_cache_remove(w, nm, nmlen, LDNS_RR_TYPE_HTTPS, LDNS_RR_CLASS_IN, pc); in do_flush_name()
2577 for(ns = dp->nslist; ns; ns = ns->next) { in ssl_print_name_dp()
2578 dname_str(ns->name, buf); in ssl_print_name_dp()
2583 for(a = dp->target_list; a; a = a->next_target) { in ssl_print_name_dp()
2584 addr_to_str(&a->addr, a->addrlen, buf, sizeof(buf)); in ssl_print_name_dp()
2604 log_assert(query_dname_compare(dp->name, root)==0); in print_root_fwds()
2606 lock_rw_unlock(&fwds->lock); in print_root_fwds()
2609 lock_rw_unlock(&fwds->lock); in print_root_fwds()
2665 auth_name, -1)) { in parse_delegpt()
2672 dp->has_parent_side_NS = 1; in parse_delegpt()
2680 struct iter_forwards* fwd = worker->env.fwds; in do_forward()
2694 mesh_delete_all(worker->env.mesh); in do_forward()
2717 /* parse all -x args */ in parse_fs_args()
2759 struct iter_forwards* fwd = worker->env.fwds; in do_forward_add()
2767 dp->ssl_upstream = 1; in do_forward_add()
2769 lock_rw_wrlock(&fwd->lock); in do_forward_add()
2770 if(insecure && worker->env.anchors) { in do_forward_add()
2771 if(!anchors_add_insecure(worker->env.anchors, LDNS_RR_CLASS_IN, in do_forward_add()
2773 lock_rw_unlock(&fwd->lock); in do_forward_add()
2781 lock_rw_unlock(&fwd->lock); in do_forward_add()
2786 lock_rw_unlock(&fwd->lock); in do_forward_add()
2795 struct iter_forwards* fwd = worker->env.fwds; in do_forward_remove()
2802 lock_rw_wrlock(&fwd->lock); in do_forward_remove()
2803 if(insecure && worker->env.anchors) in do_forward_remove()
2804 anchors_delete_insecure(worker->env.anchors, LDNS_RR_CLASS_IN, in do_forward_remove()
2807 lock_rw_unlock(&fwd->lock); in do_forward_remove()
2816 struct iter_forwards* fwd = worker->env.fwds; in do_stub_add()
2824 dp->ssl_upstream = 1; in do_stub_add()
2826 lock_rw_wrlock(&fwd->lock); in do_stub_add()
2827 lock_rw_wrlock(&worker->env.hints->lock); in do_stub_add()
2828 if(insecure && worker->env.anchors) { in do_stub_add()
2829 if(!anchors_add_insecure(worker->env.anchors, LDNS_RR_CLASS_IN, in do_stub_add()
2831 lock_rw_unlock(&fwd->lock); in do_stub_add()
2832 lock_rw_unlock(&worker->env.hints->lock); in do_stub_add()
2840 if(insecure && worker->env.anchors) in do_stub_add()
2841 anchors_delete_insecure(worker->env.anchors, in do_stub_add()
2843 lock_rw_unlock(&fwd->lock); in do_stub_add()
2844 lock_rw_unlock(&worker->env.hints->lock); in do_stub_add()
2850 if(!hints_add_stub(worker->env.hints, LDNS_RR_CLASS_IN, dp, !prime, in do_stub_add()
2854 if(insecure && worker->env.anchors) in do_stub_add()
2855 anchors_delete_insecure(worker->env.anchors, in do_stub_add()
2857 lock_rw_unlock(&fwd->lock); in do_stub_add()
2858 lock_rw_unlock(&worker->env.hints->lock); in do_stub_add()
2862 lock_rw_unlock(&fwd->lock); in do_stub_add()
2863 lock_rw_unlock(&worker->env.hints->lock); in do_stub_add()
2872 struct iter_forwards* fwd = worker->env.fwds; in do_stub_remove()
2879 lock_rw_wrlock(&fwd->lock); in do_stub_remove()
2880 lock_rw_wrlock(&worker->env.hints->lock); in do_stub_remove()
2881 if(insecure && worker->env.anchors) in do_stub_remove()
2882 anchors_delete_insecure(worker->env.anchors, LDNS_RR_CLASS_IN, in do_stub_remove()
2885 hints_delete_stub(worker->env.hints, LDNS_RR_CLASS_IN, nm, nolock); in do_stub_remove()
2886 lock_rw_unlock(&fwd->lock); in do_stub_remove()
2887 lock_rw_unlock(&worker->env.hints->lock); in do_stub_remove()
2901 if(worker->env.anchors) { in do_insecure_add()
2902 if(!anchors_add_insecure(worker->env.anchors, in do_insecure_add()
2922 if(worker->env.anchors) in do_insecure_remove()
2923 anchors_delete_insecure(worker->env.anchors, in do_insecure_remove()
2934 if(worker->env.anchors) { in do_insecure_list()
2935 RBTREE_FOR(a, struct trust_anchor*, worker->env.anchors->tree) { in do_insecure_list()
2936 if(a->numDS == 0 && a->numDNSKEY == 0) { in do_insecure_list()
2937 dname_str(a->name, buf); in do_insecure_list()
2954 if(!ssl_printf(ssl, "threads: %d\n", worker->daemon->num)) in do_status()
2956 if(!ssl_printf(ssl, "modules: %d [", worker->daemon->mods.num)) in do_status()
2958 for(i=0; i<worker->daemon->mods.num; i++) { in do_status()
2959 if(!ssl_printf(ssl, " %s", worker->daemon->mods.mod[i]->name)) in do_status()
2964 uptime = (time_t)time(NULL) - (time_t)worker->daemon->time_boot.tv_sec; in do_status()
2968 (worker->daemon->reuseport?" reuseport":""), in do_status()
2969 (worker->daemon->rc->accept_list?" control":""), in do_status()
2970 (worker->daemon->rc->accept_list && worker->daemon->rc->use_cert?"(ssl)":""), in do_status()
2971->daemon->rc->accept_list && worker->daemon->cfg->control_ifs.first && worker->daemon->cfg->contro… in do_status()
2984 if(m->reply_list) { in get_mesh_age()
2986 struct mesh_reply* r = m->reply_list; in get_mesh_age()
2988 while(r && r->next) in get_mesh_age()
2989 r = r->next; in get_mesh_age()
2990 timeval_subtract(&d, env->now_tv, &r->start_time); in get_mesh_age()
2994 snprintf(buf, len, "-"); in get_mesh_age()
3003 enum module_ext_state s = m->s.ext_state[m->s.curmod]; in get_mesh_status()
3004 const char *modname = mesh->mods.mod[m->s.curmod]->name; in get_mesh_status()
3007 m->s.minfo[m->s.curmod]) { in get_mesh_status()
3010 m->s.minfo[m->s.curmod]; in get_mesh_status()
3011 struct outbound_list* ol = &qstate->outlist; in get_mesh_status()
3015 buf += l; len -= l; in get_mesh_status()
3016 if(ol->first == NULL) in get_mesh_status()
3018 for(e = ol->first; e; e = e->next) { in get_mesh_status()
3021 buf += l; len -= l; in get_mesh_status()
3022 addr_to_str(&e->qsent->addr, e->qsent->addrlen, in get_mesh_status()
3025 buf += l; len -= l; in get_mesh_status()
3033 buf += l; len -= l; in get_mesh_status()
3034 if(m->sub_set.count == 0) in get_mesh_status()
3036 RBTREE_FOR(sub, struct mesh_state_ref*, &m->sub_set) { in get_mesh_status()
3037 char* t = sldns_wire2str_type(sub->s->s.qinfo.qtype); in get_mesh_status()
3038 char* c = sldns_wire2str_class(sub->s->s.qinfo.qclass); in get_mesh_status()
3039 dname_str(sub->s->s.qinfo.qname, nm); in get_mesh_status()
3043 buf += l; len -= l; in get_mesh_status()
3062 if(!ssl_printf(ssl, "thread #%d\n", worker->thread_num)) in do_dump_requestlist()
3067 mesh = worker->env.mesh; in do_dump_requestlist()
3069 RBTREE_FOR(m, struct mesh_state*, &mesh->all) { in do_dump_requestlist()
3070 char* t = sldns_wire2str_type(m->s.qinfo.qtype); in do_dump_requestlist()
3071 char* c = sldns_wire2str_class(m->s.qinfo.qclass); in do_dump_requestlist()
3072 dname_str(m->s.qinfo.qname, buf); in do_dump_requestlist()
3073 get_mesh_age(m, timebuf, sizeof(timebuf), &worker->env); in do_dump_requestlist()
3106 struct infra_key* k = (struct infra_key*)e->key; in dump_infra_host()
3107 struct infra_data* d = (struct infra_data*)e->data; in dump_infra_host()
3111 if(a->ssl_failed) in dump_infra_host()
3113 addr_to_str(&k->addr, k->addrlen, ip_str, sizeof(ip_str)); in dump_infra_host()
3114 dname_str(k->zonename, name); in dump_infra_host()
3115 port = (int)ntohs(((struct sockaddr_in*)&k->addr)->sin_port); in dump_infra_host()
3117 snprintf(ip_str+strlen(ip_str), sizeof(ip_str)-strlen(ip_str), in dump_infra_host()
3121 if(d->ttl < a->now) { in dump_infra_host()
3122 if(d->rtt.rto >= USEFUL_SERVER_TOP_TIMEOUT) { in dump_infra_host()
3123 if(!ssl_printf(a->ssl, "%s %s expired rto %d\n", ip_str, in dump_infra_host()
3124 name, d->rtt.rto)) { in dump_infra_host()
3125 a->ssl_failed = 1; in dump_infra_host()
3131 if(!ssl_printf(a->ssl, "%s %s ttl %lu ping %d var %d rtt %d rto %d " in dump_infra_host()
3134 "other %d\n", ip_str, name, (unsigned long)(d->ttl - a->now), in dump_infra_host()
3135 d->rtt.srtt, d->rtt.rttvar, rtt_notimeout(&d->rtt), d->rtt.rto, in dump_infra_host()
3136 d->timeout_A, d->timeout_AAAA, d->timeout_other, in dump_infra_host()
3137 (int)d->edns_lame_known, (int)d->edns_version, in dump_infra_host()
3138 (int)(a->now<d->probedelay?(d->probedelay - a->now):0), in dump_infra_host()
3139 (int)d->isdnsseclame, (int)d->rec_lame, (int)d->lame_type_A, in dump_infra_host()
3140 (int)d->lame_other)) { in dump_infra_host()
3141 a->ssl_failed = 1; in dump_infra_host()
3151 arg.infra = worker->env.infra_cache; in do_dump_infra()
3153 arg.now = *worker->env.now; in do_dump_infra()
3155 slabhash_traverse(arg.infra->hosts, 0, &dump_infra_host, (void*)&arg); in do_dump_infra()
3162 struct config_file* cfg = worker->env.cfg; in do_log_reopen()
3164 log_init(cfg->logfile, cfg->use_syslog, cfg->chrootdir); in do_log_reopen()
3174 struct auth_zones* az = worker->env.auth_zones; in do_auth_zone_reload()
3181 lock_rw_rdlock(&az->lock); in do_auth_zone_reload()
3184 lock_rw_wrlock(&z->lock); in do_auth_zone_reload()
3188 lock_basic_lock(&xfr->lock); in do_auth_zone_reload()
3190 lock_rw_unlock(&az->lock); in do_auth_zone_reload()
3195 lock_basic_unlock(&xfr->lock); in do_auth_zone_reload()
3197 (void)ssl_printf(ssl, "error no auth-zone %s\n", arg); in do_auth_zone_reload()
3200 if(!auth_zone_read_zonefile(z, worker->env.cfg)) { in do_auth_zone_reload()
3201 lock_rw_unlock(&z->lock); in do_auth_zone_reload()
3203 lock_basic_unlock(&xfr->lock); in do_auth_zone_reload()
3209 z->zone_expired = 0; in do_auth_zone_reload()
3211 xfr->zone_expired = 0; in do_auth_zone_reload()
3213 if(z->data.count == 0) { in do_auth_zone_reload()
3214 lock_rw_unlock(&z->lock); in do_auth_zone_reload()
3215 lock_basic_unlock(&xfr->lock); in do_auth_zone_reload()
3219 lock_rw_unlock(&z->lock); in do_auth_zone_reload()
3220 lock_basic_unlock(&xfr->lock); in do_auth_zone_reload()
3224 if(xfr->have_zone) { in do_auth_zone_reload()
3225 xfr->lease_time = *worker->env.now; in do_auth_zone_reload()
3226 xfr->soa_zone_acquired = *worker->env.now; in do_auth_zone_reload()
3228 lock_basic_unlock(&xfr->lock); in do_auth_zone_reload()
3230 z->soa_zone_acquired = *worker->env.now; in do_auth_zone_reload()
3232 auth_zone_verify_zonemd(z, &worker->env, &worker->env.mesh->mods, in do_auth_zone_reload()
3234 if(reason && z->zone_expired) { in do_auth_zone_reload()
3235 lock_rw_unlock(&z->lock); in do_auth_zone_reload()
3244 lock_rw_unlock(&z->lock); in do_auth_zone_reload()
3256 struct auth_zones* az = worker->env.auth_zones; in do_auth_zone_transfer()
3259 if(!az || !auth_zones_startprobesequence(az, &worker->env, nm, nmlen, in do_auth_zone_transfer()
3276 if(!config_set_option(worker->env.cfg, arg, arg2)) { in do_set_option()
3281 if(strcmp(arg, "val-override-date:") == 0) { in do_set_option()
3282 int m = modstack_find(&worker->env.mesh->mods, "validator"); in do_set_option()
3284 if(m != -1) val_env = (struct val_env*)worker->env.modinfo[m]; in do_set_option()
3286 val_env->date_override = worker->env.cfg->val_date_override; in do_set_option()
3303 r = config_get_option(worker->env.cfg, arg, remote_get_opt_ssl, ssl); in do_get_option()
3314 /* since its a per-worker structure no locks needed */ in do_list_forwards()
3315 struct iter_forwards* fwds = worker->env.fwds; in do_list_forwards()
3319 lock_rw_rdlock(&fwds->lock); in do_list_forwards()
3320 RBTREE_FOR(z, struct iter_forward_zone*, fwds->tree) { in do_list_forwards()
3321 if(!z->dp) continue; /* skip empty marker for stub */ in do_list_forwards()
3325 if(worker->env.anchors && in do_list_forwards()
3326 (a=anchor_find(worker->env.anchors, z->name, in do_list_forwards()
3327 z->namelabs, z->namelen, z->dclass))) { in do_list_forwards()
3328 if(!a->keylist && !a->numDS && !a->numDNSKEY) in do_list_forwards()
3330 lock_basic_unlock(&a->lock); in do_list_forwards()
3334 z->name, z->dclass, z->dp)) { in do_list_forwards()
3335 lock_rw_unlock(&fwds->lock); in do_list_forwards()
3339 lock_rw_unlock(&fwds->lock); in do_list_forwards()
3350 lock_rw_rdlock(&worker->env.hints->lock); in do_list_stubs()
3351 RBTREE_FOR(z, struct iter_hints_stub*, &worker->env.hints->tree) { in do_list_stubs()
3355 if(worker->env.anchors && in do_list_stubs()
3356 (a=anchor_find(worker->env.anchors, z->node.name, in do_list_stubs()
3357 z->node.labs, z->node.len, z->node.dclass))) { in do_list_stubs()
3358 if(!a->keylist && !a->numDS && !a->numDNSKEY) in do_list_stubs()
3360 lock_basic_unlock(&a->lock); in do_list_stubs()
3364 (z->noprime?"no":""), (insecure?" +i":"")); in do_list_stubs()
3365 if(!ssl_print_name_dp(ssl, str, z->node.name, in do_list_stubs()
3366 z->node.dclass, z->dp)) { in do_list_stubs()
3367 lock_rw_unlock(&worker->env.hints->lock); in do_list_stubs()
3371 lock_rw_unlock(&worker->env.hints->lock); in do_list_stubs()
3380 lock_rw_rdlock(&az->lock); in do_list_auth_zones()
3381 RBTREE_FOR(z, struct auth_zone*, &az->ztree) { in do_list_auth_zones()
3382 lock_rw_rdlock(&z->lock); in do_list_auth_zones()
3383 dname_str(z->name, buf); in do_list_auth_zones()
3384 if(z->zone_expired) in do_list_auth_zones()
3391 if(z->soa_zone_acquired != 0) { in do_list_auth_zones()
3397 &z->soa_zone_acquired, &tm); in do_list_auth_zones()
3398 if(!strftime(tmbuf, sizeof(tmbuf), "%Y-%m-%dT%H:%M:%S", tm_p)) in do_list_auth_zones()
3399 snprintf(tmbuf, sizeof(tmbuf), "strftime-err-%u", (unsigned)z->soa_zone_acquired); in do_list_auth_zones()
3402 (unsigned)z->soa_zone_acquired, in do_list_auth_zones()
3407 (unsigned)z->soa_zone_acquired); in do_list_auth_zones()
3417 lock_rw_unlock(&z->lock); in do_list_auth_zones()
3420 lock_rw_unlock(&az->lock); in do_list_auth_zones()
3424 lock_rw_unlock(&az->lock); in do_list_auth_zones()
3433 lock_rw_rdlock(&zones->lock); in do_list_local_zones()
3434 RBTREE_FOR(z, struct local_zone*, &zones->ztree) { in do_list_local_zones()
3435 lock_rw_rdlock(&z->lock); in do_list_local_zones()
3436 dname_str(z->name, buf); in do_list_local_zones()
3438 local_zone_type2str(z->type))) { in do_list_local_zones()
3440 lock_rw_unlock(&z->lock); in do_list_local_zones()
3441 lock_rw_unlock(&zones->lock); in do_list_local_zones()
3444 lock_rw_unlock(&z->lock); in do_list_local_zones()
3446 lock_rw_unlock(&zones->lock); in do_list_local_zones()
3456 char* s = (char*)sldns_buffer_begin(worker->env.scratch_buffer); in do_list_local_data()
3457 size_t slen = sldns_buffer_capacity(worker->env.scratch_buffer); in do_list_local_data()
3458 lock_rw_rdlock(&zones->lock); in do_list_local_data()
3459 RBTREE_FOR(z, struct local_zone*, &zones->ztree) { in do_list_local_data()
3460 lock_rw_rdlock(&z->lock); in do_list_local_data()
3461 RBTREE_FOR(d, struct local_data*, &z->data) { in do_list_local_data()
3462 for(p = d->rrsets; p; p = p->next) { in do_list_local_data()
3464 (struct packed_rrset_data*)p->rrset->entry.data; in do_list_local_data()
3466 for(i=0; i<d->count + d->rrsig_count; i++) { in do_list_local_data()
3467 if(!packed_rr_to_string(p->rrset, i, in do_list_local_data()
3470 lock_rw_unlock(&z->lock); in do_list_local_data()
3471 lock_rw_unlock(&zones->lock); in do_list_local_data()
3476 lock_rw_unlock(&z->lock); in do_list_local_data()
3477 lock_rw_unlock(&zones->lock); in do_list_local_data()
3483 lock_rw_unlock(&z->lock); in do_list_local_data()
3485 lock_rw_unlock(&zones->lock); in do_list_local_data()
3492 struct view* v = views_find_view(worker->env.views, in do_view_list_local_zones()
3498 if(v->local_zones) { in do_view_list_local_zones()
3499 do_list_local_zones(ssl, v->local_zones); in do_view_list_local_zones()
3501 lock_rw_unlock(&v->lock); in do_view_list_local_zones()
3508 struct view* v = views_find_view(worker->env.views, in do_view_list_local_data()
3514 if(v->local_zones) { in do_view_list_local_data()
3515 do_list_local_data(ssl, worker, v->local_zones); in do_view_list_local_data()
3517 lock_rw_unlock(&v->lock); in do_view_list_local_data()
3541 struct rate_key* k = (struct rate_key*)e->key; in rate_list()
3542 struct rate_data* d = (struct rate_data*)e->data; in rate_list()
3544 int lim = infra_find_ratelimit(a->infra, k->name, k->namelen); in rate_list()
3545 int max = infra_rate_max(d, a->now, a->backoff); in rate_list()
3546 if(a->all == 0) { in rate_list()
3550 dname_str(k->name, buf); in rate_list()
3551 ssl_printf(a->ssl, "%s %d limit %d\n", buf, max, lim); in rate_list()
3560 struct ip_rate_key* k = (struct ip_rate_key*)e->key; in ip_rate_list()
3561 struct ip_rate_data* d = (struct ip_rate_data*)e->data; in ip_rate_list()
3563 int max = infra_rate_max(d, a->now, a->backoff); in ip_rate_list()
3564 if(a->all == 0) { in ip_rate_list()
3568 addr_to_str(&k->addr, k->addrlen, ip, sizeof(ip)); in ip_rate_list()
3569 ssl_printf(a->ssl, "%s %d limit %d\n", ip, max, lim); in ip_rate_list()
3578 a.infra = worker->env.infra_cache; in do_ratelimit_list()
3579 a.now = *worker->env.now; in do_ratelimit_list()
3581 a.backoff = worker->env.cfg->ratelimit_backoff; in do_ratelimit_list()
3585 if(a.infra->domain_rates==NULL || in do_ratelimit_list()
3588 slabhash_traverse(a.infra->domain_rates, 0, rate_list, &a); in do_ratelimit_list()
3597 a.infra = worker->env.infra_cache; in do_ip_ratelimit_list()
3598 a.now = *worker->env.now; in do_ip_ratelimit_list()
3600 a.backoff = worker->env.cfg->ip_ratelimit_backoff; in do_ip_ratelimit_list()
3604 if(a.infra->client_ip_rates==NULL || in do_ip_ratelimit_list()
3607 slabhash_traverse(a.infra->client_ip_rates, 0, ip_rate_list, &a); in do_ip_ratelimit_list()
3616 struct auth_zones *az = worker->env.auth_zones; in do_rpz_enable_disable()
3621 lock_rw_rdlock(&az->lock); in do_rpz_enable_disable()
3624 lock_rw_wrlock(&z->lock); in do_rpz_enable_disable()
3626 lock_rw_unlock(&az->lock); in do_rpz_enable_disable()
3630 (void) ssl_printf(ssl, "error no auth-zone %s\n", arg); in do_rpz_enable_disable()
3633 if (!z->rpz) { in do_rpz_enable_disable()
3634 (void) ssl_printf(ssl, "error auth-zone %s not RPZ\n", arg); in do_rpz_enable_disable()
3635 lock_rw_unlock(&z->lock); in do_rpz_enable_disable()
3639 rpz_enable(z->rpz); in do_rpz_enable_disable()
3641 rpz_disable(z->rpz); in do_rpz_enable_disable()
3643 lock_rw_unlock(&z->lock); in do_rpz_enable_disable()
3665 char const* secret_file = worker->env.cfg->cookie_secret_file; in cookie_secret_file_dump()
3666 struct cookie_secrets* cookie_secrets = worker->daemon->cookie_secrets; in cookie_secret_file_dump()
3688 for(i = 0; i < cookie_secrets->cookie_count; i++) { in cookie_secret_file_dump()
3689 struct cookie_secret const* cs = &cookie_secrets-> in cookie_secret_file_dump()
3691 ssize_t const len = hex_ntop(cs->cookie_secret, in cookie_secret_file_dump()
3694 (void)len; /* silence unused variable warning with -DNDEBUG */ in cookie_secret_file_dump()
3707 char const* secret_file = worker->env.cfg->cookie_secret_file; in do_activate_cookie_secret()
3708 struct cookie_secrets* cookie_secrets = worker->daemon->cookie_secrets; in do_activate_cookie_secret()
3718 lock_basic_lock(&cookie_secrets->lock); in do_activate_cookie_secret()
3720 if(cookie_secrets->cookie_count <= 1 ) { in do_activate_cookie_secret()
3721 lock_basic_unlock(&cookie_secrets->lock); in do_activate_cookie_secret()
3726 if(worker->thread_num == 0 && !cookie_secret_file_dump(ssl, worker)) { in do_activate_cookie_secret()
3727 lock_basic_unlock(&cookie_secrets->lock); in do_activate_cookie_secret()
3733 if(worker->thread_num == 0) in do_activate_cookie_secret()
3735 lock_basic_unlock(&cookie_secrets->lock); in do_activate_cookie_secret()
3742 char const* secret_file = worker->env.cfg->cookie_secret_file; in do_drop_cookie_secret()
3743 struct cookie_secrets* cookie_secrets = worker->daemon->cookie_secrets; in do_drop_cookie_secret()
3753 lock_basic_lock(&cookie_secrets->lock); in do_drop_cookie_secret()
3755 if(cookie_secrets->cookie_count <= 1 ) { in do_drop_cookie_secret()
3756 lock_basic_unlock(&cookie_secrets->lock); in do_drop_cookie_secret()
3761 if(worker->thread_num == 0 && !cookie_secret_file_dump(ssl, worker)) { in do_drop_cookie_secret()
3762 lock_basic_unlock(&cookie_secrets->lock); in do_drop_cookie_secret()
3768 if(worker->thread_num == 0) in do_drop_cookie_secret()
3770 lock_basic_unlock(&cookie_secrets->lock); in do_drop_cookie_secret()
3778 char const* secret_file = worker->env.cfg->cookie_secret_file; in do_add_cookie_secret()
3779 struct cookie_secrets* cookie_secrets = worker->daemon->cookie_secrets; in do_add_cookie_secret()
3786 worker->daemon->cookie_secrets = cookie_secrets_create(); in do_add_cookie_secret()
3787 if(!worker->daemon->cookie_secrets) { in do_add_cookie_secret()
3791 cookie_secrets = worker->daemon->cookie_secrets; in do_add_cookie_secret()
3793 lock_basic_lock(&cookie_secrets->lock); in do_add_cookie_secret()
3796 lock_basic_unlock(&cookie_secrets->lock); in do_add_cookie_secret()
3801 lock_basic_unlock(&cookie_secrets->lock); in do_add_cookie_secret()
3809 lock_basic_unlock(&cookie_secrets->lock); in do_add_cookie_secret()
3817 if(worker->thread_num == 0 && !cookie_secret_file_dump(ssl, worker)) { in do_add_cookie_secret()
3818 lock_basic_unlock(&cookie_secrets->lock); in do_add_cookie_secret()
3827 if(worker->thread_num == 0) in do_add_cookie_secret()
3829 lock_basic_unlock(&cookie_secrets->lock); in do_add_cookie_secret()
3837 struct cookie_secrets* cookie_secrets = worker->daemon->cookie_secrets; in do_print_cookie_secrets()
3843 lock_basic_lock(&cookie_secrets->lock); in do_print_cookie_secrets()
3844 for(i = 0; (size_t)i < cookie_secrets->cookie_count; i++) { in do_print_cookie_secrets()
3845 struct cookie_secret const* cs = &cookie_secrets-> in do_print_cookie_secrets()
3847 ssize_t const len = hex_ntop(cs->cookie_secret, in do_print_cookie_secrets()
3850 (void)len; /* silence unused variable warning with -DNDEBUG */ in do_print_cookie_secrets()
3855 else if (cookie_secrets->cookie_count == 2) in do_print_cookie_secrets()
3861 lock_basic_unlock(&cookie_secrets->lock); in do_print_cookie_secrets()
3889 /** check for name with end-of-string, space or tab after it */
3940 if(worker->daemon->num > 1) { in execute_cmd()
3942 "supported in multi-process operation\n"); in execute_cmd()
3952 if(worker->daemon->num > 1) { in execute_cmd()
3978 do_list_local_zones(ssl, worker->daemon->local_zones); in execute_cmd()
3983 do_list_local_data(ssl, worker, worker->daemon->local_zones); in execute_cmd()
4000 do_list_auth_zones(ssl, worker->env.auth_zones); in execute_cmd()
4085 do_zone_remove(ssl, worker->daemon->local_zones, skipwhite(p+17)); in execute_cmd()
4087 do_zone_add(ssl, worker->daemon->local_zones, skipwhite(p+10)); in execute_cmd()
4089 do_data_remove(ssl, worker->daemon->local_zones, skipwhite(p+17)); in execute_cmd()
4091 do_data_add(ssl, worker->daemon->local_zones, skipwhite(p+10)); in execute_cmd()
4163 if(!tube_read_msg(worker->cmd, &msg, &len, 0)) { in daemon_remote_exec()
4183 WSAEventSelect(s->c->fd, NULL, 0); in handle_req()
4185 fd_set_block(s->c->fd); in handle_req()
4188 if(res->ssl) { in handle_req()
4190 if((r=SSL_read(res->ssl, magic, (int)sizeof(magic)-1)) <= 0) { in handle_req()
4192 if((r2=SSL_get_error(res->ssl, r)) == SSL_ERROR_ZERO_RETURN) in handle_req()
4199 ssize_t rr = recv(res->fd, magic, sizeof(magic)-1, 0); in handle_req()
4232 execute_cmd(rc, s, res, buf, rc->worker); in handle_req()
4241 if(s->shake_state == rc_hs_read) { in remote_handshake_later()
4245 s->shake_state = rc_hs_read; in remote_handshake_later()
4249 if(s->shake_state == rc_hs_write) { in remote_handshake_later()
4253 s->shake_state = rc_hs_write; in remote_handshake_later()
4260 &s->c->repinfo.remote_addr, s->c->repinfo.remote_addrlen); in remote_handshake_later()
4272 struct daemon_remote* rc = s->rc; in remote_control_callback()
4280 if(s->ssl) { in remote_control_callback()
4283 r = SSL_do_handshake(s->ssl); in remote_control_callback()
4285 int r2 = SSL_get_error(s->ssl, r); in remote_control_callback()
4288 s->shake_state = rc_none; in remote_control_callback()
4292 if (!rc->use_cert) { in remote_control_callback()
4294 } else if(SSL_get_verify_result(s->ssl) == X509_V_OK) { in remote_control_callback()
4296 X509* x = SSL_get1_peer_certificate(s->ssl); in remote_control_callback()
4298 X509* x = SSL_get_peer_certificate(s->ssl); in remote_control_callback()
4316 res.ssl = s->ssl; in remote_control_callback()
4317 res.fd = c->fd; in remote_control_callback()
4327 * @param fd: file descriptor, -1 uses no fd for a timer only.
4329 * -1 waits blocking for events.
4351 if(fd == -1) { in sock_poll_timeout()
4379 if(ret == -1) { in sock_poll_timeout()
4451 if(fr->need_to_quit) in fr_poll_for_quit()
4454 if(!sock_poll_timeout(fr->commpair[1], 0, 1, 0, &inevent)) { in fr_poll_for_quit()
4468 ret = recv(fr->commpair[1], ((char*)&cmd)+bcount, in fr_poll_for_quit()
4469 sizeof(cmd)-bcount, 0); in fr_poll_for_quit()
4470 if(ret == -1) { in fr_poll_for_quit()
4495 fr->need_to_quit = 1; in fr_poll_for_quit()
4526 if(!sock_poll_timeout(fr->commpair[1], IPC_NOTIFICATION_WAIT, in fr_send_notification()
4535 ret = send(fr->commpair[1], ((char*)&cmd)+bcount, in fr_send_notification()
4536 sizeof(cmd)-bcount, 0); in fr_send_notification()
4537 if(ret == -1) { in fr_send_notification()
4572 lock_basic_lock(&fr->fr_output_lock); in fr_output_text()
4573 if(!cfg_strlist_append(fr->fr_output, item)) { in fr_output_text()
4574 lock_basic_unlock(&fr->fr_output_lock); in fr_output_text()
4579 lock_basic_unlock(&fr->fr_output_lock); in fr_output_text()
4703 if(!config_read(*newcfg, fr->worker->daemon->cfgfile, in fr_read_config()
4704 fr->worker->daemon->chroot)) { in fr_read_config()
4707 (fr->worker->daemon->chroot?"<chroot:":""), in fr_read_config()
4708 (fr->worker->daemon->chroot?fr->worker->daemon->chroot:""), in fr_read_config()
4709 (fr->worker->daemon->chroot?"> ":""), in fr_read_config()
4710 fr->worker->daemon->cfgfile, strerror(errno))) in fr_read_config()
4717 if(fr->fr_verb >= 1) { in fr_read_config()
4719 (fr->worker->daemon->chroot?"<chroot:":""), in fr_read_config()
4720 (fr->worker->daemon->chroot?fr->worker->daemon->chroot:""), in fr_read_config()
4721 (fr->worker->daemon->chroot?"> ":""), in fr_read_config()
4722 fr->worker->daemon->cfgfile)) in fr_read_config()
4770 if(!taglist_equal(fr->worker->daemon->cfg->tagname, in fr_check_tag_defines()
4771 fr->worker->daemon->cfg->num_tags, newcfg->tagname, in fr_check_tag_defines()
4772 newcfg->num_tags) && in fr_check_tag_defines()
4773 !taglist_change_at_end(fr->worker->daemon->cfg->tagname, in fr_check_tag_defines()
4774 fr->worker->daemon->cfg->num_tags, newcfg->tagname, in fr_check_tag_defines()
4775 newcfg->num_tags)) { in fr_check_tag_defines()
4776 /* The tags have changed too much, the define-tag config. */ in fr_check_tag_defines()
4777 if(fr->fr_drop_mesh) in fr_check_tag_defines()
4779 fr->fr_drop_mesh = 1; in fr_check_tag_defines()
4780 fr->worker->daemon->fast_reload_drop_mesh = fr->fr_drop_mesh; in fr_check_tag_defines()
4782 "'define-tag', and the queries have to be dropped " in fr_check_tag_defines()
4800 if(len - slen < desclen+2) in fr_add_incompatible_option()
4802 snprintf(str+slen, len-slen, " %s", desc); in fr_add_incompatible_option()
4808 if(cfg->var != newcfg->var) { \
4816 if((!cfg->var && newcfg->var) || \
4817 (cfg->var && !newcfg->var) || \
4818 (cfg->var && newcfg->var \
4819 && strcmp(cfg->var, newcfg->var) != 0)) { \
4826 fr_check_changed_cfg_strlist(cfg->var, newcfg->var, desc, str, \
4835 if((!p1->str && p2->str) || in fr_check_changed_cfg_strlist()
4836 (p1->str && !p2->str) || in fr_check_changed_cfg_strlist()
4837 (p1->str && p2->str && strcmp(p1->str, p2->str) != 0)) { in fr_check_changed_cfg_strlist()
4842 p1 = p1->next; in fr_check_changed_cfg_strlist()
4843 p2 = p2->next; in fr_check_changed_cfg_strlist()
4852 fr_check_changed_cfg_str2list(cfg->var, newcfg->var, desc, buff,\
4861 if((!p1->str && p2->str) || in fr_check_changed_cfg_str2list()
4862 (p1->str && !p2->str) || in fr_check_changed_cfg_str2list()
4863 (p1->str && p2->str && strcmp(p1->str, p2->str) != 0)) { in fr_check_changed_cfg_str2list()
4868 if((!p1->str2 && p2->str2) || in fr_check_changed_cfg_str2list()
4869 (p1->str2 && !p2->str2) || in fr_check_changed_cfg_str2list()
4870 (p1->str2 && p2->str2 && in fr_check_changed_cfg_str2list()
4871 strcmp(p1->str2, p2->str2) != 0)) { in fr_check_changed_cfg_str2list()
4876 p1 = p1->next; in fr_check_changed_cfg_str2list()
4877 p2 = p2->next; in fr_check_changed_cfg_str2list()
4890 struct config_file* cfg = fr->worker->env.cfg; in fr_check_compat_cfg()
4894 FR_CHECK_CHANGED_CFG("num-threads", num_threads, changed_str); in fr_check_compat_cfg()
4895 FR_CHECK_CHANGED_CFG("do-ip4", do_ip4, changed_str); in fr_check_compat_cfg()
4896 FR_CHECK_CHANGED_CFG("do-ip6", do_ip6, changed_str); in fr_check_compat_cfg()
4897 FR_CHECK_CHANGED_CFG("do-udp", do_udp, changed_str); in fr_check_compat_cfg()
4898 FR_CHECK_CHANGED_CFG("do-tcp", do_tcp, changed_str); in fr_check_compat_cfg()
4900 /* But cfg->outgoing_num_ports has been changed at startup, in fr_check_compat_cfg()
4902 FR_CHECK_CHANGED_CFG("outgoing-num-tcp", outgoing_num_tcp, changed_str); in fr_check_compat_cfg()
4903 FR_CHECK_CHANGED_CFG("incoming-num-tcp", incoming_num_tcp, changed_str); in fr_check_compat_cfg()
4904 FR_CHECK_CHANGED_CFG("outgoing-interface", num_out_ifs, changed_str); in fr_check_compat_cfg()
4905 if(cfg->num_out_ifs == newcfg->num_out_ifs) { in fr_check_compat_cfg()
4906 for(i=0; i<cfg->num_out_ifs; i++) in fr_check_compat_cfg()
4907 FR_CHECK_CHANGED_CFG_STR("outgoing-interface", in fr_check_compat_cfg()
4911 if(cfg->num_ifs == newcfg->num_ifs) { in fr_check_compat_cfg()
4912 for(i=0; i<cfg->num_ifs; i++) in fr_check_compat_cfg()
4916 FR_CHECK_CHANGED_CFG("interface-automatic", if_automatic, changed_str); in fr_check_compat_cfg()
4917 FR_CHECK_CHANGED_CFG("so-rcvbuf", so_rcvbuf, changed_str); in fr_check_compat_cfg()
4918 FR_CHECK_CHANGED_CFG("so-sndbuf", so_sndbuf, changed_str); in fr_check_compat_cfg()
4919 FR_CHECK_CHANGED_CFG("so-reuseport", so_reuseport, changed_str); in fr_check_compat_cfg()
4920 FR_CHECK_CHANGED_CFG("ip-transparent", ip_transparent, changed_str); in fr_check_compat_cfg()
4921 FR_CHECK_CHANGED_CFG("ip-freebind", ip_freebind, changed_str); in fr_check_compat_cfg()
4922 FR_CHECK_CHANGED_CFG("udp-connect", udp_connect, changed_str); in fr_check_compat_cfg()
4923 FR_CHECK_CHANGED_CFG("msg-buffer-size", msg_buffer_size, changed_str); in fr_check_compat_cfg()
4924 FR_CHECK_CHANGED_CFG("edns-tcp-keepalive", do_tcp_keepalive, changed_str); in fr_check_compat_cfg()
4925 FR_CHECK_CHANGED_CFG("edns-tcp-keepalive-timeout", tcp_keepalive_timeout, changed_str); in fr_check_compat_cfg()
4926 FR_CHECK_CHANGED_CFG("tcp-idle-timeout", tcp_idle_timeout, changed_str); in fr_check_compat_cfg()
4929 FR_CHECK_CHANGED_CFG("harden-large-queries", harden_large_queries, changed_str); in fr_check_compat_cfg()
4930 FR_CHECK_CHANGED_CFG("http-max-streams", http_max_streams, changed_str); in fr_check_compat_cfg()
4931 FR_CHECK_CHANGED_CFG_STR("http-endpoint", http_endpoint, changed_str); in fr_check_compat_cfg()
4933 FR_CHECK_CHANGED_CFG("https-port", https_port, changed_str); in fr_check_compat_cfg()
4934 FR_CHECK_CHANGED_CFG("tls-port", ssl_port, changed_str); in fr_check_compat_cfg()
4935 FR_CHECK_CHANGED_CFG_STR("tls-service-key", ssl_service_key, changed_str); in fr_check_compat_cfg()
4936 FR_CHECK_CHANGED_CFG_STR("tls-service-pem", ssl_service_pem, changed_str); in fr_check_compat_cfg()
4937 FR_CHECK_CHANGED_CFG_STR("tls-cert-bundle", tls_cert_bundle, changed_str); in fr_check_compat_cfg()
4938 FR_CHECK_CHANGED_CFG_STRLIST("proxy-protocol-port", proxy_protocol_port, changed_str); in fr_check_compat_cfg()
4939 FR_CHECK_CHANGED_CFG_STRLIST("tls-additional-port", tls_additional_port, changed_str); in fr_check_compat_cfg()
4940 FR_CHECK_CHANGED_CFG_STR("interface-automatic-ports", if_automatic_ports, changed_str); in fr_check_compat_cfg()
4941 …FR_CHECK_CHANGED_CFG("udp-upstream-without-downstream", udp_upstream_without_downstream, changed_s… in fr_check_compat_cfg()
4962 struct config_file* cfg = fr->worker->env.cfg; in fr_check_nopause_compat_cfg()
4963 if(!fr->fr_nopause) in fr_check_nopause_compat_cfg()
4968 FR_CHECK_CHANGED_CFG("outbound-msg-retry", outbound_msg_retry, changed_str); in fr_check_nopause_compat_cfg()
4969 FR_CHECK_CHANGED_CFG("max-sent-count", max_sent_count, changed_str); in fr_check_nopause_compat_cfg()
4970 FR_CHECK_CHANGED_CFG("max-query-restarts", max_query_restarts, changed_str); in fr_check_nopause_compat_cfg()
4971 FR_CHECK_CHANGED_CFG_STR("target-fetch-policy", target_fetch_policy, changed_str); in fr_check_nopause_compat_cfg()
4972 FR_CHECK_CHANGED_CFG("do-not-query-localhost", donotquery_localhost, changed_str); in fr_check_nopause_compat_cfg()
4973 FR_CHECK_CHANGED_CFG_STRLIST("do-not-query-address", donotqueryaddrs, changed_str); in fr_check_nopause_compat_cfg()
4974 FR_CHECK_CHANGED_CFG_STRLIST("private-address", private_address, changed_str); in fr_check_nopause_compat_cfg()
4975 FR_CHECK_CHANGED_CFG_STRLIST("private-domain", private_domain, changed_str); in fr_check_nopause_compat_cfg()
4976 FR_CHECK_CHANGED_CFG_STRLIST("caps-exempt", caps_whitelist, changed_str); in fr_check_nopause_compat_cfg()
4977 FR_CHECK_CHANGED_CFG("do-nat64", do_nat64, changed_str); in fr_check_nopause_compat_cfg()
4978 FR_CHECK_CHANGED_CFG_STR("nat64-prefix", nat64_prefix, changed_str); in fr_check_nopause_compat_cfg()
4981 FR_CHECK_CHANGED_CFG("val-bogus-ttl", bogus_ttl, changed_str); in fr_check_nopause_compat_cfg()
4982 FR_CHECK_CHANGED_CFG("val-date-override", val_date_override, changed_str); in fr_check_nopause_compat_cfg()
4983 FR_CHECK_CHANGED_CFG("val-sig-skew-min", val_sig_skew_min, changed_str); in fr_check_nopause_compat_cfg()
4984 FR_CHECK_CHANGED_CFG("val-sig-skew-max", val_sig_skew_max, changed_str); in fr_check_nopause_compat_cfg()
4985 FR_CHECK_CHANGED_CFG("val-max-restart", val_max_restart, changed_str); in fr_check_nopause_compat_cfg()
4986 FR_CHECK_CHANGED_CFG_STR("val-nsec3-keysize-iterations", in fr_check_nopause_compat_cfg()
4990 FR_CHECK_CHANGED_CFG("infra-host-ttl", host_ttl, changed_str); in fr_check_nopause_compat_cfg()
4991 FR_CHECK_CHANGED_CFG("infra-keep-probing", infra_keep_probing, changed_str); in fr_check_nopause_compat_cfg()
4993 FR_CHECK_CHANGED_CFG("ip-ratelimit", ip_ratelimit, changed_str); in fr_check_nopause_compat_cfg()
4994 FR_CHECK_CHANGED_CFG("ip-ratelimit-cookie", ip_ratelimit_cookie, changed_str); in fr_check_nopause_compat_cfg()
4995 FR_CHECK_CHANGED_CFG_STR2LIST("wait-limit-netblock", wait_limit_netblock, changed_str); in fr_check_nopause_compat_cfg()
4996 …FR_CHECK_CHANGED_CFG_STR2LIST("wait-limit-cookie-netblock", wait_limit_cookie_netblock, changed_st… in fr_check_nopause_compat_cfg()
4997 FR_CHECK_CHANGED_CFG_STR2LIST("ratelimit-below-domain", ratelimit_below_domain, changed_str); in fr_check_nopause_compat_cfg()
4998 FR_CHECK_CHANGED_CFG_STR2LIST("ratelimit-for-domain", ratelimit_for_domain, changed_str); in fr_check_nopause_compat_cfg()
5001 FR_CHECK_CHANGED_CFG("dnstap-send-identity", dnstap_send_identity, changed_str); in fr_check_nopause_compat_cfg()
5002 FR_CHECK_CHANGED_CFG("dnstap-send-version", dnstap_send_version, changed_str); in fr_check_nopause_compat_cfg()
5003 FR_CHECK_CHANGED_CFG_STR("dnstap-identity", dnstap_identity, changed_str); in fr_check_nopause_compat_cfg()
5004 FR_CHECK_CHANGED_CFG_STR("dnstap-version", dnstap_version, changed_str); in fr_check_nopause_compat_cfg()
5026 auth_zones_delete(ct->auth_zones); in fr_construct_clear()
5027 forwards_delete(ct->fwds); in fr_construct_clear()
5028 hints_delete(ct->hints); in fr_construct_clear()
5029 respip_set_delete(ct->respip_set); in fr_construct_clear()
5030 local_zones_delete(ct->local_zones); in fr_construct_clear()
5031 acl_list_delete(ct->acl); in fr_construct_clear()
5032 acl_list_delete(ct->acl_interface); in fr_construct_clear()
5033 tcl_list_delete(ct->tcl); in fr_construct_clear()
5034 edns_strings_delete(ct->edns_strings); in fr_construct_clear()
5035 anchors_delete(ct->anchors); in fr_construct_clear()
5036 views_delete(ct->views); in fr_construct_clear()
5037 free(ct->nsec3_keysize); in fr_construct_clear()
5038 free(ct->nsec3_maxiter); in fr_construct_clear()
5039 free(ct->target_fetch_policy); in fr_construct_clear()
5040 donotq_delete(ct->donotq); in fr_construct_clear()
5041 priv_delete(ct->priv); in fr_construct_clear()
5042 caps_white_delete(ct->caps_white); in fr_construct_clear()
5043 wait_limits_free(&ct->wait_limits_netblock); in fr_construct_clear()
5044 wait_limits_free(&ct->wait_limits_cookie_netblock); in fr_construct_clear()
5045 domain_limits_free(&ct->domain_limits); in fr_construct_clear()
5048 if(ct->oldcfg && ct->oldcfg->log_identity) { in fr_construct_clear()
5049 free(ct->oldcfg->log_identity); in fr_construct_clear()
5050 ct->oldcfg->log_identity = NULL; in fr_construct_clear()
5052 config_delete(ct->oldcfg); in fr_construct_clear()
5061 for(s = p; s; s = s->next) in getmem_config_strlist()
5062 m += sizeof(*s) + getmem_str(s->str); in getmem_config_strlist()
5072 for(s = p; s; s = s->next) in getmem_config_str2list()
5073 m += sizeof(*s) + getmem_str(s->str) + getmem_str(s->str2); in getmem_config_str2list()
5083 for(s = p; s; s = s->next) in getmem_config_str3list()
5084 m += sizeof(*s) + getmem_str(s->str) + getmem_str(s->str2) in getmem_config_str3list()
5085 + getmem_str(s->str3); in getmem_config_str3list()
5095 for(s = p; s; s = s->next) in getmem_config_strbytelist()
5096 m += sizeof(*s) + getmem_str(s->str) + (s->str2?s->str2len:0); in getmem_config_strbytelist()
5118 for(s = p; s; s = s->next) in getmem_config_stub()
5119 m += sizeof(*s) + getmem_str(s->name) in getmem_config_stub()
5120 + getmem_config_strlist(s->hosts) in getmem_config_stub()
5121 + getmem_config_strlist(s->addrs); in getmem_config_stub()
5131 for(s = p; s; s = s->next) in getmem_config_auth()
5132 m += sizeof(*s) + getmem_str(s->name) in getmem_config_auth()
5133 + getmem_config_strlist(s->masters) in getmem_config_auth()
5134 + getmem_config_strlist(s->urls) in getmem_config_auth()
5135 + getmem_config_strlist(s->allow_notify) in getmem_config_auth()
5136 + getmem_str(s->zonefile) in getmem_config_auth()
5137 + s->rpz_taglistlen in getmem_config_auth()
5138 + getmem_str(s->rpz_action_override) in getmem_config_auth()
5139 + getmem_str(s->rpz_log_name) in getmem_config_auth()
5140 + getmem_str(s->rpz_cname); in getmem_config_auth()
5150 for(s = p; s; s = s->next) in getmem_config_view()
5151 m += sizeof(*s) + getmem_str(s->name) in getmem_config_view()
5152 + getmem_config_str2list(s->local_zones) in getmem_config_view()
5153 + getmem_config_strlist(s->local_data) in getmem_config_view()
5154 + getmem_config_strlist(s->local_zones_nodefault) in getmem_config_view()
5156 + getmem_config_strlist(s->local_zones_ipset) in getmem_config_view()
5158 + getmem_config_str2list(s->respip_actions) in getmem_config_view()
5159 + getmem_config_str2list(s->respip_data); in getmem_config_view()
5170 m += getmem_config_strlist(cfg->proxy_protocol_port); in config_file_getmem()
5171 m += getmem_str(cfg->ssl_service_key); in config_file_getmem()
5172 m += getmem_str(cfg->ssl_service_pem); in config_file_getmem()
5173 m += getmem_str(cfg->tls_cert_bundle); in config_file_getmem()
5174 m += getmem_config_strlist(cfg->tls_additional_port); in config_file_getmem()
5175 m += getmem_config_strlist(cfg->tls_session_ticket_keys.first); in config_file_getmem()
5176 m += getmem_str(cfg->tls_ciphers); in config_file_getmem()
5177 m += getmem_str(cfg->tls_ciphersuites); in config_file_getmem()
5178 m += getmem_str(cfg->http_endpoint); in config_file_getmem()
5179 m += (cfg->outgoing_avail_ports?65536*sizeof(int):0); in config_file_getmem()
5180 m += getmem_str(cfg->target_fetch_policy); in config_file_getmem()
5181 m += getmem_str(cfg->if_automatic_ports); in config_file_getmem()
5182 m += getmem_ifs(cfg->num_ifs, cfg->ifs); in config_file_getmem()
5183 m += getmem_ifs(cfg->num_out_ifs, cfg->out_ifs); in config_file_getmem()
5184 m += getmem_config_strlist(cfg->root_hints); in config_file_getmem()
5185 m += getmem_config_stub(cfg->stubs); in config_file_getmem()
5186 m += getmem_config_stub(cfg->forwards); in config_file_getmem()
5187 m += getmem_config_auth(cfg->auths); in config_file_getmem()
5188 m += getmem_config_view(cfg->views); in config_file_getmem()
5189 m += getmem_config_strlist(cfg->donotqueryaddrs); in config_file_getmem()
5191 m += getmem_config_strlist(cfg->client_subnet); in config_file_getmem()
5192 m += getmem_config_strlist(cfg->client_subnet_zone); in config_file_getmem()
5194 m += getmem_config_str2list(cfg->acls); in config_file_getmem()
5195 m += getmem_config_str2list(cfg->tcp_connection_limits); in config_file_getmem()
5196 m += getmem_config_strlist(cfg->caps_whitelist); in config_file_getmem()
5197 m += getmem_config_strlist(cfg->private_address); in config_file_getmem()
5198 m += getmem_config_strlist(cfg->private_domain); in config_file_getmem()
5199 m += getmem_str(cfg->chrootdir); in config_file_getmem()
5200 m += getmem_str(cfg->username); in config_file_getmem()
5201 m += getmem_str(cfg->directory); in config_file_getmem()
5202 m += getmem_str(cfg->logfile); in config_file_getmem()
5203 m += getmem_str(cfg->pidfile); in config_file_getmem()
5204 m += getmem_str(cfg->log_identity); in config_file_getmem()
5205 m += getmem_str(cfg->identity); in config_file_getmem()
5206 m += getmem_str(cfg->version); in config_file_getmem()
5207 m += getmem_str(cfg->http_user_agent); in config_file_getmem()
5208 m += getmem_str(cfg->nsid_cfg_str); in config_file_getmem()
5209 m += (cfg->nsid?cfg->nsid_len:0); in config_file_getmem()
5210 m += getmem_str(cfg->module_conf); in config_file_getmem()
5211 m += getmem_config_strlist(cfg->trust_anchor_file_list); in config_file_getmem()
5212 m += getmem_config_strlist(cfg->trust_anchor_list); in config_file_getmem()
5213 m += getmem_config_strlist(cfg->auto_trust_anchor_file_list); in config_file_getmem()
5214 m += getmem_config_strlist(cfg->trusted_keys_file_list); in config_file_getmem()
5215 m += getmem_config_strlist(cfg->domain_insecure); in config_file_getmem()
5216 m += getmem_str(cfg->val_nsec3_key_iterations); in config_file_getmem()
5217 m += getmem_config_str2list(cfg->local_zones); in config_file_getmem()
5218 m += getmem_config_strlist(cfg->local_zones_nodefault); in config_file_getmem()
5220 m += getmem_config_strlist(cfg->local_zones_ipset); in config_file_getmem()
5222 m += getmem_config_strlist(cfg->local_data); in config_file_getmem()
5223 m += getmem_config_str3list(cfg->local_zone_overrides); in config_file_getmem()
5224 m += getmem_config_strbytelist(cfg->local_zone_tags); in config_file_getmem()
5225 m += getmem_config_strbytelist(cfg->acl_tags); in config_file_getmem()
5226 m += getmem_config_str3list(cfg->acl_tag_actions); in config_file_getmem()
5227 m += getmem_config_str3list(cfg->acl_tag_datas); in config_file_getmem()
5228 m += getmem_config_str2list(cfg->acl_view); in config_file_getmem()
5229 m += getmem_config_str2list(cfg->interface_actions); in config_file_getmem()
5230 m += getmem_config_strbytelist(cfg->interface_tags); in config_file_getmem()
5231 m += getmem_config_str3list(cfg->interface_tag_actions); in config_file_getmem()
5232 m += getmem_config_str3list(cfg->interface_tag_datas); in config_file_getmem()
5233 m += getmem_config_str2list(cfg->interface_view); in config_file_getmem()
5234 m += getmem_config_strbytelist(cfg->respip_tags); in config_file_getmem()
5235 m += getmem_config_str2list(cfg->respip_actions); in config_file_getmem()
5236 m += getmem_config_str2list(cfg->respip_data); in config_file_getmem()
5237 m += getmem_ifs(cfg->num_tags, cfg->tagname); in config_file_getmem()
5238 m += getmem_config_strlist(cfg->control_ifs.first); in config_file_getmem()
5239 m += getmem_str(cfg->server_key_file); in config_file_getmem()
5240 m += getmem_str(cfg->server_cert_file); in config_file_getmem()
5241 m += getmem_str(cfg->control_key_file); in config_file_getmem()
5242 m += getmem_str(cfg->control_cert_file); in config_file_getmem()
5243 m += getmem_config_strlist(cfg->python_script); in config_file_getmem()
5244 m += getmem_config_strlist(cfg->dynlib_file); in config_file_getmem()
5245 m += getmem_str(cfg->dns64_prefix); in config_file_getmem()
5246 m += getmem_config_strlist(cfg->dns64_ignore_aaaa); in config_file_getmem()
5247 m += getmem_str(cfg->nat64_prefix); in config_file_getmem()
5248 m += getmem_str(cfg->dnstap_socket_path); in config_file_getmem()
5249 m += getmem_str(cfg->dnstap_ip); in config_file_getmem()
5250 m += getmem_str(cfg->dnstap_tls_server_name); in config_file_getmem()
5251 m += getmem_str(cfg->dnstap_tls_cert_bundle); in config_file_getmem()
5252 m += getmem_str(cfg->dnstap_tls_client_key_file); in config_file_getmem()
5253 m += getmem_str(cfg->dnstap_tls_client_cert_file); in config_file_getmem()
5254 m += getmem_str(cfg->dnstap_identity); in config_file_getmem()
5255 m += getmem_str(cfg->dnstap_version); in config_file_getmem()
5256 m += getmem_config_str2list(cfg->ratelimit_for_domain); in config_file_getmem()
5257 m += getmem_config_str2list(cfg->ratelimit_below_domain); in config_file_getmem()
5258 m += getmem_config_str2list(cfg->edns_client_strings); in config_file_getmem()
5259 m += getmem_str(cfg->dnscrypt_provider); in config_file_getmem()
5260 m += getmem_config_strlist(cfg->dnscrypt_secret_key); in config_file_getmem()
5261 m += getmem_config_strlist(cfg->dnscrypt_provider_cert); in config_file_getmem()
5262 m += getmem_config_strlist(cfg->dnscrypt_provider_cert_rotated); in config_file_getmem()
5264 m += getmem_config_strlist(cfg->ipsecmod_whitelist); in config_file_getmem()
5265 m += getmem_str(cfg->ipsecmod_hook); in config_file_getmem()
5268 m += getmem_str(cfg->cachedb_backend); in config_file_getmem()
5269 m += getmem_str(cfg->cachedb_secret); in config_file_getmem()
5271 m += getmem_str(cfg->redis_server_host); in config_file_getmem()
5272 m += getmem_str(cfg->redis_replica_server_host); in config_file_getmem()
5273 m += getmem_str(cfg->redis_server_path); in config_file_getmem()
5274 m += getmem_str(cfg->redis_replica_server_path); in config_file_getmem()
5275 m += getmem_str(cfg->redis_server_password); in config_file_getmem()
5276 m += getmem_str(cfg->redis_replica_server_password); in config_file_getmem()
5280 m += getmem_str(cfg->ipset_name_v4); in config_file_getmem()
5281 m += getmem_str(cfg->ipset_name_v6); in config_file_getmem()
5294 mem += views_get_mem(ct->views); in fr_printmem()
5295 mem += respip_set_get_mem(ct->respip_set); in fr_printmem()
5296 mem += auth_zones_get_mem(ct->auth_zones); in fr_printmem()
5297 mem += forwards_get_mem(ct->fwds); in fr_printmem()
5298 mem += hints_get_mem(ct->hints); in fr_printmem()
5299 mem += local_zones_get_mem(ct->local_zones); in fr_printmem()
5300 mem += acl_list_get_mem(ct->acl); in fr_printmem()
5301 mem += acl_list_get_mem(ct->acl_interface); in fr_printmem()
5302 mem += tcl_list_get_mem(ct->tcl); in fr_printmem()
5303 mem += edns_strings_get_mem(ct->edns_strings); in fr_printmem()
5304 mem += anchors_get_mem(ct->anchors); in fr_printmem()
5305 mem += sizeof(*ct->oldcfg); in fr_printmem()
5323 if(!setup_acl_for_ports(acl_interface, daemon->ports[0])) in ct_acl_interface_setup_ports()
5325 if(daemon->reuseport) { in ct_acl_interface_setup_ports()
5327 for(i=1; i<daemon->num_ports; i++) { in ct_acl_interface_setup_ports()
5329 daemon->ports[i])) in ct_acl_interface_setup_ports()
5347 item->old_z = old_z; in fr_add_auth_zone_change()
5348 item->new_z = new_z; in fr_add_auth_zone_change()
5349 item->is_deleted = is_deleted; in fr_add_auth_zone_change()
5350 item->is_added = is_added; in fr_add_auth_zone_change()
5351 item->is_changed = is_changed; in fr_add_auth_zone_change()
5353 item->next = fr->auth_zone_change_list; in fr_add_auth_zone_change()
5354 fr->auth_zone_change_list = item; in fr_add_auth_zone_change()
5367 if((m1->host && !m2->host) || (!m1->host && m2->host)) in xfr_auth_master_equal()
5369 if(m1->host && m2->host && strcmp(m1->host, m2->host) != 0) in xfr_auth_master_equal()
5372 if((m1->file && !m2->file) || (!m1->file && m2->file)) in xfr_auth_master_equal()
5374 if(m1->file && m2->file && strcmp(m1->file, m2->file) != 0) in xfr_auth_master_equal()
5377 if((m1->http && !m2->http) || (!m1->http && m2->http)) in xfr_auth_master_equal()
5379 if((m1->ixfr && !m2->ixfr) || (!m1->ixfr && m2->ixfr)) in xfr_auth_master_equal()
5381 if((m1->allow_notify && !m2->allow_notify) || (!m1->allow_notify && m2->allow_notify)) in xfr_auth_master_equal()
5383 if((m1->ssl && !m2->ssl) || (!m1->ssl && m2->ssl)) in xfr_auth_master_equal()
5385 if(m1->port != m2->port) in xfr_auth_master_equal()
5398 p1 = p1->next; in xfr_masterlist_equal()
5399 p2 = p2->next; in xfr_masterlist_equal()
5416 if(xfr_masterlist_equal(xfr1->task_probe->masters, in xfr_masters_equal()
5417 xfr2->task_probe->masters) && in xfr_masters_equal()
5418 xfr_masterlist_equal(xfr1->task_transfer->masters, in xfr_masters_equal()
5419 xfr2->task_transfer->masters)) in xfr_masters_equal()
5431 struct module_env* env = &fr->worker->env; in auth_zones_check_changes()
5433 fr->old_auth_zones = ct->auth_zones; in auth_zones_check_changes()
5436 lock_rw_rdlock(&ct->auth_zones->lock); in auth_zones_check_changes()
5440 lock_rw_rdlock(&env->auth_zones->lock); in auth_zones_check_changes()
5441 RBTREE_FOR(old_z, struct auth_zone*, &env->auth_zones->ztree) { in auth_zones_check_changes()
5442 new_z = auth_zone_find(ct->auth_zones, old_z->name, in auth_zones_check_changes()
5443 old_z->namelen, old_z->dclass); in auth_zones_check_changes()
5448 lock_rw_unlock(&env->auth_zones->lock); in auth_zones_check_changes()
5449 lock_rw_unlock(&ct->auth_zones->lock); in auth_zones_check_changes()
5454 lock_rw_unlock(&env->auth_zones->lock); in auth_zones_check_changes()
5457 RBTREE_FOR(new_z, struct auth_zone*, &ct->auth_zones->ztree) { in auth_zones_check_changes()
5458 lock_rw_rdlock(&env->auth_zones->lock); in auth_zones_check_changes()
5459 old_z = auth_zone_find(env->auth_zones, new_z->name, in auth_zones_check_changes()
5460 new_z->namelen, new_z->dclass); in auth_zones_check_changes()
5463 lock_rw_unlock(&env->auth_zones->lock); in auth_zones_check_changes()
5466 lock_rw_unlock(&ct->auth_zones->lock); in auth_zones_check_changes()
5473 lock_rw_rdlock(&new_z->lock); in auth_zones_check_changes()
5474 lock_rw_rdlock(&old_z->lock); in auth_zones_check_changes()
5475 new_xfr = auth_xfer_find(ct->auth_zones, new_z->name, in auth_zones_check_changes()
5476 new_z->namelen, new_z->dclass); in auth_zones_check_changes()
5477 old_xfr = auth_xfer_find(env->auth_zones, old_z->name, in auth_zones_check_changes()
5478 old_z->namelen, old_z->dclass); in auth_zones_check_changes()
5480 lock_basic_lock(&new_xfr->lock); in auth_zones_check_changes()
5483 lock_basic_lock(&old_xfr->lock); in auth_zones_check_changes()
5485 lock_rw_unlock(&env->auth_zones->lock); in auth_zones_check_changes()
5499 lock_rw_unlock(&old_z->lock); in auth_zones_check_changes()
5500 lock_rw_unlock(&new_z->lock); in auth_zones_check_changes()
5501 lock_rw_unlock(&ct->auth_zones->lock); in auth_zones_check_changes()
5503 lock_basic_unlock(&new_xfr->lock); in auth_zones_check_changes()
5506 lock_basic_unlock(&old_xfr->lock); in auth_zones_check_changes()
5513 lock_basic_unlock(&new_xfr->lock); in auth_zones_check_changes()
5516 lock_basic_unlock(&old_xfr->lock); in auth_zones_check_changes()
5518 lock_rw_unlock(&old_z->lock); in auth_zones_check_changes()
5519 lock_rw_unlock(&new_z->lock); in auth_zones_check_changes()
5523 lock_rw_unlock(&ct->auth_zones->lock); in auth_zones_check_changes()
5534 if(!(ct->views = views_create())) { in fr_construct_from_config()
5538 if(!views_apply_cfg(ct->views, newcfg)) { in fr_construct_from_config()
5545 if(!(ct->acl = acl_list_create())) { in fr_construct_from_config()
5549 if(!acl_list_apply_cfg(ct->acl, newcfg, ct->views)) { in fr_construct_from_config()
5556 if(!(ct->acl_interface = acl_list_create())) { in fr_construct_from_config()
5560 if(!ct_acl_interface_setup_ports(ct->acl_interface, in fr_construct_from_config()
5561 fr->worker->daemon)) { in fr_construct_from_config()
5565 if(!acl_interface_apply_cfg(ct->acl_interface, newcfg, ct->views)) { in fr_construct_from_config()
5572 if(!(ct->tcl = tcl_list_create())) { in fr_construct_from_config()
5576 if(!tcl_list_apply_cfg(ct->tcl, newcfg)) { in fr_construct_from_config()
5580 if(fr->worker->daemon->tcl->tree.count != 0) in fr_construct_from_config()
5581 fr->worker->daemon->fast_reload_tcl_has_changes = 1; in fr_construct_from_config()
5582 else fr->worker->daemon->fast_reload_tcl_has_changes = 0; in fr_construct_from_config()
5586 if(!(ct->auth_zones = auth_zones_create())) { in fr_construct_from_config()
5590 if(!auth_zones_apply_cfg(ct->auth_zones, newcfg, 1, &ct->use_rpz, in fr_construct_from_config()
5591 fr->worker->daemon->env, &fr->worker->daemon->mods)) { in fr_construct_from_config()
5602 if(!(ct->fwds = forwards_create())) { in fr_construct_from_config()
5606 if(!forwards_apply_cfg(ct->fwds, newcfg)) { in fr_construct_from_config()
5613 if(!(ct->hints = hints_create())) { in fr_construct_from_config()
5617 if(!hints_apply_cfg(ct->hints, newcfg)) { in fr_construct_from_config()
5624 if(!(ct->local_zones = local_zones_create())) { in fr_construct_from_config()
5628 if(!local_zones_apply_cfg(ct->local_zones, newcfg)) { in fr_construct_from_config()
5635 if(!(ct->respip_set = respip_set_create())) { in fr_construct_from_config()
5639 if(!respip_global_apply_cfg(ct->respip_set, newcfg)) { in fr_construct_from_config()
5645 if(!respip_views_apply_cfg(ct->views, newcfg, &have_view_respip_cfg)) { in fr_construct_from_config()
5649 ct->use_response_ip = !respip_set_is_empty(ct->respip_set) || in fr_construct_from_config()
5654 if(!(ct->edns_strings = edns_strings_create())) { in fr_construct_from_config()
5658 if(!edns_strings_apply_cfg(ct->edns_strings, newcfg)) { in fr_construct_from_config()
5665 if(fr->worker->env.anchors) { in fr_construct_from_config()
5667 if(!(ct->anchors = anchors_create())) { in fr_construct_from_config()
5671 if(!anchors_apply_cfg(ct->anchors, newcfg)) { in fr_construct_from_config()
5679 if(!val_env_parse_key_iter(newcfg->val_nsec3_key_iterations, in fr_construct_from_config()
5680 &ct->nsec3_keysize, &ct->nsec3_maxiter, in fr_construct_from_config()
5681 &ct->nsec3_keyiter_count)) { in fr_construct_from_config()
5688 if(!read_fetch_policy(&ct->target_fetch_policy, in fr_construct_from_config()
5689 &ct->max_dependency_depth, newcfg->target_fetch_policy)) { in fr_construct_from_config()
5693 if(!(ct->donotq = donotq_create())) { in fr_construct_from_config()
5697 if(!donotq_apply_cfg(ct->donotq, newcfg)) { in fr_construct_from_config()
5701 if(!(ct->priv = priv_create())) { in fr_construct_from_config()
5705 if(!priv_apply_cfg(ct->priv, newcfg)) { in fr_construct_from_config()
5709 if(newcfg->caps_whitelist) { in fr_construct_from_config()
5710 if(!(ct->caps_white = caps_white_create())) { in fr_construct_from_config()
5714 if(!caps_white_apply_cfg(ct->caps_white, newcfg)) { in fr_construct_from_config()
5719 if(!nat64_apply_cfg(&ct->nat64, newcfg)) { in fr_construct_from_config()
5726 if(!setup_wait_limits(&ct->wait_limits_netblock, in fr_construct_from_config()
5727 &ct->wait_limits_cookie_netblock, newcfg)) { in fr_construct_from_config()
5731 if(!setup_domain_limits(&ct->domain_limits, newcfg)) { in fr_construct_from_config()
5738 if(!(ct->oldcfg = (struct config_file*)calloc(1, in fr_construct_from_config()
5739 sizeof(*ct->oldcfg)))) { in fr_construct_from_config()
5744 if(fr->fr_verb >= 2) { in fr_construct_from_config()
5789 rbtree_type oldztree = az->ztree; in auth_zones_swap()
5790 int old_have_downstream = az->have_downstream; in auth_zones_swap()
5791 struct auth_zone* old_rpz_first = az->rpz_first; in auth_zones_swap()
5793 az->ztree = data->ztree; in auth_zones_swap()
5794 data->ztree = oldztree; in auth_zones_swap()
5796 az->have_downstream = data->have_downstream; in auth_zones_swap()
5797 data->have_downstream = old_have_downstream; in auth_zones_swap()
5802 az->rpz_first = data->rpz_first; in auth_zones_swap()
5803 data->rpz_first = old_rpz_first; in auth_zones_swap()
5818 #define COPY_VAR_int(var) oldcfg->var = cfg->var; atomic_store((_Atomic int*)&cfg->var, newcfg->var… in fr_atomic_copy_cfg()
5819 #define COPY_VAR_ptr(var) oldcfg->var = cfg->var; atomic_store((void* _Atomic*)&cfg->var, newcfg->v… in fr_atomic_copy_cfg()
5820 …e COPY_VAR_unsigned_int(var) oldcfg->var = cfg->var; atomic_store((_Atomic unsigned*)&cfg->var, ne… in fr_atomic_copy_cfg()
5821 #define COPY_VAR_size_t(var) oldcfg->var = cfg->var; atomic_store((_Atomic size_t*)&cfg->var, newcf… in fr_atomic_copy_cfg()
5822 #define COPY_VAR_uint8_t(var) oldcfg->var = cfg->var; atomic_store((_Atomic uint8_t*)&cfg->var, new… in fr_atomic_copy_cfg()
5823 …efine COPY_VAR_uint16_t(var) oldcfg->var = cfg->var; atomic_store((_Atomic uint16_t*)&cfg->var, ne… in fr_atomic_copy_cfg()
5824 …efine COPY_VAR_uint32_t(var) oldcfg->var = cfg->var; atomic_store((_Atomic uint32_t*)&cfg->var, ne… in fr_atomic_copy_cfg()
5825 #define COPY_VAR_int32_t(var) oldcfg->var = cfg->var; atomic_store((_Atomic int32_t*)&cfg->var, new… in fr_atomic_copy_cfg()
5827 * not updated by fast-reload +p. */ in fr_atomic_copy_cfg()
5832 * Use fast-reload without +p to update them together. */ in fr_atomic_copy_cfg()
6187 if(env->cfg->msg_cache_size != oldcfg->msg_cache_size) in fr_adjust_cache()
6188 slabhash_adjust_size(env->msg_cache, env->cfg->msg_cache_size); in fr_adjust_cache()
6189 if(env->cfg->rrset_cache_size != oldcfg->rrset_cache_size) in fr_adjust_cache()
6190 slabhash_adjust_size(&env->rrset_cache->table, in fr_adjust_cache()
6191 env->cfg->rrset_cache_size); in fr_adjust_cache()
6192 if(env->key_cache && in fr_adjust_cache()
6193 env->cfg->key_cache_size != oldcfg->key_cache_size) in fr_adjust_cache()
6194 slabhash_adjust_size(env->key_cache->slab, in fr_adjust_cache()
6195 env->cfg->key_cache_size); in fr_adjust_cache()
6196 if(env->cfg->infra_cache_numhosts != oldcfg->infra_cache_numhosts) { in fr_adjust_cache()
6197 size_t inframem = env->cfg->infra_cache_numhosts * in fr_adjust_cache()
6200 slabhash_adjust_size(env->infra_cache->hosts, inframem); in fr_adjust_cache()
6202 if(env->cfg->ratelimit_size != oldcfg->ratelimit_size) { in fr_adjust_cache()
6203 slabhash_adjust_size(env->infra_cache->domain_rates, in fr_adjust_cache()
6204 env->cfg->ratelimit_size); in fr_adjust_cache()
6205 slabhash_adjust_size(env->infra_cache->client_ip_rates, in fr_adjust_cache()
6206 env->cfg->ratelimit_size); in fr_adjust_cache()
6208 if(env->neg_cache && in fr_adjust_cache()
6209 env->cfg->neg_cache_size != oldcfg->neg_cache_size) { in fr_adjust_cache()
6210 val_neg_adjust_size(env->neg_cache, env->cfg->neg_cache_size); in fr_adjust_cache()
6228 m = modstack_find(env->modstack, "iterator"); in fr_adjust_iter_env()
6229 if(m != -1) iter_env = (struct iter_env*)env->modinfo[m]; in fr_adjust_iter_env()
6232 int* oldtargetfetchpolicy = iter_env->target_fetch_policy; in fr_adjust_iter_env()
6233 int oldmaxdependencydepth = iter_env->max_dependency_depth; in fr_adjust_iter_env()
6234 struct iter_donotq* olddonotq = iter_env->donotq; in fr_adjust_iter_env()
6235 struct iter_priv* oldpriv = iter_env->priv; in fr_adjust_iter_env()
6236 struct rbtree_type* oldcapswhite = iter_env->caps_white; in fr_adjust_iter_env()
6237 struct iter_nat64 oldnat64 = iter_env->nat64; in fr_adjust_iter_env()
6239 iter_env->target_fetch_policy = ct->target_fetch_policy; in fr_adjust_iter_env()
6240 iter_env->max_dependency_depth = ct->max_dependency_depth; in fr_adjust_iter_env()
6241 iter_env->donotq = ct->donotq; in fr_adjust_iter_env()
6242 iter_env->priv = ct->priv; in fr_adjust_iter_env()
6243 iter_env->caps_white = ct->caps_white; in fr_adjust_iter_env()
6244 iter_env->nat64 = ct->nat64; in fr_adjust_iter_env()
6245 iter_env->outbound_msg_retry = env->cfg->outbound_msg_retry; in fr_adjust_iter_env()
6246 iter_env->max_sent_count = env->cfg->max_sent_count; in fr_adjust_iter_env()
6247 iter_env->max_query_restarts = env->cfg->max_query_restarts; in fr_adjust_iter_env()
6249 ct->target_fetch_policy = oldtargetfetchpolicy; in fr_adjust_iter_env()
6250 ct->max_dependency_depth = oldmaxdependencydepth; in fr_adjust_iter_env()
6251 ct->donotq = olddonotq; in fr_adjust_iter_env()
6252 ct->priv = oldpriv; in fr_adjust_iter_env()
6253 ct->caps_white = oldcapswhite; in fr_adjust_iter_env()
6254 ct->nat64 = oldnat64; in fr_adjust_iter_env()
6265 if(env->cfg->bogus_ttl == oldcfg->bogus_ttl && in fr_adjust_val_env()
6266 env->cfg->val_date_override == oldcfg->val_date_override && in fr_adjust_val_env()
6267 env->cfg->val_sig_skew_min == oldcfg->val_sig_skew_min && in fr_adjust_val_env()
6268 env->cfg->val_sig_skew_max == oldcfg->val_sig_skew_max && in fr_adjust_val_env()
6269 env->cfg->val_max_restart == oldcfg->val_max_restart && in fr_adjust_val_env()
6270 strcmp(env->cfg->val_nsec3_key_iterations, in fr_adjust_val_env()
6271 oldcfg->val_nsec3_key_iterations) == 0) in fr_adjust_val_env()
6277 m = modstack_find(env->modstack, "validator"); in fr_adjust_val_env()
6278 if(m != -1) val_env = (struct val_env*)env->modinfo[m]; in fr_adjust_val_env()
6281 size_t* oldkeysize = val_env->nsec3_keysize; in fr_adjust_val_env()
6282 size_t* oldmaxiter = val_env->nsec3_maxiter; in fr_adjust_val_env()
6283 val_env->nsec3_keysize = NULL; in fr_adjust_val_env()
6284 val_env->nsec3_maxiter = NULL; in fr_adjust_val_env()
6285 val_env_apply_cfg(val_env, env->cfg, ct->nsec3_keysize, in fr_adjust_val_env()
6286 ct->nsec3_maxiter, ct->nsec3_keyiter_count); in fr_adjust_val_env()
6287 ct->nsec3_keysize = oldkeysize; in fr_adjust_val_env()
6288 ct->nsec3_maxiter = oldmaxiter; in fr_adjust_val_env()
6289 if(env->neg_cache) { in fr_adjust_val_env()
6290 lock_basic_lock(&env->neg_cache->lock); in fr_adjust_val_env()
6291 env->neg_cache->nsec3_max_iter = val_env-> in fr_adjust_val_env()
6292 nsec3_maxiter[val_env->nsec3_keyiter_count-1]; in fr_adjust_val_env()
6293 lock_basic_unlock(&env->neg_cache->lock); in fr_adjust_val_env()
6302 struct infra_cache* infra = env->infra_cache; in fr_adjust_infra()
6303 struct config_file* cfg = env->cfg; in fr_adjust_infra()
6304 struct rbtree_type oldwaitlim = infra->wait_limits_netblock; in fr_adjust_infra()
6306 infra->wait_limits_cookie_netblock; in fr_adjust_infra()
6307 struct rbtree_type olddomainlim = infra->domain_limits; in fr_adjust_infra()
6311 infra->host_ttl = cfg->host_ttl; in fr_adjust_infra()
6312 infra->infra_keep_probing = cfg->infra_keep_probing; in fr_adjust_infra()
6313 infra_dp_ratelimit = cfg->ratelimit; in fr_adjust_infra()
6314 infra_ip_ratelimit = cfg->ip_ratelimit; in fr_adjust_infra()
6315 infra_ip_ratelimit_cookie = cfg->ip_ratelimit_cookie; in fr_adjust_infra()
6316 infra->wait_limits_netblock = ct->wait_limits_netblock; in fr_adjust_infra()
6317 infra->wait_limits_cookie_netblock = ct->wait_limits_cookie_netblock; in fr_adjust_infra()
6318 infra->domain_limits = ct->domain_limits; in fr_adjust_infra()
6320 ct->wait_limits_netblock = oldwaitlim; in fr_adjust_infra()
6321 ct->wait_limits_cookie_netblock = oldwaitlimcookie; in fr_adjust_infra()
6322 ct->domain_limits = olddomainlim; in fr_adjust_infra()
6331 struct daemon* daemon = fr->worker->daemon; in fr_reload_config()
6332 struct module_env* env = daemon->env; in fr_reload_config()
6335 log_assert(ct->oldcfg); in fr_reload_config()
6336 log_assert(ct->fwds); in fr_reload_config()
6337 log_assert(ct->hints); in fr_reload_config()
6340 lock_rw_wrlock(&ct->views->lock); in fr_reload_config()
6341 lock_rw_wrlock(&env->views->lock); in fr_reload_config()
6342 lock_rw_wrlock(&ct->respip_set->lock); in fr_reload_config()
6343 lock_rw_wrlock(&env->respip_set->lock); in fr_reload_config()
6344 lock_rw_wrlock(&ct->local_zones->lock); in fr_reload_config()
6345 lock_rw_wrlock(&daemon->local_zones->lock); in fr_reload_config()
6346 lock_rw_wrlock(&ct->auth_zones->rpz_lock); in fr_reload_config()
6347 lock_rw_wrlock(&env->auth_zones->rpz_lock); in fr_reload_config()
6348 lock_rw_wrlock(&ct->auth_zones->lock); in fr_reload_config()
6349 lock_rw_wrlock(&env->auth_zones->lock); in fr_reload_config()
6350 lock_rw_wrlock(&ct->fwds->lock); in fr_reload_config()
6351 lock_rw_wrlock(&env->fwds->lock); in fr_reload_config()
6352 lock_rw_wrlock(&ct->hints->lock); in fr_reload_config()
6353 lock_rw_wrlock(&env->hints->lock); in fr_reload_config()
6354 if(ct->anchors) { in fr_reload_config()
6355 lock_basic_lock(&ct->anchors->lock); in fr_reload_config()
6356 lock_basic_lock(&env->anchors->lock); in fr_reload_config()
6360 if(fr->fr_nopause) { in fr_reload_config()
6361 fr_atomic_copy_cfg(ct->oldcfg, env->cfg, newcfg); in fr_reload_config()
6365 *ct->oldcfg = *env->cfg; in fr_reload_config()
6367 *env->cfg = *newcfg; in fr_reload_config()
6372 if(env->cfg->log_identity || ct->oldcfg->log_identity) { in fr_reload_config()
6374 log_ident_set_or_default(env->cfg->log_identity); in fr_reload_config()
6376 /* the newcfg elements are in env->cfg, so should not be freed here. */ in fr_reload_config()
6379 if(!fr->fr_nopause) in fr_reload_config()
6388 forwards_swap_tree(env->fwds, ct->fwds); in fr_reload_config()
6389 hints_swap_tree(env->hints, ct->hints); in fr_reload_config()
6390 views_swap_tree(env->views, ct->views); in fr_reload_config()
6391 acl_list_swap_tree(daemon->acl, ct->acl); in fr_reload_config()
6392 acl_list_swap_tree(daemon->acl_interface, ct->acl_interface); in fr_reload_config()
6393 tcl_list_swap_tree(daemon->tcl, ct->tcl); in fr_reload_config()
6394 local_zones_swap_tree(daemon->local_zones, ct->local_zones); in fr_reload_config()
6395 respip_set_swap_tree(env->respip_set, ct->respip_set); in fr_reload_config()
6396 daemon->use_response_ip = ct->use_response_ip; in fr_reload_config()
6397 daemon->use_rpz = ct->use_rpz; in fr_reload_config()
6398 auth_zones_swap(env->auth_zones, ct->auth_zones); in fr_reload_config()
6399 edns_strings_swap_tree(env->edns_strings, ct->edns_strings); in fr_reload_config()
6400 anchors_swap_tree(env->anchors, ct->anchors); in fr_reload_config()
6402 daemon->env->cachedb_enabled = cachedb_is_enabled(&daemon->mods, in fr_reload_config()
6403 daemon->env); in fr_reload_config()
6406 if(env->cfg->dnstap) { in fr_reload_config()
6407 if(!fr->fr_nopause) in fr_reload_config()
6408 dt_apply_cfg(daemon->dtenv, env->cfg); in fr_reload_config()
6409 else dt_apply_logcfg(daemon->dtenv, env->cfg); in fr_reload_config()
6412 fr_adjust_cache(env, ct->oldcfg); in fr_reload_config()
6413 if(!fr->fr_nopause) { in fr_reload_config()
6415 fr_adjust_val_env(env, ct, ct->oldcfg); in fr_reload_config()
6420 config_apply(env->cfg); in fr_reload_config()
6422 lock_rw_unlock(&ct->views->lock); in fr_reload_config()
6423 lock_rw_unlock(&env->views->lock); in fr_reload_config()
6424 lock_rw_unlock(&ct->respip_set->lock); in fr_reload_config()
6425 lock_rw_unlock(&env->respip_set->lock); in fr_reload_config()
6426 lock_rw_unlock(&ct->local_zones->lock); in fr_reload_config()
6427 lock_rw_unlock(&daemon->local_zones->lock); in fr_reload_config()
6428 lock_rw_unlock(&ct->auth_zones->lock); in fr_reload_config()
6429 lock_rw_unlock(&env->auth_zones->lock); in fr_reload_config()
6430 lock_rw_unlock(&ct->auth_zones->rpz_lock); in fr_reload_config()
6431 lock_rw_unlock(&env->auth_zones->rpz_lock); in fr_reload_config()
6432 lock_rw_unlock(&ct->fwds->lock); in fr_reload_config()
6433 lock_rw_unlock(&env->fwds->lock); in fr_reload_config()
6434 lock_rw_unlock(&ct->hints->lock); in fr_reload_config()
6435 lock_rw_unlock(&env->hints->lock); in fr_reload_config()
6436 if(ct->anchors) { in fr_reload_config()
6437 lock_basic_unlock(&ct->anchors->lock); in fr_reload_config()
6438 lock_basic_unlock(&env->anchors->lock); in fr_reload_config()
6444 /** fast reload, poll for ack incoming. */
6452 if(fr->need_to_quit) in fr_poll_for_ack()
6455 if(!sock_poll_timeout(fr->commpair[1], -1, 1, 0, NULL)) { in fr_poll_for_ack()
6467 ret = recv(fr->commpair[1], ((char*)&cmd)+bcount, in fr_poll_for_ack()
6468 sizeof(cmd)-bcount, 0); in fr_poll_for_ack()
6469 if(ret == -1) { in fr_poll_for_ack()
6494 fr->need_to_quit = 1; in fr_poll_for_ack()
6495 verbose(VERB_ALGO, "fast reload wait for ack: " in fr_poll_for_ack()
6500 verbose(VERB_ALGO, "fast reload wait for ack: " in fr_poll_for_ack()
6511 if(!fr->fr_nopause) { in fr_reload_ipc()
6518 if(!fr->fr_nopause) { in fr_reload_ipc()
6566 "config, check for errors with unbound-checkconf, or " in fr_load_config()
6598 if(fr->fr_nopause) { in fr_load_config()
6599 /* Poll every thread, with a no-work poll item over the in fr_load_config()
6629 log_thread_set(&fast_reload_thread->threadnum); in fast_reload_thread_main()
6632 if(fast_reload_thread->fr_verb >= 1) { in fast_reload_thread_main()
6640 if(fast_reload_thread->fr_verb >= 1) { in fast_reload_thread_main()
6655 if(fast_reload_thread->fr_verb >= 1) { in fast_reload_thread_main()
6669 if(!fast_reload_thread->need_to_quit) in fast_reload_thread_main()
6673 * fast_reload_notification_exit was received, ack it. If the in fast_reload_thread_main()
6674 * thread is exiting due to quit received earlier, also ack it.*/ in fast_reload_thread_main()
6676 if(fast_reload_thread->need_to_quit) in fast_reload_thread_main()
6693 if(socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1) { in create_socketpair()
6707 pair[0] = -1; in create_socketpair()
6708 pair[1] = -1; in create_socketpair()
6713 if(lst == -1) { in create_socketpair()
6722 == -1) { in create_socketpair()
6727 if(listen(lst, 12) == -1) { in create_socketpair()
6734 if(pair[1] == -1) { in create_socketpair()
6740 if(getsockname(lst, (struct sockaddr*)&baddr, &baddrlen) == -1) { in create_socketpair()
6745 pair[1] = -1; in create_socketpair()
6752 pair[1] = -1; in create_socketpair()
6756 if(connect(pair[1], (struct sockaddr*)&baddr, baddrlen) == -1) { in create_socketpair()
6761 pair[1] = -1; in create_socketpair()
6769 pair[1] = -1; in create_socketpair()
6776 pair[1] = -1; in create_socketpair()
6781 if(pair[0] == -1) { in create_socketpair()
6785 pair[1] = -1; in create_socketpair()
6793 pair[0] = -1; in create_socketpair()
6794 pair[1] = -1; in create_socketpair()
6803 pair[0] = -1; in create_socketpair()
6804 pair[1] = -1; in create_socketpair()
6809 == -1) { in create_socketpair()
6815 pair[0] = -1; in create_socketpair()
6816 pair[1] = -1; in create_socketpair()
6824 pair[0] = -1; in create_socketpair()
6825 pair[1] = -1; in create_socketpair()
6834 pair[0] = -1; in create_socketpair()
6835 pair[1] = -1; in create_socketpair()
6843 pair[0] = -1; in create_socketpair()
6844 pair[1] = -1; in create_socketpair()
6856 pair[0] = -1; in create_socketpair()
6857 pair[1] = -1; in create_socketpair()
6861 sizeof(nonce)-bcount, 0); in create_socketpair()
6862 if(ret == -1) { in create_socketpair()
6879 pair[0] = -1; in create_socketpair()
6880 pair[1] = -1; in create_socketpair()
6895 pair[0] = -1; in create_socketpair()
6896 pair[1] = -1; in create_socketpair()
6903 pair[0] = -1; in create_socketpair()
6904 pair[1] = -1; in create_socketpair()
6915 pair[0] = -1; in create_socketpair()
6916 pair[1] = -1; in create_socketpair()
6920 sizeof(nonce)-bcount, 0); in create_socketpair()
6921 if(ret == -1) { in create_socketpair()
6938 pair[0] = -1; in create_socketpair()
6939 pair[1] = -1; in create_socketpair()
6945 pair[0] = -1; in create_socketpair()
6946 pair[1] = -1; in create_socketpair()
6960 pair[0] = -1; in create_socketpair()
6961 pair[1] = -1; in create_socketpair()
6974 int numworkers = worker->daemon->num; in fast_reload_thread_setup()
6975 worker->daemon->fast_reload_thread = (struct fast_reload_thread*) in fast_reload_thread_setup()
6976 calloc(1, sizeof(*worker->daemon->fast_reload_thread)); in fast_reload_thread_setup()
6977 if(!worker->daemon->fast_reload_thread) in fast_reload_thread_setup()
6979 fr = worker->daemon->fast_reload_thread; in fast_reload_thread_setup()
6980 fr->fr_verb = fr_verb; in fast_reload_thread_setup()
6981 fr->fr_nopause = fr_nopause; in fast_reload_thread_setup()
6982 fr->fr_drop_mesh = fr_drop_mesh; in fast_reload_thread_setup()
6983 worker->daemon->fast_reload_drop_mesh = fr->fr_drop_mesh; in fast_reload_thread_setup()
6986 fr->threadnum = numworkers+2; in fast_reload_thread_setup()
6987 fr->commpair[0] = -1; in fast_reload_thread_setup()
6988 fr->commpair[1] = -1; in fast_reload_thread_setup()
6989 fr->commreload[0] = -1; in fast_reload_thread_setup()
6990 fr->commreload[1] = -1; in fast_reload_thread_setup()
6991 if(!create_socketpair(fr->commpair, worker->daemon->rand)) { in fast_reload_thread_setup()
6993 worker->daemon->fast_reload_thread = NULL; in fast_reload_thread_setup()
6996 fr->worker = worker; in fast_reload_thread_setup()
6997 fr->fr_output = (struct config_strlist_head*)calloc(1, in fast_reload_thread_setup()
6998 sizeof(*fr->fr_output)); in fast_reload_thread_setup()
6999 if(!fr->fr_output) { in fast_reload_thread_setup()
7000 sock_close(fr->commpair[0]); in fast_reload_thread_setup()
7001 sock_close(fr->commpair[1]); in fast_reload_thread_setup()
7003 worker->daemon->fast_reload_thread = NULL; in fast_reload_thread_setup()
7006 if(!create_socketpair(fr->commreload, worker->daemon->rand)) { in fast_reload_thread_setup()
7007 sock_close(fr->commpair[0]); in fast_reload_thread_setup()
7008 sock_close(fr->commpair[1]); in fast_reload_thread_setup()
7009 free(fr->fr_output); in fast_reload_thread_setup()
7011 worker->daemon->fast_reload_thread = NULL; in fast_reload_thread_setup()
7014 lock_basic_init(&fr->fr_output_lock); in fast_reload_thread_setup()
7015 lock_protect(&fr->fr_output_lock, fr->fr_output, in fast_reload_thread_setup()
7016 sizeof(*fr->fr_output)); in fast_reload_thread_setup()
7028 next = item->next; in fr_auth_change_list_delete()
7040 if(fast_reload_thread->service_event && in fast_reload_thread_desetup()
7041 fast_reload_thread->service_event_is_added) { in fast_reload_thread_desetup()
7042 ub_event_del(fast_reload_thread->service_event); in fast_reload_thread_desetup()
7043 fast_reload_thread->service_event_is_added = 0; in fast_reload_thread_desetup()
7045 if(fast_reload_thread->service_event) in fast_reload_thread_desetup()
7046 ub_event_free(fast_reload_thread->service_event); in fast_reload_thread_desetup()
7047 sock_close(fast_reload_thread->commpair[0]); in fast_reload_thread_desetup()
7048 sock_close(fast_reload_thread->commpair[1]); in fast_reload_thread_desetup()
7049 sock_close(fast_reload_thread->commreload[0]); in fast_reload_thread_desetup()
7050 sock_close(fast_reload_thread->commreload[1]); in fast_reload_thread_desetup()
7051 if(fast_reload_thread->printq) { in fast_reload_thread_desetup()
7054 if(fr_printq_empty(fast_reload_thread->printq)) { in fast_reload_thread_desetup()
7055 fr_printq_delete(fast_reload_thread->printq); in fast_reload_thread_desetup()
7063 fr_printq_list_insert(fast_reload_thread->printq, in fast_reload_thread_desetup()
7064 fast_reload_thread->worker->daemon); in fast_reload_thread_desetup()
7065 fast_reload_thread->printq = NULL; in fast_reload_thread_desetup()
7068 lock_basic_destroy(&fast_reload_thread->fr_output_lock); in fast_reload_thread_desetup()
7069 if(fast_reload_thread->fr_output) { in fast_reload_thread_desetup()
7070 config_delstrlist(fast_reload_thread->fr_output->first); in fast_reload_thread_desetup()
7071 free(fast_reload_thread->fr_output); in fast_reload_thread_desetup()
7073 fr_auth_change_list_delete(fast_reload_thread->auth_zone_change_list); in fast_reload_thread_desetup()
7100 if(!sock_poll_timeout(fr->commpair[0], in fr_send_cmd_to()
7101 (blocking?-1:IPC_NOTIFICATION_WAIT), in fr_send_cmd_to()
7108 /* keep static analyzer happy; send(-1,..) */ in fr_send_cmd_to()
7109 log_assert(fr->commpair[0] >= 0); in fr_send_cmd_to()
7110 ret = send(fr->commpair[0], ((char*)&cmd)+bcount, in fr_send_cmd_to()
7111 sizeof(cmd)-bcount, 0); in fr_send_cmd_to()
7112 if(ret == -1) { in fr_send_cmd_to()
7143 struct worker* worker = fr->worker; in fr_main_perform_done()
7145 ub_thread_join(fr->tid); in fr_main_perform_done()
7148 worker->daemon->fast_reload_thread = NULL; in fr_main_perform_done()
7156 if(!more->first) in cfg_strlist_append_listhead()
7158 if(list->last) in cfg_strlist_append_listhead()
7159 list->last->next = more->first; in cfg_strlist_append_listhead()
7161 list->first = more->first; in cfg_strlist_append_listhead()
7162 list->last = more->last; in cfg_strlist_append_listhead()
7173 lock_basic_lock(&fr->fr_output_lock); in fr_main_perform_printout()
7174 out.first = fr->fr_output->first; in fr_main_perform_printout()
7175 out.last = fr->fr_output->last; in fr_main_perform_printout()
7176 fr->fr_output->first = NULL; in fr_main_perform_printout()
7177 fr->fr_output->last = NULL; in fr_main_perform_printout()
7178 lock_basic_unlock(&fr->fr_output_lock); in fr_main_perform_printout()
7180 if(!fr->printq || !fr->printq->client_cp) { in fr_main_perform_printout()
7190 cfg_strlist_append_listhead(fr->printq->to_print, &out); in fr_main_perform_printout()
7193 if(!fr->printq->client_cp->event_added) in fr_main_perform_printout()
7194 comm_point_listen_for_rw(fr->printq->client_cp, 0, 1); in fr_main_perform_printout()
7197 /** fast reload, receive ack from workers that they are waiting, run
7202 struct daemon* daemon = fr->worker->daemon; in fr_read_ack_from_workers()
7203 /* Every worker sends one byte, wait for num-1 bytes. */ in fr_read_ack_from_workers()
7204 int count=0, total=daemon->num-1; in fr_read_ack_from_workers()
7208 ret = recv(fr->commreload[0], (void*)&r, 1, 0); in fr_read_ack_from_workers()
7209 if(ret == -1) { in fr_read_ack_from_workers()
7223 log_err("worker reload ack: recv failed: %s", in fr_read_ack_from_workers()
7228 verbose(VERB_ALGO, "worker reload ack from (uint8_t)%d", in fr_read_ack_from_workers()
7243 if(!sock_poll_timeout(fr->commpair[0], -1, 1, 0, NULL)) { in fr_poll_for_reload_start()
7255 ret = recv(fr->commpair[0], ((char*)&cmd)+bcount, in fr_poll_for_reload_start()
7256 sizeof(cmd)-bcount, 0); in fr_poll_for_reload_start()
7257 if(ret == -1) { in fr_poll_for_reload_start()
7282 verbose(VERB_ALGO, "fast reload wait for ack: " in fr_poll_for_reload_start()
7291 struct mesh_area* mesh = worker->env.mesh; in fr_worker_pickup_mesh()
7292 struct config_file* cfg = worker->env.cfg; in fr_worker_pickup_mesh()
7293 mesh->use_response_ip = worker->daemon->use_response_ip; in fr_worker_pickup_mesh()
7294 mesh->use_rpz = worker->daemon->use_rpz; in fr_worker_pickup_mesh()
7295 mesh->max_reply_states = cfg->num_queries_per_thread; in fr_worker_pickup_mesh()
7296 mesh->max_forever_states = (mesh->max_reply_states+1)/2; in fr_worker_pickup_mesh()
7298 mesh->jostle_max.tv_sec = (time_t)(cfg->jostle_time / 1000); in fr_worker_pickup_mesh()
7299 mesh->jostle_max.tv_usec = (time_t)((cfg->jostle_time % 1000)*1000); in fr_worker_pickup_mesh()
7312 l = front->cps; in tcl_remove_old()
7314 if(l->com->type == comm_tcp_accept) { in tcl_remove_old()
7316 for(i=0; i<l->com->max_tcp_count; i++) { in tcl_remove_old()
7317 if(l->com->tcp_handlers[i]->tcl_addr) { in tcl_remove_old()
7326 l->com->tcp_handlers[i]->tcl_addr = in tcl_remove_old()
7331 l = l->next; in tcl_remove_old()
7341 qinfo.qname_len = z->namelen; in auth_zone_zonemd_stop_lookup()
7342 qinfo.qname = z->name; in auth_zone_zonemd_stop_lookup()
7343 qinfo.qclass = z->dclass; in auth_zone_zonemd_stop_lookup()
7344 qinfo.qtype = z->zonemd_callback_qtype; in auth_zone_zonemd_stop_lookup()
7361 log_assert(namez->namelen <= sizeof(nm)); in fr_pickup_auth_locks()
7362 lock_rw_rdlock(&namez->lock); in fr_pickup_auth_locks()
7363 nmlen = namez->namelen; in fr_pickup_auth_locks()
7364 dclass = namez->dclass; in fr_pickup_auth_locks()
7365 memmove(nm, namez->name, nmlen); in fr_pickup_auth_locks()
7366 lock_rw_unlock(&namez->lock); in fr_pickup_auth_locks()
7368 lock_rw_wrlock(&worker->daemon->fast_reload_thread->old_auth_zones->lock); in fr_pickup_auth_locks()
7369 lock_rw_wrlock(&worker->env.auth_zones->lock); in fr_pickup_auth_locks()
7371 lock_rw_wrlock(&new_z->lock); in fr_pickup_auth_locks()
7374 lock_rw_wrlock(&old_z->lock); in fr_pickup_auth_locks()
7377 *loadxfr = auth_xfer_find(worker->daemon->fast_reload_thread-> in fr_pickup_auth_locks()
7380 *xfr = auth_xfer_find(worker->env.auth_zones, nm, nmlen, in fr_pickup_auth_locks()
7383 lock_basic_lock(&(*loadxfr)->lock); in fr_pickup_auth_locks()
7386 lock_basic_lock(&(*xfr)->lock); in fr_pickup_auth_locks()
7398 lock_rw_wrlock(&item->old_z->lock); in fr_worker_auth_del()
7399 if(item->old_z->zonemd_callback_env && in fr_worker_auth_del()
7400 item->old_z->zonemd_callback_env->worker == worker){ in fr_worker_auth_del()
7403 auth_zone_zonemd_stop_lookup(item->old_z, worker->env.mesh); in fr_worker_auth_del()
7404 item->old_z->zonemd_callback_env = NULL; in fr_worker_auth_del()
7406 lock_rw_unlock(&item->old_z->lock); in fr_worker_auth_del()
7408 fr_pickup_auth_locks(worker, item->old_z, item->old_z, NULL, &xfr, in fr_worker_auth_del()
7410 lock_rw_unlock(&worker->daemon->fast_reload_thread->old_auth_zones->lock); in fr_worker_auth_del()
7411 lock_rw_unlock(&worker->env.auth_zones->lock); in fr_worker_auth_del()
7412 lock_rw_unlock(&item->old_z->lock); in fr_worker_auth_del()
7415 if(xfr->task_nextprobe->worker == worker || in fr_worker_auth_del()
7416 xfr->task_probe->worker == worker || in fr_worker_auth_del()
7417 xfr->task_transfer->worker == worker) { in fr_worker_auth_del()
7421 lock_basic_unlock(&xfr->lock); in fr_worker_auth_del()
7424 if(!for_change && (released || worker->thread_num == 0)) { in fr_worker_auth_del()
7427 fr_pickup_auth_locks(worker, item->old_z, item->old_z, NULL, in fr_worker_auth_del()
7429 lock_rw_unlock(&worker->daemon->fast_reload_thread->old_auth_zones->lock); in fr_worker_auth_del()
7430 lock_rw_unlock(&item->old_z->lock); in fr_worker_auth_del()
7431 if(xfr && xfr->task_nextprobe->worker == NULL && in fr_worker_auth_del()
7432 xfr->task_probe->worker == NULL && in fr_worker_auth_del()
7433 xfr->task_transfer->worker == NULL) { in fr_worker_auth_del()
7434 (void)rbtree_delete(&worker->env.auth_zones->xtree, in fr_worker_auth_del()
7435 &xfr->node); in fr_worker_auth_del()
7436 lock_rw_unlock(&worker->env.auth_zones->lock); in fr_worker_auth_del()
7437 lock_basic_unlock(&xfr->lock); in fr_worker_auth_del()
7440 lock_rw_unlock(&worker->env.auth_zones->lock); in fr_worker_auth_del()
7442 lock_basic_unlock(&xfr->lock); in fr_worker_auth_del()
7453 log_assert(loadxfr->namelen == xfr->namelen); in auth_xfr_pickup_config()
7454 log_assert(loadxfr->namelabs == xfr->namelabs); in auth_xfr_pickup_config()
7455 log_assert(loadxfr->dclass == xfr->dclass); in auth_xfr_pickup_config()
7459 probe_masters = xfr->task_probe->masters; in auth_xfr_pickup_config()
7460 transfer_masters = xfr->task_transfer->masters; in auth_xfr_pickup_config()
7461 xfr->task_probe->masters = loadxfr->task_probe->masters; in auth_xfr_pickup_config()
7462 xfr->task_transfer->masters = loadxfr->task_transfer->masters; in auth_xfr_pickup_config()
7463 loadxfr->task_probe->masters = probe_masters; in auth_xfr_pickup_config()
7464 loadxfr->task_transfer->masters = transfer_masters; in auth_xfr_pickup_config()
7475 fr_pickup_auth_locks(worker, item->new_z, NULL, item->new_z, &xfr, in fr_worker_auth_add()
7477 if(xfr == NULL && item->new_z->zone_is_slave) { in fr_worker_auth_add()
7480 xfr = auth_xfer_create(worker->env.auth_zones, item->new_z); in fr_worker_auth_add()
7483 if(!xfr_find_soa(item->new_z, xfr)) { in fr_worker_auth_add()
7484 xfr->serial = 0; in fr_worker_auth_add()
7487 if(!xfr_find_soa(item->new_z, xfr)) { in fr_worker_auth_add()
7488 xfr->serial = 0; in fr_worker_auth_add()
7491 auth_zone_pickup_initial_zone(item->new_z, &worker->env); in fr_worker_auth_add()
7492 lock_rw_unlock(&item->new_z->lock); in fr_worker_auth_add()
7493 lock_rw_unlock(&worker->env.auth_zones->lock); in fr_worker_auth_add()
7494 lock_rw_unlock(&worker->daemon->fast_reload_thread->old_auth_zones->lock); in fr_worker_auth_add()
7496 lock_basic_unlock(&loadxfr->lock); in fr_worker_auth_add()
7499 auth_xfer_pickup_initial_zone(xfr, &worker->env); in fr_worker_auth_add()
7501 xfr->task_probe->only_lookup = 0; in fr_worker_auth_add()
7503 lock_basic_unlock(&xfr->lock); in fr_worker_auth_add()
7507 lock_rw_wrlock(&item->new_z->lock); in fr_worker_auth_add()
7509 auth_zone_verify_zonemd(item->new_z, &worker->env, in fr_worker_auth_add()
7510 &worker->env.mesh->mods, NULL, 0, 1); in fr_worker_auth_add()
7511 lock_rw_unlock(&item->new_z->lock); in fr_worker_auth_add()
7525 if(worker->thread_num != 0) in fr_worker_auth_cha()
7532 fr_pickup_auth_locks(worker, item->new_z, item->old_z, item->new_z, in fr_worker_auth_cha()
7543 (void)rbtree_delete(&worker->env.auth_zones->xtree, in fr_worker_auth_cha()
7544 &xfr->node); in fr_worker_auth_cha()
7546 item->new_z->zone_is_slave = 0; in fr_worker_auth_cha()
7549 xfr = auth_xfer_create(worker->env.auth_zones, item->new_z); in fr_worker_auth_cha()
7551 item->new_z->zone_is_slave = 1; in fr_worker_auth_cha()
7553 lock_rw_unlock(&item->new_z->lock); in fr_worker_auth_cha()
7554 lock_rw_unlock(&item->old_z->lock); in fr_worker_auth_cha()
7555 lock_rw_unlock(&worker->daemon->fast_reload_thread->old_auth_zones->lock); in fr_worker_auth_cha()
7556 lock_rw_unlock(&worker->env.auth_zones->lock); in fr_worker_auth_cha()
7558 lock_basic_unlock(&loadxfr->lock); in fr_worker_auth_cha()
7561 lock_basic_unlock(&xfr->lock); in fr_worker_auth_cha()
7576 for(item = auth_zone_change_list; item; item = item->next) { in fr_worker_pickup_auth_changes()
7577 if(item->is_deleted) { in fr_worker_pickup_auth_changes()
7580 if(item->is_added) { in fr_worker_pickup_auth_changes()
7581 if(worker->thread_num == 0) { in fr_worker_pickup_auth_changes()
7585 if(item->is_changed) { in fr_worker_pickup_auth_changes()
7595 struct outside_network* outnet = worker->back; in fr_worker_pickup_outside_network()
7596 struct config_file* cfg = worker->env.cfg; in fr_worker_pickup_outside_network()
7597 outnet->use_caps_for_id = cfg->use_caps_bits_for_id; in fr_worker_pickup_outside_network()
7598 outnet->unwanted_threshold = cfg->unwanted_threshold; in fr_worker_pickup_outside_network()
7599 outnet->tls_use_sni = cfg->tls_use_sni; in fr_worker_pickup_outside_network()
7600 outnet->tcp_mss = cfg->outgoing_tcp_mss; in fr_worker_pickup_outside_network()
7601 outnet->ip_dscp = cfg->ip_dscp; in fr_worker_pickup_outside_network()
7602 outnet->max_reuse_tcp_queries = cfg->max_reuse_tcp_queries; in fr_worker_pickup_outside_network()
7603 outnet->tcp_reuse_timeout = cfg->tcp_reuse_timeout; in fr_worker_pickup_outside_network()
7604 outnet->tcp_auth_query_timeout = cfg->tcp_auth_query_timeout; in fr_worker_pickup_outside_network()
7605 outnet->delayclose = cfg->delay_close; in fr_worker_pickup_outside_network()
7606 if(outnet->delayclose) { in fr_worker_pickup_outside_network()
7608 outnet->delay_tv.tv_sec = cfg->delay_close/1000; in fr_worker_pickup_outside_network()
7609 outnet->delay_tv.tv_usec = (cfg->delay_close%1000)*1000; in fr_worker_pickup_outside_network()
7620 * changes and store them in worker-specific structs. in fast_reload_worker_pickup_changes()
7631 if(worker->daemon->fast_reload_tcl_has_changes) in fast_reload_worker_pickup_changes()
7632 tcl_remove_old(worker->front); in fast_reload_worker_pickup_changes()
7637 worker->daemon->fast_reload_thread->auth_zone_change_list); in fast_reload_worker_pickup_changes()
7639 worker->env.cachedb_enabled = worker->daemon->env->cachedb_enabled; in fast_reload_worker_pickup_changes()
7645 * to other threads over IPC and collect their ack. When that is done,
7646 * ack to the caller, the fast reload thread, and wait for it to send start. */
7650 struct daemon* daemon = fr->worker->daemon; in fr_main_perform_reload_stop()
7654 for(i=0; i<daemon->num; i++) { in fr_main_perform_reload_stop()
7655 if(i == fr->worker->thread_num) in fr_main_perform_reload_stop()
7657 worker_send_cmd(daemon->workers[i], worker_cmd_reload_stop); in fr_main_perform_reload_stop()
7660 /* Wait for the other threads to ack. */ in fr_main_perform_reload_stop()
7663 /* Send ack to fast reload thread. */ in fr_main_perform_reload_stop()
7670 for(i=0; i<daemon->num; i++) { in fr_main_perform_reload_stop()
7671 if(i == fr->worker->thread_num) in fr_main_perform_reload_stop()
7673 worker_send_cmd(daemon->workers[i], worker_cmd_reload_start); in fr_main_perform_reload_stop()
7677 if(fr->worker->daemon->fast_reload_drop_mesh) { in fr_main_perform_reload_stop()
7679 mesh_delete_all(fr->worker->env.mesh); in fr_main_perform_reload_stop()
7681 fast_reload_worker_pickup_changes(fr->worker); in fr_main_perform_reload_stop()
7683 /* Wait for the other threads to ack. */ in fr_main_perform_reload_stop()
7686 /* Send ack to fast reload thread. */ in fr_main_perform_reload_stop()
7699 struct daemon* daemon = fr->worker->daemon; in fr_main_perform_reload_nopause_poll()
7704 for(i=0; i<daemon->num; i++) { in fr_main_perform_reload_nopause_poll()
7705 if(i == fr->worker->thread_num) in fr_main_perform_reload_nopause_poll()
7707 worker_send_cmd(daemon->workers[i], worker_cmd_reload_poll); in fr_main_perform_reload_nopause_poll()
7710 /* Wait for the other threads to ack. */ in fr_main_perform_reload_nopause_poll()
7712 fast_reload_worker_pickup_changes(fr->worker); in fr_main_perform_reload_nopause_poll()
7714 /* Send ack to fast reload thread. */ in fr_main_perform_reload_nopause_poll()
7747 /* keep static analyzer happy; recv(-1,..) */ in fr_main_handle_cmd()
7748 log_assert(fr->commpair[0] >= 0); in fr_main_handle_cmd()
7749 ret = recv(fr->commpair[0], in fr_main_handle_cmd()
7750 ((char*)&fr->service_read_cmd)+fr->service_read_cmd_count, in fr_main_handle_cmd()
7751 sizeof(fr->service_read_cmd)-fr->service_read_cmd_count, 0); in fr_main_handle_cmd()
7752 if(ret == -1) { in fr_main_handle_cmd()
7767 ub_winsock_tcp_wouldblock(fr->service_event, in fr_main_handle_cmd()
7777 fr->service_read_cmd_count = 0; in fr_main_handle_cmd()
7779 fr->service_read_cmd = fast_reload_notification_done_error; in fr_main_handle_cmd()
7780 } else if(ret + (ssize_t)fr->service_read_cmd_count < in fr_main_handle_cmd()
7781 (ssize_t)sizeof(fr->service_read_cmd)) { in fr_main_handle_cmd()
7782 fr->service_read_cmd_count += ret; in fr_main_handle_cmd()
7786 status = fr->service_read_cmd; in fr_main_handle_cmd()
7787 fr->service_read_cmd = 0; in fr_main_handle_cmd()
7788 fr->service_read_cmd_count = 0; in fr_main_handle_cmd()
7797 struct worker* worker = fr->worker; in fr_check_cmd_from_thread()
7799 while(worker->daemon->fast_reload_thread) { in fr_check_cmd_from_thread()
7800 if(!sock_poll_timeout(fr->commpair[0], 0, 1, 0, &inevent)) { in fr_check_cmd_from_thread()
7804 if(worker->daemon->fast_reload_thread) in fr_check_cmd_from_thread()
7805 ub_winsock_tcp_wouldblock(worker->daemon-> in fr_check_cmd_from_thread()
7806 fast_reload_thread->service_event, in fr_check_cmd_from_thread()
7813 if(worker->daemon->fast_reload_thread) in fr_check_cmd_from_thread()
7814 ub_winsock_tcp_wouldblock(worker->daemon-> in fr_check_cmd_from_thread()
7815 fast_reload_thread->service_event, in fr_check_cmd_from_thread()
7829 struct worker* worker = fast_reload_thread->worker; in fast_reload_service_cb()
7833 if(worker->daemon->fast_reload_thread != NULL) { in fast_reload_service_cb()
7842 * printed, 0 on wait later, or -1 on failure. */
7848 r = SSL_write(printq->remote.ssl, in fr_client_send_item_ssl()
7849 printq->client_item+printq->client_byte_count, in fr_client_send_item_ssl()
7850 printq->client_len - printq->client_byte_count); in fr_client_send_item_ssl()
7852 int want = SSL_get_error(printq->remote.ssl, r); in fr_client_send_item_ssl()
7856 return -1; in fr_client_send_item_ssl()
7859 printq->client_cp->ssl_shake_state = comm_ssl_shake_hs_read; in fr_client_send_item_ssl()
7860 comm_point_listen_for_rw(printq->client_cp, 1, 0); in fr_client_send_item_ssl()
7864 ub_winsock_tcp_wouldblock(comm_point_internal(printq->client_cp), UB_EV_WRITE); in fr_client_send_item_ssl()
7871 return -1; in fr_client_send_item_ssl()
7878 return -1; in fr_client_send_item_ssl()
7882 return -1; in fr_client_send_item_ssl()
7889 * later, or -1 on failure. */
7894 r = (int)send(printq->remote.fd, in fr_client_send_item_fd()
7895 printq->client_item+printq->client_byte_count, in fr_client_send_item_fd()
7896 printq->client_len - printq->client_byte_count, 0); in fr_client_send_item_fd()
7897 if(r == -1) { in fr_client_send_item_fd()
7911 ub_winsock_tcp_wouldblock(comm_point_internal(printq->client_cp), UB_EV_WRITE); in fr_client_send_item_fd()
7917 return -1; in fr_client_send_item_fd()
7928 if(printq->remote.ssl) { in fr_client_send_item()
7939 } else if(r == -1) { in fr_client_send_item()
7944 printq->client_byte_count += r; in fr_client_send_item()
7945 if(printq->client_byte_count < printq->client_len) in fr_client_send_item()
7956 if(!printq->to_print->first) { in fr_client_pickup_next_item()
7957 printq->client_item = NULL; in fr_client_pickup_next_item()
7958 printq->client_len = 0; in fr_client_pickup_next_item()
7959 printq->client_byte_count = 0; in fr_client_pickup_next_item()
7962 item = printq->to_print->first; in fr_client_pickup_next_item()
7963 if(item->next) { in fr_client_pickup_next_item()
7964 printq->to_print->first = item->next; in fr_client_pickup_next_item()
7966 printq->to_print->first = NULL; in fr_client_pickup_next_item()
7967 printq->to_print->last = NULL; in fr_client_pickup_next_item()
7969 item->next = NULL; in fr_client_pickup_next_item()
7970 printq->client_len = 0; in fr_client_pickup_next_item()
7971 printq->client_byte_count = 0; in fr_client_pickup_next_item()
7972 printq->client_item = item->str; in fr_client_pickup_next_item()
7973 item->str = NULL; in fr_client_pickup_next_item()
7977 if(printq->client_item) in fr_client_pickup_next_item()
7978 printq->client_len = (int)strlen(printq->client_item); in fr_client_pickup_next_item()
7985 if(!printq->client_cp) { in fast_reload_client_callback()
7995 if(printq->client_cp->ssl_shake_state == comm_ssl_shake_hs_read) { in fast_reload_client_callback()
7997 comm_point_listen_for_rw(printq->client_cp, 0, 1); in fast_reload_client_callback()
7998 printq->client_cp->ssl_shake_state = comm_ssl_shake_none; in fast_reload_client_callback()
8003 if(!printq->client_item) { in fast_reload_client_callback()
8006 if(!printq->client_item) { in fast_reload_client_callback()
8007 if(printq->in_list) { in fast_reload_client_callback()
8013 comm_point_stop_listening(printq->client_cp); in fast_reload_client_callback()
8018 while(printq->client_item) { in fast_reload_client_callback()
8020 if(printq->client_item && printq->client_len != 0 && in fast_reload_client_callback()
8021 printq->client_byte_count < printq->client_len) { in fast_reload_client_callback()
8027 if(printq->client_item) { in fast_reload_client_callback()
8028 free(printq->client_item); in fast_reload_client_callback()
8029 printq->client_item = NULL; in fast_reload_client_callback()
8030 printq->client_len = 0; in fast_reload_client_callback()
8031 printq->client_byte_count = 0; in fast_reload_client_callback()
8033 if(!printq->to_print->first) { in fast_reload_client_callback()
8034 if(printq->in_list) { in fast_reload_client_callback()
8040 comm_point_stop_listening(printq->client_cp); in fast_reload_client_callback()
8057 printq->to_print = calloc(1, sizeof(*printq->to_print)); in fr_printq_create()
8058 if(!printq->to_print) { in fr_printq_create()
8062 printq->worker = worker; in fr_printq_create()
8063 printq->client_cp = c; in fr_printq_create()
8064 printq->client_cp->callback = fast_reload_client_callback; in fr_printq_create()
8065 printq->client_cp->cb_arg = printq; in fr_printq_create()
8077 if(printq->remote.ssl) { in fr_printq_delete()
8078 SSL_shutdown(printq->remote.ssl); in fr_printq_delete()
8079 SSL_free(printq->remote.ssl); in fr_printq_delete()
8082 comm_point_delete(printq->client_cp); in fr_printq_delete()
8083 if(printq->to_print) { in fr_printq_delete()
8084 config_delstrlist(printq->to_print->first); in fr_printq_delete()
8085 free(printq->to_print); in fr_printq_delete()
8094 if(printq->to_print->first == NULL && printq->client_item == NULL) in fr_printq_empty()
8103 if(printq->in_list) in fr_printq_list_insert()
8105 printq->next = daemon->fast_reload_printq_list; in fr_printq_list_insert()
8106 if(printq->next) in fr_printq_list_insert()
8107 printq->next->prev = printq; in fr_printq_list_insert()
8108 printq->prev = NULL; in fr_printq_list_insert()
8109 printq->in_list = 1; in fr_printq_list_insert()
8110 daemon->fast_reload_printq_list = printq; in fr_printq_list_insert()
8119 next = printq->next; in fast_reload_printq_list_delete()
8129 struct daemon* daemon = printq->worker->daemon; in fr_printq_list_remove()
8130 if(printq->prev == NULL) in fr_printq_list_remove()
8131 daemon->fast_reload_printq_list = printq->next; in fr_printq_list_remove()
8132 else printq->prev->next = printq->next; in fr_printq_list_remove()
8133 if(printq->next) in fr_printq_list_remove()
8134 printq->next->prev = printq->prev; in fr_printq_list_remove()
8135 printq->in_list = 0; in fr_printq_list_remove()
8145 if(printq->worker->daemon->fast_reload_thread && in fr_printq_remove()
8146 printq->worker->daemon->fast_reload_thread->printq == printq) in fr_printq_remove()
8147 printq->worker->daemon->fast_reload_thread->printq = NULL; in fr_printq_remove()
8148 if(printq->in_list) in fr_printq_remove()
8165 if(worker->daemon->fast_reload_thread) { in fast_reload_thread_start()
8175 worker->daemon->fast_reload_thread->started = 1; in fast_reload_thread_start()
8185 fd_set_nonblock(worker->daemon->fast_reload_thread->commpair[0]); in fast_reload_thread_start()
8186 worker->daemon->fast_reload_thread->service_event = ub_event_new( in fast_reload_thread_start()
8187 comm_base_internal(worker->base), in fast_reload_thread_start()
8188 worker->daemon->fast_reload_thread->commpair[0], in fast_reload_thread_start()
8190 worker->daemon->fast_reload_thread); in fast_reload_thread_start()
8191 if(!worker->daemon->fast_reload_thread->service_event) { in fast_reload_thread_start()
8192 fast_reload_thread_desetup(worker->daemon->fast_reload_thread); in fast_reload_thread_start()
8197 if(ub_event_add(worker->daemon->fast_reload_thread->service_event, in fast_reload_thread_start()
8199 fast_reload_thread_desetup(worker->daemon->fast_reload_thread); in fast_reload_thread_start()
8204 worker->daemon->fast_reload_thread->service_event_is_added = 1; in fast_reload_thread_start()
8210 state_list_remove_elem(&s->rc->busy_list, s->c); in fast_reload_thread_start()
8211 s->rc->active --; in fast_reload_thread_start()
8215 fd_set_nonblock(s->c->fd); in fast_reload_thread_start()
8216 worker->daemon->fast_reload_thread->printq = fr_printq_create(s->c, in fast_reload_thread_start()
8218 if(!worker->daemon->fast_reload_thread->printq) { in fast_reload_thread_start()
8219 fast_reload_thread_desetup(worker->daemon->fast_reload_thread); in fast_reload_thread_start()
8224 worker->daemon->fast_reload_thread->printq->remote = *ssl; in fast_reload_thread_start()
8225 s->rc = NULL; /* move away the rc state */ in fast_reload_thread_start()
8227 comm_point_stop_listening(worker->daemon->fast_reload_thread->printq->client_cp); in fast_reload_thread_start()
8230 ub_thread_create(&worker->daemon->fast_reload_thread->tid, in fast_reload_thread_start()
8231 fast_reload_thread_main, worker->daemon->fast_reload_thread); in fast_reload_thread_start()
8240 struct worker* worker = fast_reload_thread->worker; in fast_reload_thread_stop()
8244 if(worker->daemon->fast_reload_thread != NULL) { in fast_reload_thread_stop()