Lines Matching full:as

9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
50 #define AS_NS_SA(p) ((p)->as_ctx->ac_ns[(p)->as.dns.nsidx - 1])
57 struct asr_query *as; in res_send_async() local
65 if ((as = _asr_async_new(ac, ASR_SEND)) == NULL) { in res_send_async()
69 as->as_run = res_send_async_run; in res_send_async()
71 as->as_flags |= ASYNC_EXTOBUF; in res_send_async()
72 as->as.dns.obuf = (unsigned char *)buf; in res_send_async()
73 as->as.dns.obuflen = buflen; in res_send_async()
74 as->as.dns.obufsize = buflen; in res_send_async()
83 as->as.dns.reqid = h.id; in res_send_async()
84 as->as.dns.type = q.q_type; in res_send_async()
85 as->as.dns.class = q.q_class; in res_send_async()
86 as->as.dns.dname = strdup(q.q_dname); in res_send_async()
87 if (as->as.dns.dname == NULL) in res_send_async()
91 return (as); in res_send_async()
93 if (as) in res_send_async()
94 _asr_async_free(as); in res_send_async()
109 struct asr_query *as; in res_query_async() local
114 as = _res_query_async_ctx(name, class, type, ac); in res_query_async()
117 return (as); in res_query_async()
124 struct asr_query *as; in _res_query_async_ctx() local
128 if ((as = _asr_async_new(a_ctx, ASR_SEND)) == NULL) in _res_query_async_ctx()
130 as->as_run = res_send_async_run; in _res_query_async_ctx()
135 if (setup_query(as, name, NULL, class, type) == -1) in _res_query_async_ctx()
138 return (as); in _res_query_async_ctx()
141 if (as) in _res_query_async_ctx()
142 _asr_async_free(as); in _res_query_async_ctx()
148 res_send_async_run(struct asr_query *as, struct asr_result *ar) in res_send_async_run() argument
151 switch (as->as_state) { in res_send_async_run()
155 if (as->as_ctx->ac_nscount == 0) { in res_send_async_run()
157 async_set_state(as, ASR_STATE_HALT); in res_send_async_run()
161 async_set_state(as, ASR_STATE_NEXT_NS); in res_send_async_run()
166 if (iter_ns(as) == -1) { in res_send_async_run()
168 async_set_state(as, ASR_STATE_HALT); in res_send_async_run()
172 if (as->as_ctx->ac_options & RES_USEVC || in res_send_async_run()
173 as->as.dns.obuflen > PACKETSZ) in res_send_async_run()
174 async_set_state(as, ASR_STATE_TCP_WRITE); in res_send_async_run()
176 async_set_state(as, ASR_STATE_UDP_SEND); in res_send_async_run()
181 if (udp_send(as) == -1) { in res_send_async_run()
182 async_set_state(as, ASR_STATE_NEXT_NS); in res_send_async_run()
185 async_set_state(as, ASR_STATE_UDP_RECV); in res_send_async_run()
187 ar->ar_fd = as->as_fd; in res_send_async_run()
188 ar->ar_timeout = as->as_timeout; in res_send_async_run()
194 if (udp_recv(as) == -1) { in res_send_async_run()
197 async_set_state(as, ASR_STATE_HALT); in res_send_async_run()
202 async_set_state(as, ASR_STATE_NEXT_NS); in res_send_async_run()
205 if (as->as_ctx->ac_options & RES_IGNTC) in res_send_async_run()
206 async_set_state(as, ASR_STATE_PACKET); in res_send_async_run()
208 async_set_state(as, ASR_STATE_TCP_WRITE); in res_send_async_run()
210 async_set_state(as, ASR_STATE_PACKET); in res_send_async_run()
215 switch (tcp_write(as)) { in res_send_async_run()
217 async_set_state(as, ASR_STATE_NEXT_NS); in res_send_async_run()
220 async_set_state(as, ASR_STATE_TCP_READ); in res_send_async_run()
222 ar->ar_fd = as->as_fd; in res_send_async_run()
223 ar->ar_timeout = as->as_timeout; in res_send_async_run()
227 ar->ar_fd = as->as_fd; in res_send_async_run()
228 ar->ar_timeout = as->as_timeout; in res_send_async_run()
235 switch (tcp_read(as)) { in res_send_async_run()
239 async_set_state(as, ASR_STATE_HALT); in res_send_async_run()
241 async_set_state(as, ASR_STATE_NEXT_NS); in res_send_async_run()
244 async_set_state(as, ASR_STATE_PACKET); in res_send_async_run()
248 ar->ar_fd = as->as_fd; in res_send_async_run()
249 ar->ar_timeout = as->as_timeout; in res_send_async_run()
256 memmove(&ar->ar_ns, AS_NS_SA(as), AS_NS_SA(as)->sa_len); in res_send_async_run()
257 ar->ar_datalen = as->as.dns.ibuflen; in res_send_async_run()
258 ar->ar_data = as->as.dns.ibuf; in res_send_async_run()
259 as->as.dns.ibuf = NULL; in res_send_async_run()
261 ar->ar_rcode = as->as.dns.rcode; in res_send_async_run()
262 if (!(as->as_ctx->ac_options & RES_TRUSTAD)) in res_send_async_run()
264 async_set_state(as, ASR_STATE_HALT); in res_send_async_run()
274 } else if (as->as.dns.ancount) { in res_send_async_run()
276 ar->ar_count = as->as.dns.ancount; in res_send_async_run()
279 switch (as->as.dns.rcode) { in res_send_async_run()
299 async_set_state(as, ASR_STATE_HALT); in res_send_async_run()
344 setup_query(struct asr_query *as, const char *name, const char *dom, in setup_query() argument
352 if (as->as_flags & ASYNC_EXTOBUF) { in setup_query()
370 if (as->as.dns.obuf == NULL) { in setup_query()
371 as->as.dns.obufsize = PACKETSZ; in setup_query()
372 as->as.dns.obuf = malloc(as->as.dns.obufsize); in setup_query()
373 if (as->as.dns.obuf == NULL) in setup_query()
376 as->as.dns.obuflen = 0; in setup_query()
380 if (as->as_ctx->ac_options & RES_RECURSE) in setup_query()
382 if (as->as_ctx->ac_options & RES_USE_CD) in setup_query()
384 if (as->as_ctx->ac_options & RES_TRUSTAD) in setup_query()
388 if (as->as_ctx->ac_options & (RES_USE_EDNS0 | RES_USE_DNSSEC)) in setup_query()
391 _asr_pack_init(&p, as->as.dns.obuf, as->as.dns.obufsize); in setup_query()
394 if (as->as_ctx->ac_options & (RES_USE_EDNS0 | RES_USE_DNSSEC)) in setup_query()
396 as->as_ctx->ac_options & RES_USE_DNSSEC); in setup_query()
404 as->as.dns.reqid = h.id; in setup_query()
405 as->as.dns.type = type; in setup_query()
406 as->as.dns.class = class; in setup_query()
407 if (as->as.dns.dname) in setup_query()
408 free(as->as.dns.dname); in setup_query()
409 as->as.dns.dname = strdup(dname); in setup_query()
410 if (as->as.dns.dname == NULL) { in setup_query()
414 as->as.dns.obuflen = p.offset; in setup_query()
416 DPRINT_PACKET("asr_setup_query", as->as.dns.obuf, as->as.dns.obuflen); in setup_query()
427 udp_send(struct asr_query *as) in udp_send() argument
435 DPRINT("asr: [%p] connecting to %s UDP\n", as, in udp_send()
436 _asr_print_sockaddr(AS_NS_SA(as), buf, sizeof buf)); in udp_send()
438 as->as_fd = sockaddr_connect(AS_NS_SA(as), SOCK_DGRAM); in udp_send()
439 if (as->as_fd == -1) in udp_send()
442 n = send(as->as_fd, as->as.dns.obuf, as->as.dns.obuflen, 0); in udp_send()
445 close(as->as_fd); in udp_send()
447 as->as_fd = -1; in udp_send()
460 udp_recv(struct asr_query *as) in udp_recv() argument
465 if (ensure_ibuf(as, MAXPACKETSZ) == -1) { in udp_recv()
467 close(as->as_fd); in udp_recv()
469 as->as_fd = -1; in udp_recv()
473 n = recv(as->as_fd, as->as.dns.ibuf, as->as.dns.ibufsize, 0); in udp_recv()
475 close(as->as_fd); in udp_recv()
477 as->as_fd = -1; in udp_recv()
481 as->as.dns.ibuflen = n; in udp_recv()
483 DPRINT_PACKET("asr_udp_recv()", as->as.dns.ibuf, as->as.dns.ibuflen); in udp_recv()
485 if (validate_packet(as) == -1) in udp_recv()
498 tcp_write(struct asr_query *as) in tcp_write() argument
511 if (as->as_fd == -1) { in tcp_write()
512 DPRINT("asr: [%p] connecting to %s TCP\n", as, in tcp_write()
513 _asr_print_sockaddr(AS_NS_SA(as), buf, sizeof buf)); in tcp_write()
514 as->as_fd = sockaddr_connect(AS_NS_SA(as), SOCK_STREAM); in tcp_write()
515 if (as->as_fd == -1) in tcp_write()
517 as->as.dns.datalen = 0; /* bytes sent */ in tcp_write()
524 if (as->as.dns.datalen < sizeof(len)) { in tcp_write()
526 len = htons(as->as.dns.obuflen); in tcp_write()
527 iov[i].iov_base = (char *)(&len) + as->as.dns.datalen; in tcp_write()
528 iov[i].iov_len = sizeof(len) - as->as.dns.datalen; in tcp_write()
531 offset = as->as.dns.datalen - sizeof(len); in tcp_write()
533 iov[i].iov_base = as->as.dns.obuf + offset; in tcp_write()
534 iov[i].iov_len = as->as.dns.obuflen - offset; in tcp_write()
542 n = sendmsg(as->as_fd, &msg, MSG_NOSIGNAL); in tcp_write()
549 as->as.dns.datalen += n; in tcp_write()
551 if (as->as.dns.datalen == as->as.dns.obuflen + sizeof(len)) { in tcp_write()
553 as->as.dns.datalen = 0; in tcp_write()
561 close(as->as_fd); in tcp_write()
562 as->as_fd = -1; in tcp_write()
573 tcp_read(struct asr_query *as) in tcp_read() argument
582 if (as->as.dns.datalen < sizeof(as->as.dns.pktlen)) { in tcp_read()
584 pos = (char *)(&as->as.dns.pktlen) + as->as.dns.datalen; in tcp_read()
585 len = sizeof(as->as.dns.pktlen) - as->as.dns.datalen; in tcp_read()
588 n = read(as->as_fd, pos, len); in tcp_read()
598 as->as.dns.datalen += n; in tcp_read()
599 if (as->as.dns.datalen < sizeof(as->as.dns.pktlen)) in tcp_read()
602 as->as.dns.ibuflen = ntohs(as->as.dns.pktlen); in tcp_read()
603 if (ensure_ibuf(as, as->as.dns.ibuflen) == -1) in tcp_read()
606 pfd.fd = as->as_fd; in tcp_read()
619 offset = as->as.dns.datalen - sizeof(as->as.dns.pktlen); in tcp_read()
620 pos = as->as.dns.ibuf + offset; in tcp_read()
621 len = as->as.dns.ibuflen - offset; in tcp_read()
624 n = read(as->as_fd, pos, len); in tcp_read()
634 as->as.dns.datalen += n; in tcp_read()
637 if (as->as.dns.datalen != as->as.dns.ibuflen + sizeof(as->as.dns.pktlen)) in tcp_read()
640 DPRINT_PACKET("asr_tcp_read()", as->as.dns.ibuf, as->as.dns.ibuflen); in tcp_read()
642 if (validate_packet(as) == -1) in tcp_read()
648 close(as->as_fd); in tcp_read()
650 as->as_fd = -1; in tcp_read()
659 ensure_ibuf(struct asr_query *as, size_t n) in ensure_ibuf() argument
663 if (as->as.dns.ibufsize >= n) in ensure_ibuf()
666 t = recallocarray(as->as.dns.ibuf, as->as.dns.ibufsize, n, 1); in ensure_ibuf()
669 as->as.dns.ibuf = t; in ensure_ibuf()
670 as->as.dns.ibufsize = n; in ensure_ibuf()
680 validate_packet(struct asr_query *as) in validate_packet() argument
688 _asr_unpack_init(&p, as->as.dns.ibuf, as->as.dns.ibuflen); in validate_packet()
694 if (h.id != as->as.dns.reqid) { in validate_packet()
710 as->as.dns.rcode = RCODE(h.flags); in validate_packet()
711 as->as.dns.ancount = h.ancount; in validate_packet()
717 if (q.q_type != as->as.dns.type || in validate_packet()
718 q.q_class != as->as.dns.class || in validate_packet()
719 strcasecmp(q.q_dname, as->as.dns.dname)) { in validate_packet()
721 q.q_dname, as->as.dns.dname); in validate_packet()
726 if (h.flags & TC_MASK && !(as->as_ctx->ac_options & RES_IGNTC)) { in validate_packet()
743 if (p.offset != as->as.dns.ibuflen) { in validate_packet()
777 iter_ns(struct asr_query *as) in iter_ns() argument
780 if (as->as.dns.nsloop >= as->as_ctx->ac_nsretries) in iter_ns()
783 as->as.dns.nsidx += 1; in iter_ns()
784 if (as->as.dns.nsidx <= as->as_ctx->ac_nscount) in iter_ns()
786 as->as.dns.nsidx = 0; in iter_ns()
787 as->as.dns.nsloop++; in iter_ns()
788 DPRINT("asr: iter_ns(): cycle %i\n", as->as.dns.nsloop); in iter_ns()
791 as->as_timeout = 1000 * (as->as_ctx->ac_nstimeout << as->as.dns.nsloop); in iter_ns()
792 if (as->as.dns.nsloop > 0) in iter_ns()
793 as->as_timeout /= as->as_ctx->ac_nscount; in iter_ns()
794 if (as->as_timeout < 1000) in iter_ns()
795 as->as_timeout = 1000; in iter_ns()