chiark / gitweb /
Support IPv6 PTR lookups.
[adns] / client / adh-query.c
index 125bb332dc4646968da03801bcc469ec76e6780a..35e43b96ab0d8c0587b6959939a04f3c74ba1b2b 100644 (file)
@@ -100,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);
 }
@@ -122,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);
 }