Lines Matching full:as

9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
78 struct asr_query *as;
84 if ((as = _asr_async_new(ac, ASR_GETADDRINFO)) == NULL)
86 as->as_run = getaddrinfo_async_run;
89 if ((as->as.ai.hostname = strdup(hostname)) == NULL)
92 if (servname && (as->as.ai.servname = strdup(servname)) == NULL)
95 memmove(&as->as.ai.hints, hints, sizeof *hints);
97 memset(&as->as.ai.hints, 0, sizeof as->as.ai.hints);
98 as->as.ai.hints.ai_family = PF_UNSPEC;
99 as->as.ai.hints.ai_flags = AI_ADDRCONFIG;
103 return (as);
105 if (as)
106 _asr_async_free(as);
113 getaddrinfo_async_run(struct asr_query *as, struct asr_result *ar)
127 switch (as->as_state) {
135 as->as_count = 0;
137 if (as->as.ai.hostname == NULL &&
138 as->as.ai.servname == NULL) {
140 async_set_state(as, ASR_STATE_HALT);
144 if (as->as.ai.hostname && as->as.ai.hostname[0] == '\0') {
146 async_set_state(as, ASR_STATE_HALT);
150 ai = &as->as.ai.hints;
157 async_set_state(as, ASR_STATE_HALT);
164 async_set_state(as, ASR_STATE_HALT);
172 async_set_state(as, ASR_STATE_HALT);
181 async_set_state(as, ASR_STATE_HALT);
186 get_port(as->as.ai.servname, NULL, 1) != 0) {
188 async_set_state(as, ASR_STATE_HALT);
194 if (addrconfig_setup(as) == -1) {
197 async_set_state(as, ASR_STATE_HALT);
210 async_set_state(as, ASR_STATE_HALT);
215 as->as.ai.port_udp = get_port(as->as.ai.servname, "udp",
216 as->as.ai.hints.ai_flags & AI_NUMERICSERV);
218 as->as.ai.port_tcp = get_port(as->as.ai.servname, "tcp",
219 as->as.ai.hints.ai_flags & AI_NUMERICSERV);
220 if (as->as.ai.port_tcp == -2 || as->as.ai.port_udp == -2 ||
221 (as->as.ai.port_tcp == -1 && as->as.ai.port_udp == -1) ||
222 (ai->ai_protocol && (as->as.ai.port_udp == -1 ||
223 as->as.ai.port_tcp == -1))) {
225 async_set_state(as, ASR_STATE_HALT);
232 is_localhost = _asr_is_localhost(as->as.ai.hostname);
238 * localhost names as special and SHOULD always return the IP
244 if (as->as.ai.hostname == NULL || is_localhost) {
245 for (family = iter_family(as, 1);
247 family = iter_family(as, 0)) {
261 if ((r = addrinfo_add(as, &sa.sa,
267 if (ar->ar_gai_errno == 0 && as->as_count == 0) {
270 async_set_state(as, ASR_STATE_HALT);
275 for (family = iter_family(as, 1);
277 family = iter_family(as, 0)) {
280 as->as.ai.hostname) == -1)
283 if ((r = addrinfo_add(as, &sa.sa, as->as.ai.hostname)))
287 if (ar->ar_gai_errno || as->as_count) {
288 async_set_state(as, ASR_STATE_HALT);
294 async_set_state(as, ASR_STATE_HALT);
299 if (!hnok_lenient(as->as.ai.hostname)) {
301 async_set_state(as, ASR_STATE_HALT);
305 async_set_state(as, ASR_STATE_NEXT_DB);
309 if (_asr_iter_db(as) == -1) {
310 async_set_state(as, ASR_STATE_NOT_FOUND);
313 as->as_family_idx = 0;
314 async_set_state(as, ASR_STATE_SAME_DB);
318 as->as_family_idx += 1;
319 if (as->as.ai.hints.ai_family != AF_UNSPEC ||
320 AS_FAMILY(as) == -1) {
324 if (as->as_count) {
326 async_set_state(as, ASR_STATE_HALT);
328 async_set_state(as, ASR_STATE_NEXT_DOMAIN);
331 async_set_state(as, ASR_STATE_SAME_DB);
336 if (AS_DB(as) != ASR_DB_DNS) {
337 async_set_state(as, ASR_STATE_NEXT_DB);
340 as->as_family_idx = 0;
342 free(as->as.ai.fqdn);
343 as->as.ai.fqdn = NULL;
344 r = _asr_iter_domain(as, as->as.ai.hostname, fqdn, sizeof(fqdn));
346 async_set_state(as, ASR_STATE_NEXT_DB);
351 async_set_state(as, ASR_STATE_HALT);
354 as->as.ai.fqdn = strdup(fqdn);
355 if (as->as.ai.fqdn == NULL) {
357 async_set_state(as, ASR_STATE_HALT);
361 async_set_state(as, ASR_STATE_SAME_DB);
366 switch (AS_DB(as)) {
368 if (as->as.ai.fqdn == NULL) {
370 as->as_dom_flags = 0;
371 as->as_dom_step = DOM_INIT;
372 async_set_state(as, ASR_STATE_NEXT_DOMAIN);
376 family = (as->as.ai.hints.ai_family == AF_UNSPEC) ?
377 AS_FAMILY(as) : as->as.ai.hints.ai_family;
380 as->as_flags & ASYNC_NO_INET) {
381 async_set_state(as, ASR_STATE_NEXT_FAMILY);
384 as->as_flags & ASYNC_NO_INET6) {
385 async_set_state(as, ASR_STATE_NEXT_FAMILY);
389 as->as_subq = _res_query_async_ctx(as->as.ai.fqdn,
391 as->as_ctx);
393 if (as->as_subq == NULL) {
398 async_set_state(as, ASR_STATE_HALT);
401 async_set_state(as, ASR_STATE_SUBQUERY);
407 async_set_state(as, ASR_STATE_NEXT_DB);
410 family = (as->as.ai.hints.ai_family == AF_UNSPEC) ?
411 AS_FAMILY(as) : as->as.ai.hints.ai_family;
413 r = addrinfo_from_file(as, family, f);
419 async_set_state(as, ASR_STATE_HALT);
421 async_set_state(as, ASR_STATE_NEXT_FAMILY);
426 async_set_state(as, ASR_STATE_NEXT_DB);
431 if ((r = asr_run(as->as_subq, ar)) == ASYNC_COND)
434 as->as_subq = NULL;
437 async_set_state(as, ASR_STATE_NEXT_FAMILY);
441 r = addrinfo_from_pkt(as, ar->ar_data, ar->ar_datalen);
447 async_set_state(as, ASR_STATE_HALT);
449 async_set_state(as, ASR_STATE_NEXT_FAMILY);
455 if (as->as_flags & ASYNC_AGAIN)
459 async_set_state(as, ASR_STATE_HALT);
464 ar->ar_count = as->as_count;
465 ar->ar_addrinfo = as->as.ai.aifirst;
466 as->as.ai.aifirst = NULL;
476 async_set_state(as, ASR_STATE_HALT);
520 iter_family(struct asr_query *as, int first)
523 as->as_family_idx = 0;
524 if (as->as.ai.hints.ai_family != PF_UNSPEC)
525 return as->as.ai.hints.ai_family;
526 return AS_FAMILY(as);
529 if (as->as.ai.hints.ai_family != PF_UNSPEC)
532 as->as_family_idx++;
534 return AS_FAMILY(as);
538 * Use the sockaddr at "sa" to extend the result list on the "as" context,
543 addrinfo_add(struct asr_query *as, const struct sockaddr *sa, const char *cname)
550 !MATCH_SOCKTYPE(as->as.ai.hints.ai_socktype, i) ||
551 !MATCH_PROTO(as->as.ai.hints.ai_protocol, i))
554 proto = as->as.ai.hints.ai_protocol;
559 port = as->as.ai.port_tcp;
561 port = as->as.ai.port_udp;
575 ai->ai_flags = as->as.ai.hints.ai_flags;
579 as->as.ai.hints.ai_flags & (AI_CANONNAME | AI_FQDN)) {
593 if (as->as.ai.aifirst == NULL)
594 as->as.ai.aifirst = ai;
595 if (as->as.ai.ailast)
596 as->as.ai.ailast->ai_next = ai;
597 as->as.ai.ailast = ai;
598 as->as_count += 1;
605 addrinfo_from_file(struct asr_query *as, int family, FILE *f)
621 if (strcasecmp(as->as.ai.hostname, tokens[i]))
630 if (as->as.ai.hints.ai_flags & (AI_CANONNAME | AI_FQDN))
635 if (addrinfo_add(as, &u.sa, c))
642 addrinfo_from_pkt(struct asr_query *as, char *pkt, size_t pktlen)
681 if (as->as.ai.hints.ai_flags & AI_CANONNAME) {
684 c = res_hnok(buf) ? buf : as->as.ai.hostname;
685 } else if (as->as.ai.hints.ai_flags & AI_FQDN)
686 c = as->as.ai.fqdn;
690 if (addrinfo_add(as, &u.sa, c))
697 addrconfig_setup(struct asr_query *as)
710 as->as_flags |= ASYNC_NO_INET | ASYNC_NO_INET6;
731 as->as_flags &= ~ASYNC_NO_INET;
745 as->as_flags &= ~ASYNC_NO_INET6;