From 5a99ade413b97a780758f5c8f927604ad6c8e57b Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Mon, 12 Apr 1999 14:57:46 +0000 Subject: Fixed a couple of bugs in handling of multicast sockets. See comments in lib/socket.h for a detailed guide on how to use them. --- sysdep/unix/io.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'sysdep/unix') diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c index 9a38844..69f8a5c 100644 --- a/sysdep/unix/io.c +++ b/sysdep/unix/io.c @@ -408,21 +408,18 @@ sk_open(sock *s) case SK_IP_MC: { #ifdef HAVE_IP_MREQN + /* FIXME: Define HAVE_IP_MREQN somewhere :) */ struct ip_mreqn mreq; #define mreq_add mreq + ASSERT(s->iface); mreq.imr_ifindex = s->iface->index; - if (has_src) - set_inaddr(&mreq.imr_address, s->saddr); - else - set_inaddr(&mreq.imr_address, s->iface->ifa->ip); + set_inaddr(&mreq.imr_address, s->iface->ip); #else struct in_addr mreq; struct ip_mreq mreq_add; - if (has_src) - set_inaddr(&mreq, s->saddr); - else - set_inaddr(&mreq, s->iface->ip); - memcpy(&mreq_add.imr_interface, &mreq, sizeof(struct in_addr)); + ASSERT(s->iface); + set_inaddr(&mreq, s->iface->ip); + mreq_add.imr_interface = mreq; #endif set_inaddr(&mreq_add.imr_multiaddr, s->daddr); if (has_dest) @@ -439,9 +436,11 @@ sk_open(sock *s) #endif setsockopt(fd, SOL_IP, IP_MULTICAST_LOOP, &zero, sizeof(zero)) < 0) ERR("IP_MULTICAST_LOOP"); + /* This defines where should we send _outgoing_ multicasts */ if (setsockopt(fd, SOL_IP, IP_MULTICAST_IF, &mreq, sizeof(mreq)) < 0) ERR("IP_MULTICAST_IF"); } + /* And this one sets interface for _receiving_ multicasts from */ if (has_src && setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP, &mreq_add, sizeof(mreq_add)) < 0) ERR("IP_ADD_MEMBERSHIP"); break; -- cgit v1.2.3