Author: ae
Date: Tue Dec 16 14:59:20 2014
New Revision: 275830
URL: https://svnweb.freebsd.org/changeset/base/275830

Log:
  Add ability to not specify a zone identifier twice, when both source and
  destination addresses are specified.
  For example:
        # ping6 -S fe80::1%ix0 ff02::1
  or
        # ping6 -S fe80::1 fe80::2%ix0
  
  Obtained from:        Yandex LLC
  Sponsored by: Yandex LLC

Modified:
  head/sbin/ping6/ping6.c

Modified: head/sbin/ping6/ping6.c
==============================================================================
--- head/sbin/ping6/ping6.c     Tue Dec 16 14:50:33 2014        (r275829)
+++ head/sbin/ping6/ping6.c     Tue Dec 16 14:59:20 2014        (r275830)
@@ -648,11 +648,20 @@ main(int argc, char *argv[])
                err(1, "socket");
 
        /* set the source address if specified. */
-       if ((options & F_SRCADDR) &&
-           bind(s, (struct sockaddr *)&src, srclen) != 0) {
-               err(1, "bind");
+       if ((options & F_SRCADDR) != 0) {
+               /* properly fill sin6_scope_id */
+               if (IN6_IS_ADDR_LINKLOCAL(&src.sin6_addr) && (
+                   IN6_IS_ADDR_LINKLOCAL(&dst.sin6_addr) ||
+                   IN6_IS_ADDR_MC_LINKLOCAL(&dst.sin6_addr) ||
+                   IN6_IS_ADDR_MC_NODELOCAL(&dst.sin6_addr))) {
+                       if (src.sin6_scope_id == 0)
+                               src.sin6_scope_id = dst.sin6_scope_id;
+                       if (dst.sin6_scope_id == 0)
+                               dst.sin6_scope_id = src.sin6_scope_id;
+               }
+               if (bind(s, (struct sockaddr *)&src, srclen) != 0)
+                       err(1, "bind");
        }
-
        /* set the gateway (next hop) if specified */
        if (gateway) {
                memset(&hints, 0, sizeof(hints));
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to