+void of_ptr(const struct optioninfo *oi, const char *arg, const char *arg2) {
+ struct query_node *qun;
+ int quflags, r;
+ 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;
+
+ 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,
+ 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);
+}
+
+void of_reverse(const struct optioninfo *oi, const char *arg, const char *arg2) {
+ struct query_node *qun;
+ int quflags, r;
+ 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;
+
+ 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,
+ 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);
+}
+
+void query_do(const char *domain) {
+ struct query_node *qun;
+ int quflags, r;
+
+ prep_query(&qun,&quflags);
+ qun->owner= xstrsave(domain);