chiark / gitweb /
src/types.c: Use the new `checklabel' machinery for PTR queries.
[adns.git] / client / adh-query.c
index b3666977a215c20767bd60bf2d5511fdf35c19a4..cedcf2db366472cc67a8c6359fed5206fd2f48fa 100644 (file)
@@ -4,12 +4,11 @@
  *   make queries and print answers
  */
 /*
- *  This file is
- *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
- *
- *  It is part of adns, which is
- *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
- *    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
+ *  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
@@ -93,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;
 }
@@ -101,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;
 
-  memset(&sa,0,sizeof(sa));
-  sa.sin_family= AF_INET;
-  if (!inet_aton(arg,&sa.sin_addr)) usageerr("invalid IP address %s",arg);
+  ai_hint.ai_family = AF_UNSPEC;
+  ai_hint.ai_socktype = SOCK_DGRAM;
+  ai_hint.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV;
+
+  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);
 }
@@ -123,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);
 }