- /* 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) {
+ /* (At least on Darwin) IFF_BROADCAST might be set but ifa_broadaddr
+ * still a null pointer. It turns out that there's a subsequent entry
+ * for he same interface which _does_ have ifa_broadaddr though... */
+ if((ifs->ifa_flags & IFF_BROADCAST)
+ && ifs->ifa_broadaddr
+ && sockaddr_equal(ifs->ifa_broadaddr, res->ai_addr))