ifconfig: use IPv6 infrastructure
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 4 Feb 2007 02:40:27 +0000 (02:40 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 4 Feb 2007 02:40:27 +0000 (02:40 -0000)
include/libbb.h
networking/ifconfig.c
networking/traceroute.c

index 742d04031b006bb084d6f83084fc6fb19f0dac08..d22efe05b15cb9137f9605bbc6b7844e533d7e4b 100644 (file)
@@ -344,7 +344,7 @@ char* xmalloc_sockaddr2hostonly_noport(const struct sockaddr *sa, socklen_t sale
 char* xmalloc_sockaddr2dotted(const struct sockaddr *sa, socklen_t salen);
 char* xmalloc_sockaddr2dotted_noport(const struct sockaddr *sa, socklen_t salen);
 // "old" (ipv4 only) API
-// users: traceroute.c hostname.c ifconfig.c ping.c
+// users: traceroute.c hostname.c
 struct hostent *xgethostbyname(const char *name);
 
 
index b36f86d6a2a1ede45705ee9ff1c0cc419b3a7edf..f4fc0a4760251b2cfe4a80497ce21c2ef6b36907 100644 (file)
@@ -266,9 +266,6 @@ int ifconfig_main(int argc, char **argv)
 {
        struct ifreq ifr;
        struct sockaddr_in sai;
-#if ENABLE_FEATURE_IPV6
-       struct sockaddr_in6 sai6;
-#endif
 #if ENABLE_FEATURE_IFCONFIG_HW
        struct sockaddr sa;
 #endif
@@ -389,31 +386,33 @@ int ifconfig_main(int argc, char **argv)
                                                        sai.sin_addr.s_addr = (~sai_netmask) | (sai_hostname & sai_netmask);
                                                }
 #endif
+                                               else {
+                                                       len_and_sockaddr *lsa = xhost2sockaddr(host, 0);
 #if ENABLE_FEATURE_IPV6
-                                               else if (inet_pton(AF_INET6, host, &sai6.sin6_addr) > 0) {
-                                                       int sockfd6;
-                                                       struct in6_ifreq ifr6;
-
-                                                       memcpy((char *) &ifr6.ifr6_addr,
-                                                                       (char *) &sai6.sin6_addr,
-                                                                       sizeof(struct in6_addr));
-
-                                                       /* Create a channel to the NET kernel. */
-                                                       sockfd6 = xsocket(AF_INET6, SOCK_DGRAM, 0);
-                                                       if (ioctl(sockfd6, SIOGIFINDEX, &ifr) < 0)
-                                                               bb_perror_msg_and_die("SIOGIFINDEX");
-                                                       ifr6.ifr6_ifindex = ifr.ifr_ifindex;
-                                                       ifr6.ifr6_prefixlen = prefix_len;
-                                                       if (ioctl(sockfd6, a1op->selector, &ifr6) < 0)
-                                                               bb_perror_msg_and_die(a1op->name);
-                                                       continue;
-                                               }
-#endif
-                                               else if (inet_aton(host, &sai.sin_addr) == 0) {
-                                                       /* It's not a dotted quad. */
-                                                       struct hostent *hp = xgethostbyname(host);
-                                                       memcpy((char *) &sai.sin_addr, (char *) hp->h_addr_list[0],
-                                                                       sizeof(struct in_addr));
+                                                       if (lsa->sa.sa_family == AF_INET6) {
+                                                               int sockfd6;
+                                                               struct in6_ifreq ifr6;
+
+                                                               memcpy((char *) &ifr6.ifr6_addr,
+                                                                               (char *) &(lsa->sin6.sin6_addr),
+                                                                               sizeof(struct in6_addr));
+
+                                                               /* Create a channel to the NET kernel. */
+                                                               sockfd6 = xsocket(AF_INET6, SOCK_DGRAM, 0);
+                                                               if (ioctl(sockfd6, SIOGIFINDEX, &ifr) < 0)
+                                                                       bb_perror_msg_and_die("SIOGIFINDEX");
+                                                               ifr6.ifr6_ifindex = ifr.ifr_ifindex;
+                                                               ifr6.ifr6_prefixlen = prefix_len;
+                                                               if (ioctl(sockfd6, a1op->selector, &ifr6) < 0)
+                                                                       bb_perror_msg_and_die(a1op->name);
+                                                               if (ENABLE_FEATURE_CLEAN_UP)
+                                                                       free(lsa);
+                                                               continue;
+                                                       }
+#endif
+                                                       sai.sin_addr = lsa->sin.sin_addr;
+                                                       if (ENABLE_FEATURE_CLEAN_UP)
+                                                               free(lsa);
                                                }
 #if ENABLE_FEATURE_IFCONFIG_BROADCAST_PLUS
                                                if (mask & A_HOSTNAME)
index 4ddde2fdaff008e0ac3b59f1ee6e77b18a4d7d7a..fd4c20e6dc282af5f51635ef42ff606c15fd9f61 100644 (file)
@@ -247,7 +247,7 @@ struct ipovly {
 /*
  * UDP kernel structures and variables.
  */
-struct  udpiphdr {
+struct udpiphdr {
        struct  ipovly ui_i;            /* overlaid ip structure */
        struct  udphdr ui_u;            /* udp header */
 };