Lines Matching refs:lookup

192 default_comments(dig_lookup_t *lookup, const char *format, ...) {
195 if (lookup->comments) {
214 void (*dighost_comments)(dig_lookup_t *lookup, const char *format,
220 void (*dighost_trying)(char *frm, dig_lookup_t *lookup);
228 _cancel_lookup(dig_lookup_t *lookup, const char *file, unsigned int line);
470 * Create a server structure, which is part of the lookup structure.
600 * Create an empty lookup structure, which holds all the information needed
693 * Clone a lookup, perhaps copying the server list. This does not clone
695 * function, nor does it queue up the new lookup for processing.
846 * Requeue a lookup for further processing, perhaps copying the server
847 * list. The new lookup structure is returned to the caller, and is
850 * completion of the event may result in the next entry on the lookup
1443 save_opt(dig_lookup_t *lookup, char *code, char *value) {
1450 if (lookup->ednsoptscnt >= EDNSOPT_OPTIONS) {
1469 if (lookup->ednsopts == NULL) {
1470 cloneopts(lookup, NULL);
1472 INSIST(lookup->ednsopts != NULL);
1474 if (lookup->ednsopts[lookup->ednsoptscnt].value != NULL) {
1475 isc_mem_free(mctx, lookup->ednsopts[lookup->ednsoptscnt].value);
1478 lookup->ednsopts[lookup->ednsoptscnt].code = num;
1479 lookup->ednsopts[lookup->ednsoptscnt].length = 0;
1480 lookup->ednsopts[lookup->ednsoptscnt].value = NULL;
1488 lookup->ednsopts[lookup->ednsoptscnt].value =
1490 lookup->ednsopts[lookup->ednsoptscnt].length =
1494 lookup->ednsoptscnt++;
1537 * and the lookup list is empty.
1540 * a whole or reseed the lookup list.
1544 dig_lookup_t *lookup = NULL;
1549 lookup = ISC_LIST_HEAD(lookup_list);
1550 while (lookup != NULL) {
1552 debug("pending lookup %p", lookup);
1553 next = ISC_LIST_NEXT(lookup, link);
1554 lookup = next;
1567 * Check if we're done with all the queries in the lookup, except for
1569 * Expects `l` to be a valid and locked lookup.
1591 _destroy_lookup(dig_lookup_t *lookup) {
1595 REQUIRE(lookup != NULL);
1596 REQUIRE(ISC_LIST_EMPTY(lookup->q));
1600 isc_refcount_destroy(&lookup->references);
1602 s = ISC_LIST_HEAD(lookup->my_server_list);
1604 debug("freeing server %p belonging to %p", s, lookup);
1607 ISC_LIST_DEQUEUE(lookup->my_server_list, (dig_server_t *)ptr,
1611 if (lookup->sendmsg != NULL) {
1612 dns_message_detach(&lookup->sendmsg);
1614 if (lookup->querysig != NULL) {
1615 debug("freeing buffer %p", lookup->querysig);
1616 isc_buffer_free(&lookup->querysig);
1618 if (lookup->sendspace != NULL) {
1619 isc_mem_put(mctx, lookup->sendspace, COMMSIZE);
1622 if (lookup->tsigctx != NULL) {
1623 dst_context_destroy(&lookup->tsigctx);
1626 if (lookup->ecs_addr != NULL) {
1627 isc_mem_free(mctx, lookup->ecs_addr);
1630 if (lookup->ednsopts != NULL) {
1633 if (lookup->ednsopts[i].value != NULL) {
1634 isc_mem_free(mctx, lookup->ednsopts[i].value);
1637 isc_mem_free(mctx, lookup->ednsopts);
1640 if (lookup->https_path) {
1641 isc_mem_free(mctx, lookup->https_path);
1644 if (lookup->tls_ctx_cache != NULL) {
1645 isc_tlsctx_cache_detach(&lookup->tls_ctx_cache);
1648 if (lookup->tls_ca_file != NULL) {
1649 isc_mem_free(mctx, lookup->tls_ca_file);
1652 if (lookup->tls_hostname != NULL) {
1653 isc_mem_free(mctx, lookup->tls_hostname);
1656 if (lookup->tls_key_file != NULL) {
1657 isc_mem_free(mctx, lookup->tls_key_file);
1660 if (lookup->tls_cert_file != NULL) {
1661 isc_mem_free(mctx, lookup->tls_cert_file);
1664 isc_mem_free(mctx, lookup);
1669 _lookup_attach(dig_lookup_t *lookup, dig_lookup_t **lookupp, const char *file,
1671 REQUIRE(DIG_VALID_LOOKUP(lookup));
1674 debug("%s:%u:lookup_attach(%p) = %" PRIuFAST32, file, line, lookup,
1675 isc_refcount_current(&lookup->references) + 1);
1677 (void)isc_refcount_increment(&lookup->references);
1679 *lookupp = lookup;
1687 dig_lookup_t *lookup = *lookupp;
1690 debug("%s:%u:lookup_detach(%p) = %" PRIuFAST32, file, line, lookup,
1691 isc_refcount_current(&lookup->references) - 1);
1693 if (isc_refcount_decrement(&lookup->references) == 1) {
1694 _destroy_lookup(lookup);
1695 if (lookup == current_lookup) {
1703 destroy_lookup(dig_lookup_t *lookup) {
1704 REQUIRE(DIG_VALID_LOOKUP(lookup));
1706 REQUIRE(isc_refcount_decrement(&lookup->references) == 1);
1707 _destroy_lookup(lookup);
1721 lookup_detach(&query->lookup);
1753 dig_lookup_t *lookup = NULL;
1760 lookup = query->lookup;
1762 if (lookup->current_query == query) {
1763 query_detach(&lookup->current_query);
1774 ISC_LIST_UNLINK(lookup->q, query, link);
1781 * If we can, start the next lookup in the queue running.
1782 * This assumes that the lookup on the head of the queue hasn't been
1783 * started yet. It also removes the lookup from the head of the queue,
1795 * If there's a current lookup running, we really shouldn't get
1803 * Put the current lookup somewhere so cancel_all can find it
1807 * Formally, we should attach the lookup to the current_lookup
1824 * If we can, clear the current lookup and start the next one running.
1830 dig_lookup_t *lookup = current_lookup;
1836 if (lookup == NULL) {
1841 if (lookup->cleared) {
1846 if (ISC_LIST_HEAD(lookup->q) != NULL) {
1851 lookup->cleared = true;
1852 debug("lookup cleared");
1854 lookup_detach(&lookup);
1858 * Create and queue a new lookup as a followup to the current lookup,
1860 * name server search modes to start a new lookup using servers from
1865 dig_lookup_t *lookup = NULL;
1881 debug("following up %s", query->lookup->textname);
1909 if (query->lookup->trace && !query->lookup->trace_root) {
1914 domain = dns_fixedname_name(&query->lookup->fdomain);
1939 if (query->lookup->trace_root &&
1940 query->lookup->nsfound >= MXSERV)
1947 query->lookup->nsfound++;
1953 /* Initialize lookup if we've not yet */
1958 lookup = requeue_lookup(query->lookup, false);
1959 cancel_lookup(query->lookup);
1960 lookup->doing_xfr = false;
1961 if (!lookup->trace_root &&
1964 lookup->trace = false;
1966 lookup->trace = query->lookup->trace;
1968 lookup->ns_search_only =
1969 query->lookup->ns_search_only;
1970 lookup->trace_root = false;
1971 if (lookup->ns_search_only) {
1972 lookup->recurse = false;
1974 domain = dns_fixedname_name(&lookup->fdomain);
1978 num = getaddresses(lookup, namestr, &lresult);
1997 if (lookup == NULL && section == DNS_SECTION_ANSWER &&
1998 (query->lookup->trace || query->lookup->ns_search_only))
2014 for (srv = ISC_LIST_HEAD(lookup->my_server_list); srv != NULL;
2015 srv = ISC_LIST_HEAD(lookup->my_server_list))
2024 ISC_LIST_DEQUEUE(lookup->my_server_list, srv, link);
2028 ISC_LIST_APPENDLIST(lookup->my_server_list, my_server_list,
2036 * Create and queue a new lookup using the next origin from the search
2097 * Insert an SOA record into the sendmessage in a lookup. Used for
2101 insert_soa(dig_lookup_t *lookup) {
2111 soa.serial = lookup->ixfr_serial;
2116 soa.common.rdclass = lookup->rdclass;
2125 isc_buffer_init(&lookup->rdatabuf, lookup->rdatastore,
2126 sizeof(lookup->rdatastore));
2128 result = dns_message_gettemprdata(lookup->sendmsg, &rdata);
2131 result = dns_rdata_fromstruct(rdata, lookup->rdclass, dns_rdatatype_soa,
2132 &soa, &lookup->rdatabuf);
2135 result = dns_message_gettemprdatalist(lookup->sendmsg, &rdatalist);
2138 result = dns_message_gettemprdataset(lookup->sendmsg, &rdataset);
2143 rdatalist->rdclass = lookup->rdclass;
2148 result = dns_message_gettempname(lookup->sendmsg, &soaname);
2150 dns_name_clone(lookup->name, soaname);
2153 dns_message_addname(lookup->sendmsg, soaname, DNS_SECTION_AUTHORITY);
2166 _new_query(dig_lookup_t *lookup, char *servname, char *userarg,
2171 debug("create query %p linked to lookup %p", query, lookup);
2172 *query = (dig_query_t){ .sendbuf = lookup->renderbuf,
2179 lookup_attach(lookup, &query->lookup);
2204 * Setup the supplied lookup structure, making it ready to start sending
2210 setup_lookup(dig_lookup_t *lookup) {
2223 REQUIRE(lookup != NULL);
2231 debug("setup_lookup(%p)", lookup);
2233 dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER, &lookup->sendmsg);
2235 if (lookup->new_search) {
2236 debug("resetting lookup counter.");
2240 if (ISC_LIST_EMPTY(lookup->my_server_list)) {
2242 clone_server_list(server_list, &lookup->my_server_list);
2244 result = dns_message_gettempname(lookup->sendmsg, &lookup->name);
2247 isc_buffer_init(&lookup->namebuf, lookup->name_space,
2248 sizeof(lookup->name_space));
2249 isc_buffer_init(&lookup->onamebuf, lookup->oname_space,
2250 sizeof(lookup->oname_space));
2257 textname = lookup->textname;
2259 if (lookup->idnin) {
2268 * (which produces an absolute lookup). Otherwise, take the origin
2273 if (lookup->new_search) {
2275 lookup->origin = NULL; /* Force abs lookup */
2276 lookup->done_as_is = true;
2277 lookup->need_search = usesearch;
2278 } else if (lookup->origin == NULL && usesearch) {
2279 lookup->origin = ISC_LIST_HEAD(search_list);
2280 lookup->need_search = false;
2284 if (lookup->origin != NULL) {
2285 debug("trying origin %s", lookup->origin->origin);
2286 result = dns_message_gettempname(lookup->sendmsg,
2287 &lookup->oname);
2290 origin = lookup->origin->origin;
2292 if (lookup->idnin) {
2302 result = dns_name_fromtext(lookup->oname, &b, dns_rootname, 0,
2303 &lookup->onamebuf);
2305 dns_message_puttempname(lookup->sendmsg, &lookup->name);
2306 dns_message_puttempname(lookup->sendmsg,
2307 &lookup->oname);
2311 if (lookup->trace && lookup->trace_root) {
2312 dns_name_clone(dns_rootname, lookup->name);
2325 name, lookup->oname,
2326 lookup->name, &lookup->namebuf);
2328 dns_name_copy(name, lookup->name);
2332 dns_message_puttempname(lookup->sendmsg,
2333 &lookup->name);
2334 dns_message_puttempname(lookup->sendmsg,
2335 &lookup->oname);
2340 lookup->textname,
2344 dns_message_puttempname(lookup->sendmsg, &lookup->oname);
2347 if (lookup->trace && lookup->trace_root) {
2348 dns_name_clone(dns_rootname, lookup->name);
2353 result = dns_name_fromtext(lookup->name, &b,
2355 &lookup->namebuf);
2358 dns_message_puttempname(lookup->sendmsg, &lookup->name);
2361 lookup->textname, isc_result_totext(result));
2371 dns_name_format(lookup->name, store, sizeof(store));
2372 dighost_trying(store, lookup);
2373 INSIST(dns_name_isabsolute(lookup->name));
2375 lookup->sendmsg->id = (dns_messageid_t)isc_random16();
2376 lookup->sendmsg->opcode = lookup->opcode;
2377 lookup->msgcounter = 0;
2383 if ((lookup->trace || lookup->ns_search_only) && !lookup->trace_root) {
2384 lookup->recurse = false;
2387 if (lookup->recurse && lookup->rdtype != dns_rdatatype_axfr &&
2388 lookup->rdtype != dns_rdatatype_ixfr)
2391 lookup->sendmsg->flags |= DNS_MESSAGEFLAG_RD;
2395 if (lookup->aaonly) {
2397 lookup->sendmsg->flags |= DNS_MESSAGEFLAG_AA;
2400 if (lookup->adflag) {
2402 lookup->sendmsg->flags |= DNS_MESSAGEFLAG_AD;
2405 if (lookup->cdflag) {
2407 lookup->sendmsg->flags |= DNS_MESSAGEFLAG_CD;
2410 if (lookup->raflag) {
2412 lookup->sendmsg->flags |= DNS_MESSAGEFLAG_RA;
2415 if (lookup->tcflag) {
2417 lookup->sendmsg->flags |= DNS_MESSAGEFLAG_TC;
2420 if (lookup->zflag) {
2422 lookup->sendmsg->flags |= 0x0040U;
2425 if (lookup->setqid) {
2427 lookup->sendmsg->id = lookup->qid;
2430 dns_message_addname(lookup->sendmsg, lookup->name,
2433 if (lookup->trace && lookup->trace_root) {
2434 lookup->qrdtype = lookup->rdtype;
2435 lookup->rdtype = dns_rdatatype_ns;
2438 if ((lookup->rdtype == dns_rdatatype_axfr) ||
2439 (lookup->rdtype == dns_rdatatype_ixfr))
2444 if (lookup->rdtype == dns_rdatatype_axfr) {
2445 lookup->doing_xfr = true;
2446 lookup->tcp_mode = true;
2447 } else if (lookup->tcp_mode) {
2448 lookup->doing_xfr = true;
2452 if (!lookup->header_only) {
2453 add_question(lookup->sendmsg, lookup->name, lookup->rdclass,
2454 lookup->rdtype);
2458 if (lookup->rdtype == dns_rdatatype_ixfr) {
2459 insert_soa(lookup);
2463 lookup->tsigctx = NULL;
2464 lookup->querysig = NULL;
2467 result = dns_message_settsigkey(lookup->sendmsg, tsigkey);
2471 result = dns_message_setsig0key(lookup->sendmsg, sig0key);
2475 if (lookup->fuzzing) {
2476 lookup->sendmsg->fuzzing = true;
2477 lookup->sendmsg->fuzztime = lookup->fuzztime;
2480 lookup->sendspace = isc_mem_get(mctx, COMMSIZE);
2486 isc_buffer_init(&lookup->renderbuf, lookup->sendspace, COMMSIZE);
2487 result = dns_message_renderbegin(lookup->sendmsg, &cctx,
2488 &lookup->renderbuf);
2490 if (lookup->udpsize > -1 || lookup->dnssec || lookup->edns > -1 ||
2491 lookup->ecs_addr != NULL)
2504 if (lookup->udpsize < 0) {
2505 lookup->udpsize = DEFAULT_EDNS_BUFSIZE;
2507 if (lookup->edns < 0) {
2508 lookup->edns = DEFAULT_EDNS_VERSION;
2511 if (lookup->nsid) {
2519 if (lookup->ecs_addr != NULL) {
2528 sa = &lookup->ecs_addr->type.sa;
2529 plen = lookup->ecs_addr->length;
2602 if (lookup->sendcookie) {
2605 if (lookup->cookie != NULL) {
2608 result = isc_hex_decodestring(lookup->cookie,
2621 if (lookup->expire) {
2629 if (lookup->tcp_keepalive) {
2637 if (lookup->ednsoptscnt != 0) {
2638 INSIST(i + lookup->ednsoptscnt <= MAXOPTS);
2639 memmove(&opts[i], lookup->ednsopts,
2640 sizeof(dns_ednsopt_t) * lookup->ednsoptscnt);
2641 i += lookup->ednsoptscnt;
2644 if (lookup->padding != 0 && (i >= MAXOPTS)) {
2646 lookup->padding = 0;
2649 if (lookup->padding != 0) {
2655 dns_message_setpadding(lookup->sendmsg,
2656 lookup->padding);
2659 flags = lookup->ednsflags;
2661 if (lookup->dnssec) {
2664 add_opt(lookup->sendmsg, lookup->udpsize, lookup->edns, flags,
2668 result = dns_message_rendersection(lookup->sendmsg,
2671 result = dns_message_rendersection(lookup->sendmsg,
2674 result = dns_message_renderend(lookup->sendmsg);
2683 if (isc_buffer_usedlength(&lookup->renderbuf) > 512) {
2684 lookup->tcp_mode = true;
2687 lookup->pending = false;
2689 for (serv = ISC_LIST_HEAD(lookup->my_server_list); serv != NULL;
2692 query = new_query(lookup, serv->servername, serv->userarg);
2693 ISC_LIST_ENQUEUE(lookup->q, query, link);
2701 * list. The lookup lock must be held by the caller. The function will detach
2702 * both the lookup and the query, and may cancel the lookup and clear the
2703 * current lookup.
2717 * lookup, then treat the situation as an error,
2718 * cancel and clear the lookup.
2771 lookup_attach(query->lookup, &l);
2798 * Cancel a lookup, sending canceling reads on all existing sockets.
2802 _cancel_lookup(dig_lookup_t *lookup, const char *file, unsigned int line) {
2806 query = ISC_LIST_HEAD(lookup->q);
2810 ISC_LIST_DEQUEUE(lookup->q, query, link);
2812 query->lookup);
2822 lookup->pending = false;
2823 lookup->retries = 0;
2843 if (query->lookup->tls_key_file_set != query->lookup->tls_cert_file_set)
2850 result = isc_tlsctx_cache_find(query->lookup->tls_ctx_cache, tlsctxname,
2854 if (query->lookup->tls_ca_set) {
2857 query->lookup->tls_ca_file, &store);
2874 query->lookup->tls_hostname_set
2875 ? query->lookup->tls_hostname
2891 if (query->lookup->tls_key_file_set &&
2892 query->lookup->tls_cert_file_set)
2895 ctx, query->lookup->tls_key_file,
2896 query->lookup->tls_cert_file);
2917 query->lookup->tls_ctx_cache, tlsctxname, transport,
2932 INSIST(!query->lookup->tls_ca_set || found_store != NULL);
2956 * query. When we retry TCP, we requeue the whole lookup, which should
2971 query_attach(query, &query->lookup->current_query);
2973 tls_mode = dig_lookup_is_tls(query->lookup);
2982 } else if (query->lookup->https_mode &&
2983 !query->lookup->http_plain)
2986 } else if (query->lookup->https_mode) {
3073 } else if (query->lookup->https_mode) {
3075 isc_nm_http_makeuri(!query->lookup->http_plain,
3077 port, query->lookup->https_path,
3080 if (!query->lookup->http_plain) {
3089 uri, !query->lookup->https_get,
3101 if (query->lookup->tls_key_file_set != query->lookup->tls_cert_file_set)
3128 isc_buffer_usedlength(&query->lookup->renderbuf));
3141 if (query->lookup->use_usec) {
3154 if (query->lookup->qr) {
3156 dighost_printmessage(query, &query->lookup->renderbuf,
3157 query->lookup->sendmsg, true);
3158 if (query->lookup->stats) {
3191 lookup_attach(query->lookup, &l);
3266 debug("recving with lookup=%p, query=%p, handle=%p", query->lookup,
3304 query_attach(query, &query->lookup->current_query);
3305 debug("working on lookup %p, query %p", query->lookup, query);
3356 * If there are more servers available for querying within 'lookup', initiate a
3361 try_next_server(dig_lookup_t *lookup) {
3364 current_query = lookup->current_query;
3376 if (lookup->tcp_mode) {
3401 lookup_attach(query->lookup, &l);
3471 lookup_attach(query->lookup, &l);
3492 xfr = query->lookup->rdtype == dns_rdatatype_ixfr ||
3493 query->lookup->rdtype == dns_rdatatype_axfr;
3516 if (query->lookup->use_usec) {
3579 lookup_attach(query->lookup, &l);
3592 } else if (query->lookup->rdtype == dns_rdatatype_ixfr ||
3593 query->lookup->rdtype == dns_rdatatype_axfr)
3693 check_for_more_data(dig_lookup_t *lookup, dig_query_t *query,
3698 uint32_t ixfr_serial = lookup->ixfr_serial, serial;
3700 bool ixfr = lookup->rdtype == dns_rdatatype_ixfr;
3701 bool axfr = lookup->rdtype == dns_rdatatype_axfr;
3964 lookup_attach(query->lookup, &l);
3979 if (query->lookup->use_usec) {
3992 * NSSEARCH mode is special, because the queries in the followup lookup
3994 * them fails there is no need to start the next query in the lookup,
3997 * lookup's queries list. However, if there was not a single successful
3998 * query in the followup lookup, then print an error message and exit
4014 * query, but keep the lookup running.
4022 * single successful query in the whole lookup, then
4070 * For TCP, we have to requeue the whole lookup, see
4111 * and cancel the lookup.
4508 * This is a query in the followup lookup
4602 getaddresses(dig_lookup_t *lookup, const char *host, isc_result_t *resultp) {
4627 ISC_LIST_APPEND(lookup->my_server_list, srv, link);
4634 * Initiate either a TCP or UDP lookup
4637 do_lookup(dig_lookup_t *lookup) {
4640 REQUIRE(lookup != NULL);
4643 lookup->pending = true;
4644 query = ISC_LIST_HEAD(lookup->q);
4647 if (lookup->tcp_mode) {
4669 * Make everything on the lookup queue go away. Mainly used by the
4973 dig_idnsetup(dig_lookup_t *lookup, bool active) {
4977 (active && lookup->idnout) ? idn_output_filter : NULL);
4980 UNUSED(lookup);
4987 dig_lookup_is_tls(const dig_lookup_t *lookup) {
4988 if (lookup->tls_mode || (lookup->tls_ca_set && !lookup->https_mode)) {