This got broken in rev 1.136 9 months ago. Sorry about that. Tests / OKs?
p.s. applying + diff -bu is easier to figure out what's going on. diff --git ping.c ping.c index 9c2395a..b879d6f 100644 --- ping.c +++ ping.c @@ -121,7 +121,6 @@ int options; int moptions; #define MULTICAST_NOLOOP 0x001 #define MULTICAST_TTL 0x002 -#define MULTICAST_IF 0x004 /* * MAX_DUP_CHK is the number of bits in received table, i.e. the maximum @@ -395,24 +394,25 @@ main(int argc, char *argv[]) freeaddrinfo(res); if (source) { - if (IN_MULTICAST(ntohl(dst.sin_addr.s_addr))) - moptions |= MULTICAST_IF; - else { - memset(&from4, 0, sizeof(from4)); - from4.sin_family = AF_INET; - if (inet_aton(source, &from4.sin_addr) == 0) { - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_DGRAM; /*dummy*/ - if ((error = getaddrinfo(source, NULL, &hints, - &res))) - errx(1, "%s: %s", source, - gai_strerror(error)); - if (res->ai_addrlen != sizeof(from4)) - errx(1, "size of sockaddr mismatch"); - memcpy(&from4, res->ai_addr, res->ai_addrlen); - freeaddrinfo(res); - } + memset(&from4, 0, sizeof(from4)); + from4.sin_family = AF_INET; + if (inet_aton(source, &from4.sin_addr) == 0) { + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_DGRAM; /*dummy*/ + if ((error = getaddrinfo(source, NULL, &hints, &res))) + errx(1, "%s: %s", source, gai_strerror(error)); + if (res->ai_addrlen != sizeof(from4)) + errx(1, "size of sockaddr mismatch"); + memcpy(&from4, res->ai_addr, res->ai_addrlen); + freeaddrinfo(res); + } + + if (IN_MULTICAST(ntohl(dst.sin_addr.s_addr))) { + if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, + &from4.sin_addr, sizeof(from4.sin_addr)) < 0) + err(1, "setsockopt IP_MULTICAST_IF"); + } else { if (bind(s, (struct sockaddr *)&from4, sizeof(from4)) < 0) err(1, "bind"); @@ -492,10 +492,6 @@ main(int argc, char *argv[]) setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) < 0) err(1, "setsockopt IP_MULTICAST_TTL"); - if ((moptions & MULTICAST_IF) && - setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, &from4.sin_addr, - sizeof(from4.sin_addr)) < 0) - err(1, "setsockopt IP_MULTICAST_IF"); /* * When trying to send large packets, you must increase the -- I'm not entirely sure you are real.