]> The Tcpdump Group git mirrors - libpcap/blobdiff - gencode.c
fix "ip host foo" or "ip6 host foo" where foo has both A and AAAA records.
[libpcap] / gencode.c
index ef2fc21b9e37ca4e2a446bd8ef759bb87b4d349f..5c83cdff11589d1eeb3b09a54fa81650a4d0d0e4 100644 (file)
--- a/gencode.c
+++ b/gencode.c
@@ -21,7 +21,7 @@
  */
 #ifndef lint
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.101 2000-01-29 21:01:27 fenner Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.102 2000-03-01 03:37:24 itojun Exp $ (LBL)";
 #endif
 
 #include <sys/types.h>
@@ -2045,15 +2045,21 @@ gen_scode(name, q)
                                tproto = Q_IP;
                                tproto6 = Q_IPV6;
                        }
-                       while (res) {
+                       for (res = res0; res; res = res->ai_next) {
                                switch (res->ai_family) {
                                case AF_INET:
+                                       if (tproto == Q_IPV6)
+                                               continue;
+
                                        sin = (struct sockaddr_in *)
                                                res->ai_addr;
                                        tmp = gen_host(ntohl(sin->sin_addr.s_addr),
                                                0xffffffff, tproto, dir);
                                        break;
                                case AF_INET6:
+                                       if (tproto6 == Q_IP)
+                                               continue;
+
                                        sin6 = (struct sockaddr_in6 *)
                                                res->ai_addr;
                                        tmp = gen_host6(&sin6->sin6_addr,
@@ -2063,10 +2069,10 @@ gen_scode(name, q)
                                if (b)
                                        gen_or(b, tmp);
                                b = tmp;
-
-                               res = res->ai_next;
                        }
                        freeaddrinfo(res0);
+                       if (b == NULL)
+                               bpf_error("unknown host '%s'", name);
                        return b;
 #endif /*INET6*/
                }