diff --git a/getifaddr.c b/getifaddr.c index ab8da71..2d18cbd 100644 --- a/getifaddr.c +++ b/getifaddr.c @@ -54,6 +54,9 @@ getifaddr(const char * ifname, char * buf, int len) struct ifreq ifr; int ifrlen; struct sockaddr_in * addr; + uint32_t mask; + int i; + ifrlen = sizeof(ifr); s = socket(PF_INET, SOCK_DGRAM, 0); if(s < 0) @@ -75,6 +78,24 @@ getifaddr(const char * ifname, char * buf, int len) close(s); return -1; } + if(ioctl(s, SIOCGIFNETMASK, &ifr, &ifrlen) == 0) + { + addr = (struct sockaddr_in *)&ifr.ifr_netmask; + mask = ntohl(addr->sin_addr.s_addr); + for (i = 0; i < 32; i++) + { + if ((mask >> i) & 1) + break; + } + mask = 32 - i; + if (mask) + { + i = strlen(buf); + snprintf(buf+i, len-i, "/%u", mask); + } + } + else + DPRINTF(E_ERROR, L_GENERAL, "ioctl(s, SIOCGIFNETMASK, ...): %s\n", strerror(errno)); close(s); return 0; } @@ -86,6 +107,7 @@ getsysaddr(char * buf, int len) int s = socket(PF_INET, SOCK_STREAM, 0); struct sockaddr_in addr; struct ifreq ifr; + uint32_t mask; int ret = -1; for (i=1; i > 0; i++) @@ -98,6 +120,8 @@ getsysaddr(char * buf, int len) memcpy(&addr, &ifr.ifr_addr, sizeof(addr)); if(strncmp(inet_ntoa(addr.sin_addr), "127.", 4) == 0) continue; + if(ioctl(s, SIOCGIFNETMASK, &ifr, sizeof(struct ifreq)) < 0) + continue; if(!inet_ntop(AF_INET, &addr.sin_addr, buf, len)) { DPRINTF(E_ERROR, L_GENERAL, "inet_ntop(): %s\n", strerror(errno)); @@ -105,6 +129,20 @@ getsysaddr(char * buf, int len) break; } ret = 0; + + memcpy(&addr, &ifr.ifr_netmask, sizeof(addr)); + mask = ntohl(addr.sin_addr.s_addr); + for (i = 0; i < 32; i++) + { + if ((mask >> i) & 1) + break; + } + mask = 32 - i; + if (mask) + { + i = strlen(buf); + snprintf(buf+i, len-i, "/%u", mask); + } break; } close(s); diff --git a/minidlna.c b/minidlna.c index e082035..3a0570c 100644 --- a/minidlna.c +++ b/minidlna.c @@ -194,7 +194,7 @@ parselanaddr(struct lan_addr_s * lan_addr, const char * str) lan_addr->str[n] = '\0'; if(!inet_aton(lan_addr->str, &lan_addr->addr)) { - DPRINTF(E_OFF, L_GENERAL, "Error parsing address/mask: %s\n", str); + DPRINTF(E_OFF, L_GENERAL, "Error parsing address: %s\n", str); return -1; } lan_addr->mask.s_addr = htonl(nbits ? (0xffffffff << (32 - nbits)) : 0); @@ -344,7 +344,7 @@ init(int argc, char * * argv) enum media_types type; char * path; char real_path[PATH_MAX]; - char ext_ip_addr[INET_ADDRSTRLEN] = {'\0'}; + char ext_ip_addr[INET_ADDRSTRLEN + 3] = {'\0'}; /* first check if "-f" option is used */ for(i=2; i= 0) + if(getifaddr(ary_options[i].value, ext_ip_addr, sizeof(ext_ip_addr)) >= 0) { if( *ext_ip_addr && parselanaddr(&lan_addr[n_lan_addr], ext_ip_addr) == 0 ) n_lan_addr++; @@ -649,7 +649,7 @@ init(int argc, char * * argv) int address_already_there = 0; int j; i++; - if( getifaddr(argv[i], ext_ip_addr, INET_ADDRSTRLEN) < 0 ) + if( getifaddr(argv[i], ext_ip_addr, sizeof(ext_ip_addr)) < 0 ) { fprintf(stderr, "Network interface '%s' not found.\n", argv[i]); @@ -699,9 +699,9 @@ init(int argc, char * * argv) /* If no IP was specified, try to detect one */ if( n_lan_addr < 1 ) { - if( (getsysaddr(ext_ip_addr, INET_ADDRSTRLEN) < 0) && - (getifaddr("eth0", ext_ip_addr, INET_ADDRSTRLEN) < 0) && - (getifaddr("eth1", ext_ip_addr, INET_ADDRSTRLEN) < 0) ) + if( (getsysaddr(ext_ip_addr, sizeof(ext_ip_addr)) < 0) && + (getifaddr("eth0", ext_ip_addr, sizeof(ext_ip_addr)) < 0) && + (getifaddr("eth1", ext_ip_addr, sizeof(ext_ip_addr)) < 0) ) { DPRINTF(E_OFF, L_GENERAL, "No IP address automatically detected!\n"); }