Home | History | Annotate | Download | only in dig

Lines Matching refs:lookup

170 default_comments(dig_lookup_t *lookup, const char *format, ...) {
173 if (lookup->comments) {
192 void (*dighost_comments)(dig_lookup_t *lookup, const char *format,
198 void (*dighost_trying)(char *frm, dig_lookup_t *lookup);
206 _cancel_lookup(dig_lookup_t *lookup, const char *file, unsigned int line);
447 * Create a server structure, which is part of the lookup structure.
578 * Create an empty lookup structure, which holds all the information needed
675 * Clone a lookup, perhaps copying the server list. This does not clone
677 * function, nor does it queue up the new lookup for processing.
837 * Requeue a lookup for further processing, perhaps copying the server
838 * list. The new lookup structure is returned to the caller, and is
841 * completion of the event may result in the next entry on the lookup
1423 save_opt(dig_lookup_t *lookup, char *code, char *value) {
1430 if (lookup->ednsoptscnt >= EDNSOPT_OPTIONS) {
1449 if (lookup->ednsopts == NULL) {
1450 cloneopts(lookup, NULL);
1452 INSIST(lookup->ednsopts != NULL);
1454 if (lookup->ednsopts[lookup->ednsoptscnt].value != NULL) {
1455 isc_mem_free(mctx, lookup->ednsopts[lookup->ednsoptscnt].value);
1458 lookup->ednsopts[lookup->ednsoptscnt].code = num;
1459 lookup->ednsopts[lookup->ednsoptscnt].length = 0;
1460 lookup->ednsopts[lookup->ednsoptscnt].value = NULL;
1468 lookup->ednsopts[lookup->ednsoptscnt].value =
1470 lookup->ednsopts[lookup->ednsoptscnt].length =
1474 lookup->ednsoptscnt++;
1515 * and the lookup list is empty.
1518 * a whole or reseed the lookup list.
1522 dig_lookup_t *lookup = NULL;
1527 lookup = ISC_LIST_HEAD(lookup_list);
1528 while (lookup != NULL) {
1530 debug("pending lookup %p", lookup);
1531 next = ISC_LIST_NEXT(lookup, link);
1532 lookup = next;
1549 * Check if we're done with all the queries in the lookup, except for
1551 * Expects `l` to be a valid and locked lookup.
1573 _destroy_lookup(dig_lookup_t *lookup) {
1577 REQUIRE(lookup != NULL);
1578 REQUIRE(ISC_LIST_EMPTY(lookup->q));
1582 isc_refcount_destroy(&lookup->references);
1584 s = ISC_LIST_HEAD(lookup->my_server_list);
1586 debug("freeing server %p belonging to %p", s, lookup);
1589 ISC_LIST_DEQUEUE(lookup->my_server_list, (dig_server_t *)ptr,
1593 if (lookup->sendmsg != NULL) {
1594 dns_message_detach(&lookup->sendmsg);
1596 if (lookup->querysig != NULL) {
1597 debug("freeing buffer %p", lookup->querysig);
1598 isc_buffer_free(&lookup->querysig);
1600 if (lookup->sendspace != NULL) {
1601 isc_mem_put(mctx, lookup->sendspace, COMMSIZE);
1604 if (lookup->tsigctx != NULL) {
1605 dst_context_destroy(&lookup->tsigctx);
1608 if (lookup->ecs_addr != NULL) {
1609 isc_mem_put(mctx, lookup->ecs_addr, sizeof(*lookup->ecs_addr));
1612 if (lookup->ednsopts != NULL) {
1615 if (lookup->ednsopts[i].value != NULL) {
1616 isc_mem_free(mctx, lookup->ednsopts[i].value);
1619 isc_mem_free(mctx, lookup->ednsopts);
1622 if (lookup->https_path) {
1623 isc_mem_free(mctx, lookup->https_path);
1626 if (lookup->tls_ctx_cache != NULL) {
1627 isc_tlsctx_cache_detach(&lookup->tls_ctx_cache);
1630 if (lookup->tls_ca_file != NULL) {
1631 isc_mem_free(mctx, lookup->tls_ca_file);
1634 if (lookup->tls_hostname != NULL) {
1635 isc_mem_free(mctx, lookup->tls_hostname);
1638 if (lookup->tls_key_file != NULL) {
1639 isc_mem_free(mctx, lookup->tls_key_file);
1642 if (lookup->tls_cert_file != NULL) {
1643 isc_mem_free(mctx, lookup->tls_cert_file);
1646 isc_mem_free(mctx, lookup);
1651 _lookup_attach(dig_lookup_t *lookup, dig_lookup_t **lookupp, const char *file,
1653 REQUIRE(DIG_VALID_LOOKUP(lookup));
1656 debug("%s:%u:lookup_attach(%p) = %" PRIuFAST32, file, line, lookup,
1657 isc_refcount_current(&lookup->references) + 1);
1659 (void)isc_refcount_increment(&lookup->references);
1661 *lookupp = lookup;
1669 dig_lookup_t *lookup = *lookupp;
1672 debug("%s:%u:lookup_detach(%p) = %" PRIuFAST32, file, line, lookup,
1673 isc_refcount_current(&lookup->references) - 1);
1675 if (isc_refcount_decrement(&lookup->references) == 1) {
1676 _destroy_lookup(lookup);
1677 if (lookup == current_lookup) {
1685 destroy_lookup(dig_lookup_t *lookup) {
1686 REQUIRE(DIG_VALID_LOOKUP(lookup));
1688 REQUIRE(isc_refcount_decrement(&lookup->references) == 1);
1689 _destroy_lookup(lookup);
1703 lookup_detach(&query->lookup);
1735 dig_lookup_t *lookup = NULL;
1742 lookup = query->lookup;
1744 if (lookup->current_query == query) {
1745 query_detach(&lookup->current_query);
1756 ISC_LIST_UNLINK(lookup->q, query, link);
1763 * If we can, start the next lookup in the queue running.
1764 * This assumes that the lookup on the head of the queue hasn't been
1765 * started yet. It also removes the lookup from the head of the queue,
1777 * If there's a current lookup running, we really shouldn't get
1785 * Put the current lookup somewhere so cancel_all can find it
1789 * Formally, we should attach the lookup to the current_lookup
1806 * If we can, clear the current lookup and start the next one running.
1812 dig_lookup_t *lookup = current_lookup;
1818 if (lookup == NULL) {
1823 if (lookup->cleared) {
1828 if (ISC_LIST_HEAD(lookup->q) != NULL) {
1833 lookup->cleared = true;
1834 debug("lookup cleared");
1836 lookup_detach(&lookup);
1840 * Create and queue a new lookup as a followup to the current lookup,
1842 * name server search modes to start a new lookup using servers from
1847 dig_lookup_t *lookup = NULL;
1863 debug("following up %s", query->lookup->textname);
1891 if (query->lookup->trace && !query->lookup->trace_root) {
1896 domain = dns_fixedname_name(&query->lookup->fdomain);
1921 if (query->lookup->trace_root &&
1922 query->lookup->nsfound >= MXSERV)
1929 query->lookup->nsfound++;
1935 /* Initialize lookup
1940 lookup = requeue_lookup(query->lookup, false);
1941 cancel_lookup(query->lookup);
1942 lookup->doing_xfr = false;
1943 if (!lookup->trace_root &&
1946 lookup->trace = false;
1948 lookup->trace = query->lookup->trace;
1950 lookup->ns_search_only =
1951 query->lookup->ns_search_only;
1952 lookup->trace_root = false;
1953 if (lookup->ns_search_only) {
1954 lookup->recurse = false;
1956 domain = dns_fixedname_name(&lookup->fdomain);
1958 lookup->edns = lookup->original_edns;
1961 num = getaddresses(lookup, namestr, &lresult);
1980 if (lookup == NULL && section == DNS_SECTION_ANSWER &&
1981 (query->lookup->trace || query->lookup->ns_search_only))
1997 for (srv = ISC_LIST_HEAD(lookup->my_server_list); srv != NULL;
1998 srv = ISC_LIST_HEAD(lookup->my_server_list))
2007 ISC_LIST_DEQUEUE(lookup->my_server_list, srv, link);
2011 ISC_LIST_APPENDLIST(lookup->my_server_list, my_server_list,
2019 * Create and queue a new lookup using the next origin from the search
2080 * Insert an SOA record into the sendmessage in a lookup. Used for
2084 insert_soa(dig_lookup_t *lookup) {
2094 soa.serial = lookup->ixfr_serial;
2099 soa.common.rdclass = lookup->rdclass;
2108 isc_buffer_init(&lookup->rdatabuf, lookup->rdatastore,
2109 sizeof(lookup->rdatastore));
2111 dns_message_gettemprdata(lookup->sendmsg, &rdata);
2113 result = dns_rdata_fromstruct(rdata, lookup->rdclass, dns_rdatatype_soa,
2114 &soa, &lookup->rdatabuf);
2117 dns_message_gettemprdatalist(lookup->sendmsg, &rdatalist);
2119 dns_message_gettemprdataset(lookup->sendmsg, &rdataset);
2123 rdatalist->rdclass = lookup->rdclass;
2128 dns_message_gettempname(lookup->sendmsg, &soaname);
2129 dns_name_clone(lookup->name, soaname);
2132 dns_message_addname(lookup->sendmsg, soaname, DNS_SECTION_AUTHORITY);
2145 _new_query(dig_lookup_t *lookup, char *servname, char *userarg,
2150 debug("create query %p linked to lookup %p", query, lookup);
2151 *query = (dig_query_t){ .sendbuf = lookup->renderbuf,
2158 lookup_attach(lookup, &query->lookup);
2183 * Setup the supplied lookup structure, making it ready to start sending
2189 setup_lookup(dig_lookup_t *lookup) {
2202 REQUIRE(lookup != NULL);
2210 debug("setup_lookup(%p)", lookup);
2213 &lookup->sendmsg);
2215 if (lookup->new_search) {
2216 debug("resetting lookup counter.");
2220 if (ISC_LIST_EMPTY(lookup->my_server_list)) {
2222 clone_server_list(server_list, &lookup->my_server_list);
2224 dns_message_gettempname(lookup->sendmsg, &lookup->name);
2226 isc_buffer_init(&lookup->namebuf, lookup->name_space,
2227 sizeof(lookup->name_space));
2228 isc_buffer_init(&lookup->onamebuf, lookup->oname_space,
2229 sizeof(lookup->oname_space));
2236 textname = lookup->textname;
2238 if (lookup->idnin) {
2247 * (which produces an absolute lookup). Otherwise, take the origin
2252 if (lookup->new_search) {
2254 lookup->origin = NULL; /* Force abs lookup */
2255 lookup->done_as_is = true;
2256 lookup->need_search = usesearch;
2257 } else if (lookup->origin == NULL && usesearch) {
2258 lookup->origin = ISC_LIST_HEAD(search_list);
2259 lookup->need_search = false;
2263 if (lookup->origin != NULL) {
2264 debug("trying origin %s", lookup->origin->origin);
2265 dns_message_gettempname(lookup->sendmsg, &lookup->oname);
2267 origin = lookup->origin->origin;
2269 if (lookup->idnin) {
2278 result = dns_name_fromtext(lookup->oname, &b, dns_rootname, 0,
2279 &lookup->onamebuf);
2281 dns_message_puttempname(lookup->sendmsg, &lookup->name);
2282 dns_message_puttempname(lookup->sendmsg,
2283 &lookup->oname);
2287 if (lookup->trace && lookup->trace_root) {
2288 dns_name_clone(dns_rootname, lookup->name);
2301 name, lookup->oname,
2302 lookup->name, &lookup->namebuf);
2304 dns_name_copy(name, lookup->name);
2308 dns_message_puttempname(lookup->sendmsg,
2309 &lookup->name);
2310 dns_message_puttempname(lookup->sendmsg,
2311 &lookup->oname);
2316 lookup->textname,
2320 dns_message_puttempname(lookup->sendmsg, &lookup->oname);
2323 if (lookup->trace && lookup->trace_root) {
2324 dns_name_clone(dns_rootname, lookup->name);
2329 result = dns_name_fromtext(lookup->name, &b,
2331 &lookup->namebuf);
2333 dns_message_puttempname(lookup->sendmsg,
2334 &lookup->name);
2336 lookup->textname,
2348 dns_name_format(lookup->name, store, sizeof(store));
2349 dighost_trying(store, lookup);
2350 INSIST(dns_name_isabsolute(lookup->name));
2352 lookup->sendmsg->id = (dns_messageid_t)isc_random16();
2353 lookup->sendmsg->opcode = lookup->opcode;
2354 lookup->msgcounter = 0;
2360 if ((lookup->trace || lookup->ns_search_only) && !lookup->trace_root) {
2361 lookup->recurse = false;
2364 if (lookup->recurse && lookup->rdtype != dns_rdatatype_axfr &&
2365 lookup->rdtype != dns_rdatatype_ixfr)
2368 lookup->sendmsg->flags |= DNS_MESSAGEFLAG_RD;
2372 if (lookup->aaonly) {
2374 lookup->sendmsg->flags |= DNS_MESSAGEFLAG_AA;
2377 if (lookup->adflag) {
2379 lookup->sendmsg->flags |= DNS_MESSAGEFLAG_AD;
2382 if (lookup->cdflag) {
2384 lookup->sendmsg->flags |= DNS_MESSAGEFLAG_CD;
2387 if (lookup->raflag) {
2389 lookup->sendmsg->flags |= DNS_MESSAGEFLAG_RA;
2392 if (lookup->tcflag) {
2394 lookup->sendmsg->flags |= DNS_MESSAGEFLAG_TC;
2397 if (lookup->zflag) {
2399 lookup->sendmsg->flags |= 0x0040U;
2402 if (lookup->setqid) {
2404 lookup->sendmsg->id = lookup->qid;
2407 dns_message_addname(lookup->sendmsg, lookup->name,
2410 if (lookup->trace && lookup->trace_root) {
2411 lookup->qrdtype = lookup->rdtype;
2412 lookup->rdtype = dns_rdatatype_ns;
2415 if ((lookup->rdtype == dns_rdatatype_axfr) ||
2416 (lookup->rdtype == dns_rdatatype_ixfr))
2421 if (lookup->rdtype == dns_rdatatype_axfr) {
2422 lookup->doing_xfr = true;
2423 lookup->tcp_mode = true;
2424 } else if (lookup->tcp_mode) {
2425 lookup->doing_xfr = true;
2429 if (!lookup->header_only) {
2430 add_question(lookup->sendmsg, lookup->name, lookup->rdclass,
2431 lookup->rdtype);
2435 if (lookup->rdtype == dns_rdatatype_ixfr) {
2436 insert_soa(lookup);
2440 lookup->tsigctx = NULL;
2441 lookup->querysig = NULL;
2444 result = dns_message_settsigkey(lookup->sendmsg, tsigkey);
2448 result = dns_message_setsig0key(lookup->sendmsg, sig0key);
2452 if (lookup->fuzzing) {
2453 lookup->sendmsg->fuzzing = true;
2454 lookup->sendmsg->fuzztime = lookup->fuzztime;
2457 lookup->sendspace = isc_mem_get(mctx, COMMSIZE);
2462 isc_buffer_init(&lookup->renderbuf, lookup->sendspace, COMMSIZE);
2463 result = dns_message_renderbegin(lookup->sendmsg, &cctx,
2464 &lookup->renderbuf);
2466 if (lookup->udpsize > -1 || lookup->dnssec || lookup->edns > -1 ||
2467 lookup->ecs_addr != NULL)
2480 if (lookup->udpsize < 0) {
2481 lookup->udpsize = DEFAULT_EDNS_BUFSIZE;
2483 if (lookup->edns < 0) {
2484 lookup->original_edns = lookup->edns =
2488 if (lookup->nsid) {
2496 if (lookup->ecs_addr != NULL) {
2505 sa = &lookup->ecs_addr->type.sa;
2506 plen = lookup->ecs_addr->length;
2580 if (lookup->sendcookie) {
2583 if (lookup->cookie != NULL) {
2586 result = isc_hex_decodestring(lookup->cookie,
2599 if (lookup->expire) {
2607 if (lookup->tcp_keepalive) {
2615 if (lookup->ednsoptscnt != 0) {
2616 INSIST(i + lookup->ednsoptscnt <= MAXOPTS);
2617 memmove(&opts[i], lookup->ednsopts,
2618 sizeof(dns_ednsopt_t) * lookup->ednsoptscnt);
2619 i += lookup->ednsoptscnt;
2622 if (lookup->padding != 0 && (i >= MAXOPTS)) {
2624 lookup->padding = 0;
2627 if (lookup->padding != 0) {
2633 dns_message_setpadding(lookup->sendmsg,
2634 lookup->padding);
2637 flags = lookup->ednsflags;
2639 if (lookup->dnssec) {
2642 if (lookup->coflag) {
2645 add_opt(lookup->sendmsg, lookup->udpsize, lookup->edns, flags,
2649 result = dns_message_rendersection(lookup->sendmsg,
2652 result = dns_message_rendersection(lookup->sendmsg,
2655 result = dns_message_renderend(lookup->sendmsg);
2664 if (isc_buffer_usedlength(&lookup->renderbuf) > 512) {
2665 lookup->tcp_mode = true;
2668 lookup->pending = false;
2670 for (serv = ISC_LIST_HEAD(lookup->my_server_list); serv != NULL;
2673 query = new_query(lookup, serv->servername, serv->userarg);
2674 ISC_LIST_ENQUEUE(lookup->q, query, link);
2682 * list. The lookup lock must be held by the caller. The function will detach
2683 * both the lookup and the query, and may cancel the lookup and clear the
2684 * current lookup.
2698 * lookup, then treat the situation as an error,
2699 * cancel and clear the lookup.
2750 lookup_attach(query->lookup, &l);
2776 * Cancel a lookup, sending canceling reads on all existing sockets.
2780 _cancel_lookup(dig_lookup_t *lookup, const char *file, unsigned int line) {
2784 query = ISC_LIST_HEAD(lookup->q);
2788 ISC_LIST_DEQUEUE(lookup->q, query, link);
2790 query->lookup);
2800 lookup->pending = false;
2801 lookup->retries = 0;
2807 const char *hostname = query->lookup->tls_hostname_set
2808 ? query->lookup->tls_hostname
2811 if (query->lookup->tls_hostname_set) {
2812 return query->lookup->tls_hostname;
2838 if (query->lookup->tls_key_file_set != query->lookup->tls_cert_file_set)
2845 result = isc_tlsctx_cache_find(query->lookup->tls_ctx_cache, tlsctxname,
2849 if (query->lookup->tls_ca_set) {
2852 query->lookup->tls_ca_file, &store);
2883 if (query->lookup->tls_key_file_set &&
2884 query->lookup->tls_cert_file_set)
2887 ctx, query->lookup->tls_key_file,
2888 query->lookup->tls_cert_file);
2909 query->lookup->tls_ctx_cache, tlsctxname, transport,
2924 INSIST(!query->lookup->tls_ca_set || found_store != NULL);
2948 * query. When we retry TCP, we requeue the whole lookup, which should
2968 query_attach(query, &query->lookup->current_query);
2970 tls_mode = dig_lookup_is_tls(query->lookup);
2979 } else if (query->lookup->https_mode &&
2980 !query->lookup->http_plain)
2983 } else if (query->lookup->https_mode) {
3053 if (query->lookup->proxy_mode) {
3055 if ((tls_mode || (query->lookup->https_mode &&
3056 !query->lookup->http_plain)) &&
3057 !query->lookup->proxy_plain)
3061 if (!query->lookup->proxy_local) {
3063 &proxy_info, &query->lookup->proxy_src_addr,
3064 &query->lookup->proxy_dst_addr, NULL);
3085 } else if (query->lookup->https_mode) {
3087 isc_nm_http_makeuri(!query->lookup->http_plain,
3089 query->lookup->https_path, uri,
3092 if (!query->lookup->http_plain) {
3101 !query->lookup->https_get, tcp_connected,
3116 if (query->lookup->tls_key_file_set != query->lookup->tls_cert_file_set)
3143 isc_buffer_usedlength(&query->lookup->renderbuf));
3156 if (query->lookup->use_usec) {
3169 if (query->lookup->qr) {
3171 dighost_printmessage(query, &query->lookup->renderbuf,
3172 query->lookup->sendmsg, true);
3173 if (query->lookup->stats) {
3205 lookup_attach(query->lookup, &l);
3277 debug("recving with lookup=%p, query=%p, handle=%p", query->lookup,
3314 query_attach(query, &query->lookup->current_query);
3315 debug("working on lookup %p, query %p", query->lookup, query);
3364 if (query->lookup->proxy_mode) {
3367 if (!query->lookup->proxy_local) {
3369 &proxy_info, &query->lookup->proxy_src_addr,
3370 &query->lookup->proxy_dst_addr, NULL);
3385 * If there are more servers available for querying within 'lookup', initiate a
3390 try_next_server(dig_lookup_t *lookup) {
3393 current_query = lookup->current_query;
3405 * get_address(), at which point lookup's current_query must be attached
3409 query_detach(&lookup->current_query);
3413 if (lookup->tcp_mode) {
3436 lookup_attach(query->lookup, &l);
3495 lookup_attach(query->lookup, &l);
3516 xfr = query->lookup->rdtype == dns_rdatatype_ixfr ||
3517 query->lookup->rdtype == dns_rdatatype_axfr;
3520 query->lookup->tls_mode)
3543 if (query->lookup->use_usec) {
3611 lookup_attach(query->lookup, &l);
3624 } else if (query->lookup->rdtype == dns_rdatatype_ixfr ||
3625 query->lookup->rdtype == dns_rdatatype_axfr)
3720 check_for_more_data(dig_lookup_t *lookup, dig_query_t *query,
3725 uint32_t ixfr_serial = lookup->ixfr_serial, serial;
3727 bool ixfr = lookup->rdtype == dns_rdatatype_ixfr;
3728 bool axfr = lookup->rdtype == dns_rdatatype_axfr;
3989 lookup_attach(query->lookup, &l);
4007 if (query->lookup->use_usec) {
4020 * NSSEARCH mode is special, because the queries in the followup lookup
4022 * them fails there is no need to start the next query in the lookup,
4025 * lookup's queries list. However, if there was not a single successful
4026 * query in the followup lookup, then print an error message and exit
4042 * query, but keep the lookup running.
4050 * single successful query in the whole lookup, then
4098 * For TCP, we have to requeue the whole lookup, see
4139 * and cancel the lookup.
4556 * This is a query in the followup lookup
4643 getaddresses(dig_lookup_t *lookup, const char *host, isc_result_t *resultp) {
4668 ISC_LIST_APPEND(lookup->my_server_list, srv, link);
4675 * Initiate either a TCP or UDP lookup
4678 do_lookup(dig_lookup_t *lookup) {
4681 REQUIRE(lookup != NULL);
4684 lookup->pending = true;
4685 query = ISC_LIST_HEAD(lookup->q);
4688 if (lookup->tcp_mode) {
4714 * Make everything on the lookup queue go away. Mainly used by the
4918 dig_idnsetup(dig_lookup_t *lookup, bool active) {
4922 (active && lookup->idnout) ? idn_filter : NULL);
4925 UNUSED(lookup);
4932 dig_lookup_is_tls(const dig_lookup_t *lookup) {
4933 if (lookup->tls_mode || (lookup->tls_ca_set && !lookup->https_mode)) {