chiark / gitweb /
Support v6-mapping IPv4 addresses found doing addr lookups.
[adns.git] / client / adh-query.c
index 125bb332dc4646968da03801bcc469ec76e6780a..aa2918e430dff8b57fe4e0200a718e663145082c 100644 (file)
@@ -92,24 +92,31 @@ 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_v6map ? adns_qf_ipv6_mapv4 : 0) |
+    ov_cname;
     
   *qun_r= qun;
 }
+
+static void sockaddr_aton(const char *text, adns_rr_addr *a) {
+  int err;
+
+  a->len= sizeof(a->addr);
+  err= adns_text2addr(text,0,adns_qf_addrlit_scope_forbid,
+                     &a->addr.sa,&a->len);
+  if (err == EINVAL) usageerr("invalid IP address %s",text);
+  else if (err) sysfail("adns_text2addr",err);
+}
   
 void of_ptr(const struct optioninfo *oi, const char *arg, const char *arg2) {
   struct query_node *qun;
   int quflags, r;
-  struct sockaddr_in sa;
-
-  memset(&sa,0,sizeof(sa));
-  sa.sin_family= AF_INET;
-  if (!inet_aton(arg,&sa.sin_addr)) usageerr("invalid IP address %s",arg);
+  adns_rr_addr a;
 
+  sockaddr_aton(arg,&a);
   prep_query(&qun,&quflags);
   qun->owner= xstrsave(arg);
-  r= adns_submit_reverse(ads,
-                        (struct sockaddr*)&sa,
+  r= adns_submit_reverse(ads, &a.addr.sa,
                         ov_type == adns_r_none ? adns_r_ptr : ov_type,
                         quflags,
                         qun,
@@ -122,17 +129,13 @@ 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;
-
-  memset(&sa,0,sizeof(sa));
-  sa.sin_family= AF_INET;
-  if (!inet_aton(arg,&sa.sin_addr)) usageerr("invalid IP address %s",arg);
+  adns_rr_addr a;
 
+  sockaddr_aton(arg,&a);
   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,
+  r= adns_submit_reverse_any(ads, &a.addr.sa,arg2,
                             ov_type == adns_r_none ? adns_r_txt : ov_type,
                             quflags,
                             qun,