ping: fix incorrect handling of -I (Iouri Kharon <bc-info@styx.cabel.net>)
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 19 Jun 2007 22:54:21 +0000 (22:54 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 19 Jun 2007 22:54:21 +0000 (22:54 -0000)
networking/ping.c

index c4a498cd8e925b154864978d94f5dfad488ac29e..6945abb4a823f102603563c666f2ea75a8a25ee9 100644 (file)
@@ -530,8 +530,12 @@ static void ping4(len_and_sockaddr *lsa)
 
        pingsock = create_icmp_socket();
        pingaddr.sin = lsa->sin;
-       if (source_lsa)
-               xbind(pingsock, &lsa->sa, lsa->len);
+       if (source_lsa) {
+               if (setsockopt(pingsock, IPPROTO_IP, IP_MULTICAST_IF,
+                               &source_lsa->sa, source_lsa->len))
+                       bb_error_msg_and_die("can't set multicast source interface");
+               xbind(pingsock, &source_lsa->sa, source_lsa->len);
+       }
 
        /* enable broadcast pings */
        setsockopt_broadcast(pingsock);
@@ -578,7 +582,7 @@ static void ping6(len_and_sockaddr *lsa)
        pingaddr.sin6 = lsa->sin6;
        /* untested whether "-I addr" really works for IPv6: */
        if (source_lsa)
-               xbind(pingsock, &lsa->sa, lsa->len);
+               xbind(pingsock, &source_lsa->sa, source_lsa->len);
 
 #ifdef ICMP6_FILTER
        {
@@ -659,7 +663,7 @@ static void ping(len_and_sockaddr *lsa)
        printf("PING %s (%s)", hostname, dotted);
        if (source_lsa) {
                printf(" from %s",
-                       xmalloc_sockaddr2dotted_noport(&lsa->sa, lsa->len));
+                       xmalloc_sockaddr2dotted_noport(&source_lsa->sa, source_lsa->len));
        }
        printf(": %d data bytes\n", datalen);
 
@@ -691,7 +695,6 @@ int ping_main(int argc, char **argv)
                if_index = if_nametoindex(opt_I);
                if (!if_index) {
                        /* TODO: I'm not sure it takes IPv6 unless in [XX:XX..] format */
-                       /* (ping doesn't support source IPv6 addresses yet anyway) */
                        source_lsa = xdotted2sockaddr(opt_I, 0);
                }
        }