From: Richard Kettlewell Date: Wed, 26 Sep 2007 14:14:03 +0000 (+0100) Subject: Use getifaddrs() instead of ioctls. This is only documented on BSD X-Git-Tag: debian-1_5_99dev8~232 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/commitdiff_plain/db2c19dcee351f69e2ce40902a8e92ecca4bac8c?hp=81b1bf12365297c8bace12f28e45c0796c593915 Use getifaddrs() instead of ioctls. This is only documented on BSD but does appear to exist in glibc. --- 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); }