From db2c19dcee351f69e2ce40902a8e92ecca4bac8c Mon Sep 17 00:00:00 2001 Message-Id: From: Mark Wooding Date: Wed, 26 Sep 2007 15:14:03 +0100 Subject: [PATCH 1/1] Use getifaddrs() instead of ioctls. This is only documented on BSD but does appear to exist in glibc. Organization: Straylight/Edgeware From: Richard Kettlewell --- server/speaker-network.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/server/speaker-network.c b/server/speaker-network.c index 6ffe929..c81b7db 100644 --- a/server/speaker-network.c +++ b/server/speaker-network.c @@ -30,8 +30,8 @@ #include #include #include -#include #include +#include #include "configuration.h" #include "syscalls.h" @@ -102,7 +102,7 @@ static void network_init(void) { 0 }; static const int one = 1; - int sndbuf, target_sndbuf = 131072, n; + int sndbuf, target_sndbuf = 131072; socklen_t len; char *sockname, *ssockname; @@ -150,21 +150,20 @@ static void network_init(void) { } info("multicasting on %s", sockname); } else { - struct ifreq *ifs; - int nifs; + struct ifaddrs *ifs; - /* See if the address matches the broadcast address of some interface */ - ifreq_list(bfd, &ifs, &nifs); - for(n = 0; n < nifs; ++n) { - if(ioctl(bfd, SIOCGIFBRDADDR, &ifs[n]) < 0) - fatal(errno, "error calling ioctl SIOCGIFBRDADDR"); - if(sockaddr_equal(&ifs[n].ifr_broadaddr, res->ai_addr)) + if(getifaddrs(&ifs) < 0) + fatal(errno, "error calling getifaddrs"); + while(ifs) { + if((ifs->ifa_flags & IFF_BROADCAST) + && sockaddr_equal(ifs->ifa_broadaddr, res->ai_addr)) break; + ifs = ifs->ifa_next; } - if(n < nifs) { + if(ifs) { if(setsockopt(bfd, SOL_SOCKET, SO_BROADCAST, &one, sizeof one) < 0) fatal(errno, "error setting SO_BROADCAST on broadcast socket"); - info("broadcasting on %s (%s)", sockname, ifs[n].ifr_name); + info("broadcasting on %s (%s)", sockname, ifs->ifa_name); } else info("unicasting on %s", sockname); } -- [mdw]