X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/09aee00b1873954d4a767e0590f32b9774253d9f..refs/heads/wip.getaddrinfo:/client/adh-query.c?ds=sidebyside diff --git a/client/adh-query.c b/client/adh-query.c index edacb17..cedcf2d 100644 --- a/client/adh-query.c +++ b/client/adh-query.c @@ -4,12 +4,11 @@ * make queries and print answers */ /* - * This file is - * Copyright (C) 1997-2000 Ian Jackson - * - * It is part of adns, which is - * Copyright (C) 1997-2000 Ian Jackson - * Copyright (C) 1999 Tony Finch + * This file is part of adns, which is + * Copyright (C) 1997-2000,2003,2006 Ian Jackson + * Copyright (C) 1999-2000,2003,2006 Tony Finch + * Copyright (C) 1991 Massachusetts Institute of Technology + * (See the file INSTALL for full details.) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -55,6 +54,20 @@ void ensure_adns_init(void) { ov_format= ov_asynch ? fmt_asynch : fmt_simple; } +void type_info(adns_rrtype type, const char **typename_r, + const void *datap, char **data_r) { + static char buf[12]; + adns_status st; + + st= adns_rr_info(type, typename_r, 0,0, datap,data_r); + if (st == adns_s_nomemory) sysfail("adns_rr_info failed",ENOMEM); + assert(!st); + if (typename_r && !*typename_r) { + sprintf(buf,"TYPE%d", (int)(type & adns_rrt_typemask)); + *typename_r= buf; + } +} + static void prep_query(struct query_node **qun_r, int *quflags_r) { struct query_node *qun; char idbuf[20]; @@ -79,7 +92,7 @@ static void prep_query(struct query_node **qun_r, int *quflags_r) { (ov_qc_query ? adns_qf_quoteok_query : 0) | (ov_qc_anshost ? adns_qf_quoteok_anshost : 0) | (ov_qc_cname ? 0 : adns_qf_quoteok_cname) | - ov_cname, + ov_cname | ov_afflags, *qun_r= qun; } @@ -87,21 +100,26 @@ static void prep_query(struct query_node **qun_r, int *quflags_r) { void of_ptr(const struct optioninfo *oi, const char *arg, const char *arg2) { struct query_node *qun; int quflags, r; - struct sockaddr_in sa; + struct addrinfo *ai, ai_hint = { 0 }; + int err; + + ai_hint.ai_family = AF_UNSPEC; + ai_hint.ai_socktype = SOCK_DGRAM; + ai_hint.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV; - memset(&sa,0,sizeof(sa)); - sa.sin_family= AF_INET; - if (!inet_aton(arg,&sa.sin_addr)) usageerr("invalid IP address %s",arg); + err = getaddrinfo(arg, 0, &ai_hint, &ai); + if (err) usageerr("invalid IP address %s",arg); prep_query(&qun,&quflags); qun->owner= xstrsave(arg); r= adns_submit_reverse(ads, - (struct sockaddr*)&sa, + ai->ai_addr, ov_type == adns_r_none ? adns_r_ptr : ov_type, quflags, qun, &qun->qu); if (r) sysfail("adns_submit_reverse",r); + freeaddrinfo(ai); LIST_LINK_TAIL(outstanding,qun); } @@ -109,22 +127,27 @@ void of_ptr(const struct optioninfo *oi, const char *arg, const char *arg2) { void of_reverse(const struct optioninfo *oi, const char *arg, const char *arg2) { struct query_node *qun; int quflags, r; - struct sockaddr_in sa; + struct addrinfo *ai, ai_hint = { 0 }; + int err; + + ai_hint.ai_family = AF_UNSPEC; + ai_hint.ai_socktype = SOCK_DGRAM; + ai_hint.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV; - memset(&sa,0,sizeof(sa)); - sa.sin_family= AF_INET; - if (!inet_aton(arg,&sa.sin_addr)) usageerr("invalid IP address %s",arg); + err = getaddrinfo(arg, 0, &ai_hint, &ai); + if (err) usageerr("invalid IP address %s",arg); prep_query(&qun,&quflags); qun->owner= xmalloc(strlen(arg) + strlen(arg2) + 2); sprintf(qun->owner, "%s %s", arg,arg2); r= adns_submit_reverse_any(ads, - (struct sockaddr*)&sa, arg2, + ai->ai_addr, arg2, ov_type == adns_r_none ? adns_r_txt : ov_type, quflags, qun, &qun->qu); if (r) sysfail("adns_submit_reverse",r); + freeaddrinfo(ai); LIST_LINK_TAIL(outstanding,qun); } @@ -221,7 +244,6 @@ static void print_status(adns_status st, struct query_node *qun, adns_answer *an static void print_dnsfail(adns_status st, struct query_node *qun, adns_answer *answer) { int r; const char *typename, *statusstring; - adns_status ist; if (ov_format == fmt_inline) { if (fputs("; failed ",stdout) == EOF) outerr(); @@ -232,7 +254,7 @@ static void print_dnsfail(adns_status st, struct query_node *qun, adns_answer *a if (st == adns_s_nxdomain) { r= fprintf(stderr,"%s does not exist\n", owner_show(qun,answer)); } else { - ist= adns_rr_info(answer->type, &typename, 0,0,0,0); + type_info(answer->type, &typename, 0,0); if (st == adns_s_nodata) { r= fprintf(stderr,"%s has no %s record\n", owner_show(qun,answer), typename); } else { @@ -245,7 +267,7 @@ static void print_dnsfail(adns_status st, struct query_node *qun, adns_answer *a } void query_done(struct query_node *qun, adns_answer *answer) { - adns_status st, ist; + adns_status st; int rrn, nrrs; const char *rrp, *realowner, *typename; char *datastr; @@ -279,9 +301,7 @@ void query_done(struct query_node *qun, adns_answer *answer) { rrn++, rrp += answer->rrsz) { if (realowner) print_withspace(realowner); print_ttl(qun,answer); - ist= adns_rr_info(answer->type, &typename, 0, 0, rrp, &datastr); - if (ist == adns_s_nomemory) sysfail("adns_rr_info failed",ENOMEM); - assert(!ist); + type_info(answer->type,&typename, rrp,&datastr); if (qun->pqfr.show_type) print_withspace(typename); if (printf("%s\n",datastr) == EOF) outerr(); free(datastr);