Lines Matching refs:base
164 struct evdns_base *base; member
199 struct evdns_base *base; member
239 struct evdns_base *base; member
306 struct evdns_server_request base; member
396 (((char*)(base_ptr) - evutil_offsetof(struct server_request, base))))
398 #define REQ_HEAD(base, id) ((base)->req_heads[id % (base)->n_req_heads]) argument
400 static struct nameserver *nameserver_pick(struct evdns_base *base);
404 static int evdns_transmit(struct evdns_base *base);
409 static struct request *search_request_new(struct evdns_base *base, struct evdns_request *handle, in…
410 static void evdns_requests_pump_waiting_queue(struct evdns_base *base);
411 static u16 transaction_id_pick(struct evdns_base *base);
412 static struct request *request_new(struct evdns_base *base, struct evdns_request *handle, int type,…
419 static int evdns_base_resolv_conf_parse_impl(struct evdns_base *base, int flags, const char *const …
420 static int evdns_base_set_option_impl(struct evdns_base *base,
422 static void evdns_base_free_and_unlock(struct evdns_base *base, int fail_requests);
428 #define EVDNS_LOCK(base) EVUTIL_NIL_STMT_ argument
429 #define EVDNS_UNLOCK(base) EVUTIL_NIL_STMT_ argument
430 #define ASSERT_LOCKED(base) EVUTIL_NIL_STMT_ argument
432 #define EVDNS_LOCK(base) \ argument
433 EVLOCK_LOCK((base)->lock, 0)
434 #define EVDNS_UNLOCK(base) \ argument
435 EVLOCK_UNLOCK((base)->lock, 0)
436 #define ASSERT_LOCKED(base) \ argument
437 EVLOCK_ASSERT_LOCKED((base)->lock)
477 request_find_from_trans_id(struct evdns_base *base, u16 trans_id) { in request_find_from_trans_id() argument
478 struct request *req = REQ_HEAD(base, trans_id); in request_find_from_trans_id()
481 ASSERT_LOCKED(base); in request_find_from_trans_id()
501 EVDNS_LOCK(ns->base); in nameserver_prod_callback()
503 EVDNS_UNLOCK(ns->base); in nameserver_prod_callback()
514 ASSERT_LOCKED(ns->base); in nameserver_probe_failed()
525 memcpy(&timeout, &ns->base->global_nameserver_probe_initial_timeout, in nameserver_probe_failed()
568 struct evdns_base *base = ns->base; in nameserver_failed() local
572 ASSERT_LOCKED(base); in nameserver_failed()
583 base->global_good_nameservers--; in nameserver_failed()
584 EVUTIL_ASSERT(base->global_good_nameservers >= 0); in nameserver_failed()
585 if (base->global_good_nameservers == 0) { in nameserver_failed()
593 &base->global_nameserver_probe_initial_timeout) < 0) { in nameserver_failed()
608 if (!base->global_good_nameservers) return; in nameserver_failed()
610 for (i = 0; i < base->n_req_heads; ++i) { in nameserver_failed()
611 req = started_at = base->req_heads[i]; in nameserver_failed()
617 request_swap_ns(req, nameserver_pick(base)); in nameserver_failed()
629 ASSERT_LOCKED(ns->base); in nameserver_up()
637 evdns_cancel_request(ns->base, ns->probe_request); in nameserver_up()
643 ns->base->global_good_nameservers++; in nameserver_up()
658 struct evdns_base *base = req->base; in request_finished() local
659 int was_inflight = (head != &base->req_waiting_head); in request_finished()
660 EVDNS_LOCK(base); in request_finished()
669 base->global_requests_inflight--; in request_finished()
672 base->global_requests_waiting--; in request_finished()
679 req->base->disable_when_inactive) { in request_finished()
712 evdns_requests_pump_waiting_queue(base); in request_finished()
713 EVDNS_UNLOCK(base); in request_finished()
725 ASSERT_LOCKED(req->base); in request_reissue()
730 request_swap_ns(req, nameserver_pick(req->base)); in request_reissue()
751 evdns_requests_pump_waiting_queue(struct evdns_base *base) { in evdns_requests_pump_waiting_queue() argument
752 ASSERT_LOCKED(base); in evdns_requests_pump_waiting_queue()
753 while (base->global_requests_inflight < base->global_max_requests_inflight && in evdns_requests_pump_waiting_queue()
754 base->global_requests_waiting) { in evdns_requests_pump_waiting_queue()
757 EVUTIL_ASSERT(base->req_waiting_head); in evdns_requests_pump_waiting_queue()
758 req = base->req_waiting_head; in evdns_requests_pump_waiting_queue()
760 req->ns = nameserver_pick(base); in evdns_requests_pump_waiting_queue()
767 evdns_request_remove(req, &base->req_waiting_head); in evdns_requests_pump_waiting_queue()
769 base->global_requests_waiting--; in evdns_requests_pump_waiting_queue()
770 base->global_requests_inflight++; in evdns_requests_pump_waiting_queue()
772 request_trans_id_set(req, transaction_id_pick(base)); in evdns_requests_pump_waiting_queue()
774 evdns_request_insert(req, &REQ_HEAD(base, req->trans_id)); in evdns_requests_pump_waiting_queue()
776 evdns_transmit(base); in evdns_requests_pump_waiting_queue()
848 ASSERT_LOCKED(req->base); in reply_schedule_callback()
870 req->base->event_base, in reply_schedule_callback()
897 ASSERT_LOCKED(req->base); in reply_handle()
921 if (req->reissue_count < req->base->global_max_reissues) { in reply_handle()
969 request_finished(req, &REQ_HEAD(req->base, req->trans_id), 1); in reply_handle()
976 request_finished(req, &REQ_HEAD(req->base, req->trans_id), 1); in reply_handle()
1038 reply_parse(struct evdns_base *base, u8 *packet, int length) { in reply_parse() argument
1052 ASSERT_LOCKED(base); in reply_parse()
1063 req = request_find_from_trans_id(base, trans_id); in reply_parse()
1065 EVUTIL_ASSERT(req->base == base); in reply_parse()
1100 if (!base->global_randomize_case) { in reply_parse()
1271 server_req->base.flags = flags; in request_parse()
1272 server_req->base.nquestions = 0; in request_parse()
1273 server_req->base.questions = mm_calloc(sizeof(struct evdns_server_question *), questions); in request_parse()
1274 if (server_req->base.questions == NULL) in request_parse()
1292 server_req->base.questions[server_req->base.nquestions++] = q; in request_parse()
1302 evdns_server_request_respond(&(server_req->base), DNS_ERR_NOTIMPL); in request_parse()
1306 port->user_callback(&(server_req->base), port->user_data); in request_parse()
1310 if (server_req->base.questions) { in request_parse()
1311 for (i = 0; i < server_req->base.nquestions; ++i) in request_parse()
1312 mm_free(server_req->base.questions[i]); in request_parse()
1313 mm_free(server_req->base.questions); in request_parse()
1337 transaction_id_pick(struct evdns_base *base) { in transaction_id_pick() argument
1338 ASSERT_LOCKED(base); in transaction_id_pick()
1345 if (request_find_from_trans_id(base, trans_id) == NULL) in transaction_id_pick()
1354 nameserver_pick(struct evdns_base *base) { in nameserver_pick() argument
1355 struct nameserver *started_at = base->server_head, *picked; in nameserver_pick()
1356 ASSERT_LOCKED(base); in nameserver_pick()
1357 if (!base->server_head) return NULL; in nameserver_pick()
1361 if (!base->global_good_nameservers) { in nameserver_pick()
1362 base->server_head = base->server_head->next; in nameserver_pick()
1363 return base->server_head; in nameserver_pick()
1368 if (base->server_head->state) { in nameserver_pick()
1370 picked = base->server_head; in nameserver_pick()
1371 base->server_head = base->server_head->next; in nameserver_pick()
1375 base->server_head = base->server_head->next; in nameserver_pick()
1376 if (base->server_head == started_at) { in nameserver_pick()
1380 EVUTIL_ASSERT(base->global_good_nameservers == 0); in nameserver_pick()
1381 picked = base->server_head; in nameserver_pick()
1382 base->server_head = base->server_head->next; in nameserver_pick()
1395 ASSERT_LOCKED(ns->base); in nameserver_read()
1420 reply_parse(ns->base, packet, r); in nameserver_read()
1492 ASSERT_LOCKED(ns->base); in nameserver_write_waiting()
1497 event_assign(&ns->event, ns->base->event_base, in nameserver_write_waiting()
1517 EVDNS_LOCK(ns->base); in nameserver_ready_callback()
1520 if (!evdns_transmit(ns->base)) { in nameserver_ready_callback()
1527 EVDNS_UNLOCK(ns->base); in nameserver_ready_callback()
1727 evdns_add_server_port_with_base(struct event_base *base, evutil_socket_t socket, int flags, evdns_r… in evdns_add_server_port_with_base() argument
1744 port->event_base = base; in evdns_add_server_port_with_base()
1906 req->base.flags &= ~(EVDNS_FLAGS_AA|EVDNS_FLAGS_RD); in evdns_server_request_set_flags()
1907 req->base.flags |= flags; in evdns_server_request_set_flags()
1926 flags = req->base.flags; in evdns_server_request_format_response()
1932 APPEND16(req->base.nquestions); in evdns_server_request_format_response()
1938 for (i=0; i < req->base.nquestions; ++i) { in evdns_server_request_format_response()
1939 const char *s = req->base.questions[i]->name; in evdns_server_request_format_response()
1945 APPEND16(req->base.questions[i]->type); in evdns_server_request_format_response()
1946 APPEND16(req->base.questions[i]->dns_question_class); in evdns_server_request_format_response()
2097 if (req->base.questions) { in server_request_free()
2098 for (i = 0; i < req->base.nquestions; ++i) in server_request_free()
2099 mm_free(req->base.questions[i]); in server_request_free()
2100 mm_free(req->base.questions); in server_request_free()
2183 struct evdns_base *base = req->base; in evdns_request_timeout_callback() local
2189 EVDNS_LOCK(base); in evdns_request_timeout_callback()
2191 if (req->tx_count >= req->base->global_max_retransmits) { in evdns_request_timeout_callback()
2198 request_finished(req, &REQ_HEAD(req->base, req->trans_id), 1); in evdns_request_timeout_callback()
2205 request_swap_ns(req, nameserver_pick(base)); in evdns_request_timeout_callback()
2209 if (req->ns->timedout > req->base->global_max_nameserver_timeout) { in evdns_request_timeout_callback()
2215 EVDNS_UNLOCK(base); in evdns_request_timeout_callback()
2227 ASSERT_LOCKED(req->base); in evdns_request_transmit_to()
2231 req->base->disable_when_inactive && in evdns_request_transmit_to()
2261 ASSERT_LOCKED(req->base); in evdns_request_transmit()
2297 if (evtimer_add(&req->timeout_event, &req->base->global_timeout) < 0) { in evdns_request_transmit()
2324 EVDNS_LOCK(ns->base); in nameserver_probe_callback()
2332 EVDNS_UNLOCK(ns->base); in nameserver_probe_callback()
2343 ASSERT_LOCKED(ns->base); in nameserver_send_probe()
2350 …req = request_new(ns->base, handle, TYPE_A, "google.com", DNS_QUERY_NO_SEARCH, nameserver_probe_ca… in nameserver_send_probe()
2357 request_trans_id_set(req, transaction_id_pick(ns->base)); in nameserver_send_probe()
2366 evdns_transmit(struct evdns_base *base) { in evdns_transmit() argument
2370 ASSERT_LOCKED(base); in evdns_transmit()
2371 for (i = 0; i < base->n_req_heads; ++i) { in evdns_transmit()
2372 if (base->req_heads[i]) { in evdns_transmit()
2373 struct request *const started_at = base->req_heads[i], *req = started_at; in evdns_transmit()
2391 evdns_base_count_nameservers(struct evdns_base *base) in evdns_base_count_nameservers() argument
2396 EVDNS_LOCK(base); in evdns_base_count_nameservers()
2397 server = base->server_head; in evdns_base_count_nameservers()
2403 } while (server != base->server_head); in evdns_base_count_nameservers()
2405 EVDNS_UNLOCK(base); in evdns_base_count_nameservers()
2417 evdns_base_clear_nameservers_and_suspend(struct evdns_base *base) in evdns_base_clear_nameservers_and_suspend() argument
2422 EVDNS_LOCK(base); in evdns_base_clear_nameservers_and_suspend()
2423 server = base->server_head; in evdns_base_clear_nameservers_and_suspend()
2424 started_at = base->server_head; in evdns_base_clear_nameservers_and_suspend()
2426 EVDNS_UNLOCK(base); in evdns_base_clear_nameservers_and_suspend()
2435 evdns_cancel_request(server->base, server->probe_request); in evdns_base_clear_nameservers_and_suspend()
2445 base->server_head = NULL; in evdns_base_clear_nameservers_and_suspend()
2446 base->global_good_nameservers = 0; in evdns_base_clear_nameservers_and_suspend()
2448 for (i = 0; i < base->n_req_heads; ++i) { in evdns_base_clear_nameservers_and_suspend()
2450 req = req_started_at = base->req_heads[i]; in evdns_base_clear_nameservers_and_suspend()
2460 base->global_requests_waiting++; in evdns_base_clear_nameservers_and_suspend()
2461 evdns_request_insert(req, &base->req_waiting_head); in evdns_base_clear_nameservers_and_suspend()
2466 base->req_waiting_head = base->req_waiting_head->prev; in evdns_base_clear_nameservers_and_suspend()
2472 base->req_heads[i] = NULL; in evdns_base_clear_nameservers_and_suspend()
2475 base->global_requests_inflight = 0; in evdns_base_clear_nameservers_and_suspend()
2477 EVDNS_UNLOCK(base); in evdns_base_clear_nameservers_and_suspend()
2490 evdns_base_resume(struct evdns_base *base) in evdns_base_resume() argument
2492 EVDNS_LOCK(base); in evdns_base_resume()
2493 evdns_requests_pump_waiting_queue(base); in evdns_base_resume()
2494 EVDNS_UNLOCK(base); in evdns_base_resume()
2506 evdns_nameserver_add_impl_(struct evdns_base *base, const struct sockaddr *address, int addrlen) { in evdns_nameserver_add_impl_() argument
2509 const struct nameserver *server = base->server_head, *const started_at = base->server_head; in evdns_nameserver_add_impl_()
2514 ASSERT_LOCKED(base); in evdns_nameserver_add_impl_()
2530 ns->base = base; in evdns_nameserver_add_impl_()
2532 evtimer_assign(&ns->timeout_event, ns->base->event_base, nameserver_prod_callback, ns); in evdns_nameserver_add_impl_()
2538 if (base->global_outgoing_addrlen && in evdns_nameserver_add_impl_()
2541 (struct sockaddr*)&base->global_outgoing_address, in evdns_nameserver_add_impl_()
2542 base->global_outgoing_addrlen) < 0) { in evdns_nameserver_add_impl_()
2549 if (base->so_rcvbuf) { in evdns_nameserver_add_impl_()
2551 (void *)&base->so_rcvbuf, sizeof(base->so_rcvbuf))) { in evdns_nameserver_add_impl_()
2552 log(EVDNS_LOG_WARN, "Couldn't set SO_RCVBUF to %i", base->so_rcvbuf); in evdns_nameserver_add_impl_()
2557 if (base->so_sndbuf) { in evdns_nameserver_add_impl_()
2559 (void *)&base->so_sndbuf, sizeof(base->so_sndbuf))) { in evdns_nameserver_add_impl_()
2560 log(EVDNS_LOG_WARN, "Couldn't set SO_SNDBUF to %i", base->so_sndbuf); in evdns_nameserver_add_impl_()
2569 event_assign(&ns->event, ns->base->event_base, ns->socket, in evdns_nameserver_add_impl_()
2571 if (!base->disable_when_inactive && event_add(&ns->event, NULL) < 0) { in evdns_nameserver_add_impl_()
2580 if (!base->server_head) { in evdns_nameserver_add_impl_()
2582 base->server_head = ns; in evdns_nameserver_add_impl_()
2584 ns->next = base->server_head->next; in evdns_nameserver_add_impl_()
2585 ns->prev = base->server_head; in evdns_nameserver_add_impl_()
2586 base->server_head->next = ns; in evdns_nameserver_add_impl_()
2590 base->global_good_nameservers++; in evdns_nameserver_add_impl_()
2606 evdns_base_nameserver_add(struct evdns_base *base, unsigned long int address) in evdns_base_nameserver_add() argument
2614 EVDNS_LOCK(base); in evdns_base_nameserver_add()
2615 res = evdns_nameserver_add_impl_(base, (struct sockaddr*)&sin, sizeof(sin)); in evdns_base_nameserver_add()
2616 EVDNS_UNLOCK(base); in evdns_base_nameserver_add()
2651 evdns_base_nameserver_ip_add(struct evdns_base *base, const char *ip_as_string) { in evdns_base_nameserver_ip_add() argument
2666 EVDNS_LOCK(base); in evdns_base_nameserver_ip_add()
2667 res = evdns_nameserver_add_impl_(base, sa, len); in evdns_base_nameserver_ip_add()
2668 EVDNS_UNLOCK(base); in evdns_base_nameserver_ip_add()
2680 evdns_base_nameserver_sockaddr_add(struct evdns_base *base, in evdns_base_nameserver_sockaddr_add() argument
2684 EVUTIL_ASSERT(base); in evdns_base_nameserver_sockaddr_add()
2685 EVDNS_LOCK(base); in evdns_base_nameserver_sockaddr_add()
2686 res = evdns_nameserver_add_impl_(base, sa, len); in evdns_base_nameserver_sockaddr_add()
2687 EVDNS_UNLOCK(base); in evdns_base_nameserver_sockaddr_add()
2692 evdns_base_get_nameserver_addr(struct evdns_base *base, int idx, in evdns_base_get_nameserver_addr() argument
2698 EVDNS_LOCK(base); in evdns_base_get_nameserver_addr()
2699 server = base->server_head; in evdns_base_get_nameserver_addr()
2701 if (server->next == base->server_head) in evdns_base_get_nameserver_addr()
2715 EVDNS_UNLOCK(base); in evdns_base_get_nameserver_addr()
2723 ASSERT_LOCKED(req->base); in evdns_request_remove()
2760 ASSERT_LOCKED(req->base); in evdns_request_insert()
2785 request_new(struct evdns_base *base, struct evdns_request *handle, int type, in request_new() argument
2790 (base->global_requests_inflight < base->global_max_requests_inflight) ? 1 : 0; in request_new()
2794 const u16 trans_id = issuing_now ? transaction_id_pick(base) : 0xffff; in request_new()
2802 ASSERT_LOCKED(base); in request_new()
2812 req->base = base; in request_new()
2814 evtimer_assign(&req->timeout_event, req->base->event_base, evdns_request_timeout_callback, req); in request_new()
2816 if (base->global_randomize_case) { in request_new()
2847 req->ns = issuing_now ? nameserver_pick(base) : NULL; in request_new()
2852 handle->base = base; in request_new()
2863 struct evdns_base *base = req->base; in request_submit() local
2864 ASSERT_LOCKED(base); in request_submit()
2869 evdns_request_insert(req, &REQ_HEAD(base, req->trans_id)); in request_submit()
2871 base->global_requests_inflight++; in request_submit()
2876 evdns_request_insert(req, &base->req_waiting_head); in request_submit()
2877 base->global_requests_waiting++; in request_submit()
2883 evdns_cancel_request(struct evdns_base *base, struct evdns_request *handle) in evdns_cancel_request() argument
2890 if (!base) { in evdns_cancel_request()
2892 base = handle->base; in evdns_cancel_request()
2893 if (!base) in evdns_cancel_request()
2894 base = handle->current_req->base; in evdns_cancel_request()
2897 EVDNS_LOCK(base); in evdns_cancel_request()
2899 EVDNS_UNLOCK(base); in evdns_cancel_request()
2909 request_finished(req, &REQ_HEAD(base, req->trans_id), 1); in evdns_cancel_request()
2912 request_finished(req, &base->req_waiting_head, 1); in evdns_cancel_request()
2914 EVDNS_UNLOCK(base); in evdns_cancel_request()
2919 evdns_base_resolve_ipv4(struct evdns_base *base, const char *name, int flags, in evdns_base_resolve_ipv4() argument
2927 EVDNS_LOCK(base); in evdns_base_resolve_ipv4()
2930 request_new(base, handle, TYPE_A, name, flags, in evdns_base_resolve_ipv4()
2935 search_request_new(base, handle, TYPE_A, name, flags, in evdns_base_resolve_ipv4()
2942 EVDNS_UNLOCK(base); in evdns_base_resolve_ipv4()
2956 evdns_base_resolve_ipv6(struct evdns_base *base, in evdns_base_resolve_ipv6() argument
2966 EVDNS_LOCK(base); in evdns_base_resolve_ipv6()
2968 req = request_new(base, handle, TYPE_AAAA, name, flags, in evdns_base_resolve_ipv6()
2973 search_request_new(base, handle, TYPE_AAAA, name, flags, in evdns_base_resolve_ipv6()
2980 EVDNS_UNLOCK(base); in evdns_base_resolve_ipv6()
2991 evdns_base_resolve_reverse(struct evdns_base *base, const struct in_addr *in, int flags, evdns_call… in evdns_base_resolve_reverse() argument
3007 EVDNS_LOCK(base); in evdns_base_resolve_reverse()
3008 req = request_new(base, handle, TYPE_PTR, buf, flags, callback, ptr); in evdns_base_resolve_reverse()
3015 EVDNS_UNLOCK(base); in evdns_base_resolve_reverse()
3025 evdns_base_resolve_reverse_ipv6(struct evdns_base *base, const struct in6_addr *in, int flags, evdn… in evdns_base_resolve_reverse_ipv6() argument
3047 EVDNS_LOCK(base); in evdns_base_resolve_reverse_ipv6()
3048 req = request_new(base, handle, TYPE_PTR, buf, flags, callback, ptr); in evdns_base_resolve_reverse_ipv6()
3055 EVDNS_UNLOCK(base); in evdns_base_resolve_reverse_ipv6()
3116 search_postfix_clear(struct evdns_base *base) { in search_postfix_clear() argument
3117 search_state_decref(base->global_search_state); in search_postfix_clear()
3119 base->global_search_state = search_state_new(); in search_postfix_clear()
3124 evdns_base_search_clear(struct evdns_base *base) in evdns_base_search_clear() argument
3126 EVDNS_LOCK(base); in evdns_base_search_clear()
3127 search_postfix_clear(base); in evdns_base_search_clear()
3128 EVDNS_UNLOCK(base); in evdns_base_search_clear()
3137 search_postfix_add(struct evdns_base *base, const char *domain) { in search_postfix_add() argument
3143 ASSERT_LOCKED(base); in search_postfix_add()
3144 if (!base->global_search_state) base->global_search_state = search_state_new(); in search_postfix_add()
3145 if (!base->global_search_state) return; in search_postfix_add()
3146 base->global_search_state->num_domains++; in search_postfix_add()
3151 sdomain->next = base->global_search_state->head; in search_postfix_add()
3154 base->global_search_state->head = sdomain; in search_postfix_add()
3160 search_reverse(struct evdns_base *base) { in search_reverse() argument
3162 ASSERT_LOCKED(base); in search_reverse()
3163 cur = base->global_search_state->head; in search_reverse()
3171 base->global_search_state->head = prev; in search_reverse()
3176 evdns_base_search_add(struct evdns_base *base, const char *domain) { in evdns_base_search_add() argument
3177 EVDNS_LOCK(base); in evdns_base_search_add()
3178 search_postfix_add(base, domain); in evdns_base_search_add()
3179 EVDNS_UNLOCK(base); in evdns_base_search_add()
3188 evdns_base_search_ndots_set(struct evdns_base *base, const int ndots) { in evdns_base_search_ndots_set() argument
3189 EVDNS_LOCK(base); in evdns_base_search_ndots_set()
3190 if (!base->global_search_state) base->global_search_state = search_state_new(); in evdns_base_search_ndots_set()
3191 if (base->global_search_state) in evdns_base_search_ndots_set()
3192 base->global_search_state->ndots = ndots; in evdns_base_search_ndots_set()
3193 EVDNS_UNLOCK(base); in evdns_base_search_ndots_set()
3201 search_set_from_hostname(struct evdns_base *base) { in search_set_from_hostname() argument
3204 ASSERT_LOCKED(base); in search_set_from_hostname()
3205 search_postfix_clear(base); in search_set_from_hostname()
3209 search_postfix_add(base, domainname); in search_set_from_hostname()
3244 search_request_new(struct evdns_base *base, struct evdns_request *handle, in search_request_new() argument
3247 ASSERT_LOCKED(base); in search_request_new()
3251 base->global_search_state && in search_request_new()
3252 base->global_search_state->num_domains) { in search_request_new()
3255 if (string_num_dots(name) >= base->global_search_state->ndots) { in search_request_new()
3256 req = request_new(base, handle, type, name, flags, user_callback, user_arg); in search_request_new()
3260 char *const new_name = search_make_new(base->global_search_state, 0, name); in search_request_new()
3262 req = request_new(base, handle, type, new_name, flags, user_callback, user_arg); in search_request_new()
3275 handle->search_state = base->global_search_state; in search_request_new()
3277 base->global_search_state->refcount++; in search_request_new()
3281 struct request *const req = request_new(base, handle, type, name, flags, user_callback, user_arg); in search_request_new()
3296 struct evdns_base *base = req->base; in search_try_next() local
3298 ASSERT_LOCKED(base); in search_try_next()
3308 …newreq = request_new(base, NULL, req->request_type, handle->search_origname, handle->search_flags,… in search_try_next()
3321 …newreq = request_new(base, NULL, req->request_type, new_name, handle->search_flags, req->user_call… in search_try_next()
3329 request_finished(req, &REQ_HEAD(req->base, req->trans_id), 0); in search_try_next()
3338 ASSERT_LOCKED(handle->current_req->base); in search_request_finished()
3353 evdns_resolv_set_defaults(struct evdns_base *base, int flags) { in evdns_resolv_set_defaults() argument
3359 ASSERT_LOCKED(base); in evdns_resolv_set_defaults()
3361 search_set_from_hostname(base); in evdns_resolv_set_defaults()
3363 evdns_base_nameserver_ip_add(base, "127.0.0.1"); in evdns_resolv_set_defaults()
3430 evdns_base_set_max_requests_inflight(struct evdns_base *base, int maxinflight) in evdns_base_set_max_requests_inflight() argument
3432 int old_n_heads = base->n_req_heads, n_heads; in evdns_base_set_max_requests_inflight()
3433 struct request **old_heads = base->req_heads, **new_heads, *req; in evdns_base_set_max_requests_inflight()
3436 ASSERT_LOCKED(base); in evdns_base_set_max_requests_inflight()
3454 base->req_heads = new_heads; in evdns_base_set_max_requests_inflight()
3455 base->n_req_heads = n_heads; in evdns_base_set_max_requests_inflight()
3456 base->global_max_requests_inflight = maxinflight; in evdns_base_set_max_requests_inflight()
3462 evdns_base_set_option(struct evdns_base *base, in evdns_base_set_option() argument
3466 EVDNS_LOCK(base); in evdns_base_set_option()
3467 res = evdns_base_set_option_impl(base, option, val, DNS_OPTIONS_ALL); in evdns_base_set_option()
3468 EVDNS_UNLOCK(base); in evdns_base_set_option()
3489 evdns_base_set_option_impl(struct evdns_base *base, in evdns_base_set_option_impl() argument
3492 ASSERT_LOCKED(base); in evdns_base_set_option_impl()
3498 if (!base->global_search_state) base->global_search_state = search_state_new(); in evdns_base_set_option_impl()
3499 if (!base->global_search_state) return -1; in evdns_base_set_option_impl()
3500 base->global_search_state->ndots = ndots; in evdns_base_set_option_impl()
3506 memcpy(&base->global_timeout, &tv, sizeof(struct timeval)); in evdns_base_set_option_impl()
3513 memcpy(&base->global_getaddrinfo_allow_skew, &tv, in evdns_base_set_option_impl()
3521 base->global_max_nameserver_timeout = maxtimeout; in evdns_base_set_option_impl()
3528 evdns_base_set_max_requests_inflight(base, maxinflight); in evdns_base_set_option_impl()
3535 base->global_max_retransmits = retries; in evdns_base_set_option_impl()
3540 base->global_randomize_case = randcase; in evdns_base_set_option_impl()
3544 int len = sizeof(base->global_outgoing_address); in evdns_base_set_option_impl()
3547 (struct sockaddr*)&base->global_outgoing_address, &len)) in evdns_base_set_option_impl()
3549 base->global_outgoing_addrlen = len; in evdns_base_set_option_impl()
3558 memcpy(&base->global_nameserver_probe_initial_timeout, &tv, in evdns_base_set_option_impl()
3565 base->so_rcvbuf = buf; in evdns_base_set_option_impl()
3571 base->so_sndbuf = buf; in evdns_base_set_option_impl()
3585 resolv_conf_parse_line(struct evdns_base *base, char *const start, int flags) { in resolv_conf_parse_line() argument
3592 ASSERT_LOCKED(base); in resolv_conf_parse_line()
3599 evdns_base_nameserver_ip_add(base, nameserver); in resolv_conf_parse_line()
3603 search_postfix_clear(base); in resolv_conf_parse_line()
3604 search_postfix_add(base, domain); in resolv_conf_parse_line()
3608 search_postfix_clear(base); in resolv_conf_parse_line()
3611 search_postfix_add(base, domain); in resolv_conf_parse_line()
3613 search_reverse(base); in resolv_conf_parse_line()
3618 evdns_base_set_option_impl(base, option, val ? val+1 : "", flags); in resolv_conf_parse_line()
3633 evdns_base_resolv_conf_parse(struct evdns_base *base, int flags, const char *const filename) { in evdns_base_resolv_conf_parse() argument
3635 EVDNS_LOCK(base); in evdns_base_resolv_conf_parse()
3636 res = evdns_base_resolv_conf_parse_impl(base, flags, filename); in evdns_base_resolv_conf_parse()
3637 EVDNS_UNLOCK(base); in evdns_base_resolv_conf_parse()
3667 evdns_base_resolv_conf_parse_impl(struct evdns_base *base, int flags, const char *const filename) { in evdns_base_resolv_conf_parse_impl() argument
3682 evdns_base_load_hosts(base, fname); in evdns_base_resolv_conf_parse_impl()
3688 evdns_resolv_set_defaults(base, flags); in evdns_base_resolv_conf_parse_impl()
3695 evdns_resolv_set_defaults(base, flags); in evdns_base_resolv_conf_parse_impl()
3706 resolv_conf_parse_line(base, start, flags); in evdns_base_resolv_conf_parse_impl()
3710 resolv_conf_parse_line(base, start, flags); in evdns_base_resolv_conf_parse_impl()
3715 if (!base->server_head && add_default) { in evdns_base_resolv_conf_parse_impl()
3717 evdns_base_nameserver_ip_add(base, "127.0.0.1"); in evdns_base_resolv_conf_parse_impl()
3720 …if (flags & DNS_OPTION_SEARCH && (!base->global_search_state || base->global_search_state->num_dom… in evdns_base_resolv_conf_parse_impl()
3721 search_set_from_hostname(base); in evdns_base_resolv_conf_parse_impl()
3739 evdns_nameserver_ip_add_line(struct evdns_base *base, const char *ips) { in evdns_nameserver_ip_add_line() argument
3743 ASSERT_LOCKED(base); in evdns_nameserver_ip_add_line()
3755 r = evdns_base_nameserver_ip_add(base, buf); in evdns_nameserver_ip_add_line()
3767 load_nameservers_with_getnetworkparams(struct evdns_base *base) in load_nameservers_with_getnetworkparams() argument
3778 ASSERT_LOCKED(base); in load_nameservers_with_getnetworkparams()
3816 r = evdns_nameserver_ip_add_line(base, ns->IpAddress.String); in load_nameservers_with_getnetworkparams()
3846 config_nameserver_from_reg_key(struct evdns_base *base, HKEY key, const TCHAR *subkey) in config_nameserver_from_reg_key() argument
3852 ASSERT_LOCKED(base); in config_nameserver_from_reg_key()
3861 status = evdns_nameserver_ip_add_line(base,buf); in config_nameserver_from_reg_key()
3873 load_nameservers_from_registry(struct evdns_base *base) in load_nameservers_from_registry() argument
3878 if (!found && config_nameserver_from_reg_key(base,k,TEXT(name)) == 0) { \ in load_nameservers_from_registry()
3886 ASSERT_LOCKED(base); in load_nameservers_from_registry()
3929 evdns_base_config_windows_nameservers(struct evdns_base *base) in evdns_base_config_windows_nameservers() argument
3933 if (base == NULL) in evdns_base_config_windows_nameservers()
3934 base = current_base; in evdns_base_config_windows_nameservers()
3935 if (base == NULL) in evdns_base_config_windows_nameservers()
3937 EVDNS_LOCK(base); in evdns_base_config_windows_nameservers()
3940 evdns_base_load_hosts(base, fname); in evdns_base_config_windows_nameservers()
3944 if (load_nameservers_with_getnetworkparams(base) == 0) { in evdns_base_config_windows_nameservers()
3945 EVDNS_UNLOCK(base); in evdns_base_config_windows_nameservers()
3948 r = load_nameservers_from_registry(base); in evdns_base_config_windows_nameservers()
3950 EVDNS_UNLOCK(base); in evdns_base_config_windows_nameservers()
3969 struct evdns_base *base; in evdns_base_new() local
3983 base = mm_malloc(sizeof(struct evdns_base)); in evdns_base_new()
3984 if (base == NULL) in evdns_base_new()
3986 memset(base, 0, sizeof(struct evdns_base)); in evdns_base_new()
3987 base->req_waiting_head = NULL; in evdns_base_new()
3989 EVTHREAD_ALLOC_LOCK(base->lock, EVTHREAD_LOCKTYPE_RECURSIVE); in evdns_base_new()
3990 EVDNS_LOCK(base); in evdns_base_new()
3993 base->req_heads = NULL; in evdns_base_new()
3995 evdns_base_set_max_requests_inflight(base, 64); in evdns_base_new()
3997 base->server_head = NULL; in evdns_base_new()
3998 base->event_base = event_base; in evdns_base_new()
3999 base->global_good_nameservers = base->global_requests_inflight = in evdns_base_new()
4000 base->global_requests_waiting = 0; in evdns_base_new()
4002 base->global_timeout.tv_sec = 5; in evdns_base_new()
4003 base->global_timeout.tv_usec = 0; in evdns_base_new()
4004 base->global_max_reissues = 1; in evdns_base_new()
4005 base->global_max_retransmits = 3; in evdns_base_new()
4006 base->global_max_nameserver_timeout = 3; in evdns_base_new()
4007 base->global_search_state = NULL; in evdns_base_new()
4008 base->global_randomize_case = 1; in evdns_base_new()
4009 base->global_getaddrinfo_allow_skew.tv_sec = 3; in evdns_base_new()
4010 base->global_getaddrinfo_allow_skew.tv_usec = 0; in evdns_base_new()
4011 base->global_nameserver_probe_initial_timeout.tv_sec = 10; in evdns_base_new()
4012 base->global_nameserver_probe_initial_timeout.tv_usec = 0; in evdns_base_new()
4014 TAILQ_INIT(&base->hostsdb); in evdns_base_new()
4038 r = evdns_base_config_windows_nameservers(base); in evdns_base_new()
4040 r = evdns_base_resolv_conf_parse(base, opts, "/etc/resolv.conf"); in evdns_base_new()
4043 evdns_base_free_and_unlock(base, 0); in evdns_base_new()
4048 base->disable_when_inactive = 1; in evdns_base_new()
4051 EVDNS_UNLOCK(base); in evdns_base_new()
4052 return base; in evdns_base_new()
4058 struct evdns_base *base = evdns_base_new(NULL, 1); in evdns_init() local
4059 if (base) { in evdns_init()
4060 current_base = base; in evdns_init()
4098 evdns_cancel_request(server->base, server->probe_request); in evdns_nameserver_free()
4106 evdns_base_free_and_unlock(struct evdns_base *base, int fail_requests) in evdns_base_free_and_unlock() argument
4116 while (base->req_waiting_head) { in evdns_base_free_and_unlock()
4118 reply_schedule_callback(base->req_waiting_head, 0, DNS_ERR_SHUTDOWN, NULL); in evdns_base_free_and_unlock()
4119 request_finished(base->req_waiting_head, &base->req_waiting_head, 1); in evdns_base_free_and_unlock()
4121 for (i = 0; i < base->n_req_heads; ++i) { in evdns_base_free_and_unlock()
4122 while (base->req_heads[i]) { in evdns_base_free_and_unlock()
4124 reply_schedule_callback(base->req_heads[i], 0, DNS_ERR_SHUTDOWN, NULL); in evdns_base_free_and_unlock()
4125 request_finished(base->req_heads[i], &REQ_HEAD(base, base->req_heads[i]->trans_id), 1); in evdns_base_free_and_unlock()
4128 base->global_requests_inflight = base->global_requests_waiting = 0; in evdns_base_free_and_unlock()
4130 for (server = base->server_head; server; server = server_next) { in evdns_base_free_and_unlock()
4135 if (server_next == base->server_head) in evdns_base_free_and_unlock()
4138 base->server_head = NULL; in evdns_base_free_and_unlock()
4139 base->global_good_nameservers = 0; in evdns_base_free_and_unlock()
4141 if (base->global_search_state) { in evdns_base_free_and_unlock()
4142 for (dom = base->global_search_state->head; dom; dom = dom_next) { in evdns_base_free_and_unlock()
4146 mm_free(base->global_search_state); in evdns_base_free_and_unlock()
4147 base->global_search_state = NULL; in evdns_base_free_and_unlock()
4152 while ((victim = TAILQ_FIRST(&base->hostsdb))) { in evdns_base_free_and_unlock()
4153 TAILQ_REMOVE(&base->hostsdb, victim, next); in evdns_base_free_and_unlock()
4158 mm_free(base->req_heads); in evdns_base_free_and_unlock()
4160 EVDNS_UNLOCK(base); in evdns_base_free_and_unlock()
4161 EVTHREAD_FREE_LOCK(base->lock, EVTHREAD_LOCKTYPE_RECURSIVE); in evdns_base_free_and_unlock()
4163 mm_free(base); in evdns_base_free_and_unlock()
4167 evdns_base_free(struct evdns_base *base, int fail_requests) in evdns_base_free() argument
4169 EVDNS_LOCK(base); in evdns_base_free()
4170 evdns_base_free_and_unlock(base, fail_requests); in evdns_base_free()
4174 evdns_base_clear_host_addresses(struct evdns_base *base) in evdns_base_clear_host_addresses() argument
4177 EVDNS_LOCK(base); in evdns_base_clear_host_addresses()
4178 while ((victim = TAILQ_FIRST(&base->hostsdb))) { in evdns_base_clear_host_addresses()
4179 TAILQ_REMOVE(&base->hostsdb, victim, next); in evdns_base_clear_host_addresses()
4182 EVDNS_UNLOCK(base); in evdns_base_clear_host_addresses()
4197 evdns_base_parse_hosts_line(struct evdns_base *base, char *line) in evdns_base_parse_hosts_line() argument
4205 ASSERT_LOCKED(base); in evdns_base_parse_hosts_line()
4240 TAILQ_INSERT_TAIL(&base->hostsdb, he, next); in evdns_base_parse_hosts_line()
4251 evdns_base_load_hosts_impl(struct evdns_base *base, const char *hosts_fname) in evdns_base_load_hosts_impl() argument
4257 ASSERT_LOCKED(base); in evdns_base_load_hosts_impl()
4263 evdns_base_parse_hosts_line(base, tmp); in evdns_base_load_hosts_impl()
4265 evdns_base_parse_hosts_line(base, tmp); in evdns_base_load_hosts_impl()
4277 evdns_base_parse_hosts_line(base, cp); in evdns_base_load_hosts_impl()
4280 evdns_base_parse_hosts_line(base, cp); in evdns_base_load_hosts_impl()
4290 evdns_base_load_hosts(struct evdns_base *base, const char *hosts_fname) in evdns_base_load_hosts() argument
4293 if (!base) in evdns_base_load_hosts()
4294 base = current_base; in evdns_base_load_hosts()
4295 EVDNS_LOCK(base); in evdns_base_load_hosts()
4296 res = evdns_base_load_hosts_impl(base, hosts_fname); in evdns_base_load_hosts()
4297 EVDNS_UNLOCK(base); in evdns_base_load_hosts()
4647 find_hosts_entry(struct evdns_base *base, const char *hostname, in find_hosts_entry() argument
4655 e = TAILQ_FIRST(&base->hostsdb); in find_hosts_entry()
4665 evdns_getaddrinfo_fromhosts(struct evdns_base *base, in evdns_getaddrinfo_fromhosts() argument
4674 EVDNS_LOCK(base); in evdns_getaddrinfo_fromhosts()
4675 for (e = find_hosts_entry(base, nodename, NULL); e; in evdns_getaddrinfo_fromhosts()
4676 e = find_hosts_entry(base, nodename, e)) { in evdns_getaddrinfo_fromhosts()
4690 EVDNS_UNLOCK(base); in evdns_getaddrinfo_fromhosts()