* Properly get and use the interface's netmask during LAN address configuration.
This commit is contained in:
parent
ed36693657
commit
7f51618f71
38
getifaddr.c
38
getifaddr.c
@ -54,6 +54,9 @@ getifaddr(const char * ifname, char * buf, int len)
|
|||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
int ifrlen;
|
int ifrlen;
|
||||||
struct sockaddr_in * addr;
|
struct sockaddr_in * addr;
|
||||||
|
uint32_t mask;
|
||||||
|
int i;
|
||||||
|
|
||||||
ifrlen = sizeof(ifr);
|
ifrlen = sizeof(ifr);
|
||||||
s = socket(PF_INET, SOCK_DGRAM, 0);
|
s = socket(PF_INET, SOCK_DGRAM, 0);
|
||||||
if(s < 0)
|
if(s < 0)
|
||||||
@ -75,6 +78,24 @@ getifaddr(const char * ifname, char * buf, int len)
|
|||||||
close(s);
|
close(s);
|
||||||
return -1;
|
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);
|
close(s);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -86,6 +107,7 @@ getsysaddr(char * buf, int len)
|
|||||||
int s = socket(PF_INET, SOCK_STREAM, 0);
|
int s = socket(PF_INET, SOCK_STREAM, 0);
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
|
uint32_t mask;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
for (i=1; i > 0; i++)
|
for (i=1; i > 0; i++)
|
||||||
@ -98,6 +120,8 @@ getsysaddr(char * buf, int len)
|
|||||||
memcpy(&addr, &ifr.ifr_addr, sizeof(addr));
|
memcpy(&addr, &ifr.ifr_addr, sizeof(addr));
|
||||||
if(strncmp(inet_ntoa(addr.sin_addr), "127.", 4) == 0)
|
if(strncmp(inet_ntoa(addr.sin_addr), "127.", 4) == 0)
|
||||||
continue;
|
continue;
|
||||||
|
if(ioctl(s, SIOCGIFNETMASK, &ifr, sizeof(struct ifreq)) < 0)
|
||||||
|
continue;
|
||||||
if(!inet_ntop(AF_INET, &addr.sin_addr, buf, len))
|
if(!inet_ntop(AF_INET, &addr.sin_addr, buf, len))
|
||||||
{
|
{
|
||||||
DPRINTF(E_ERROR, L_GENERAL, "inet_ntop(): %s\n", strerror(errno));
|
DPRINTF(E_ERROR, L_GENERAL, "inet_ntop(): %s\n", strerror(errno));
|
||||||
@ -105,6 +129,20 @@ getsysaddr(char * buf, int len)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ret = 0;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
close(s);
|
close(s);
|
||||||
|
14
minidlna.c
14
minidlna.c
@ -194,7 +194,7 @@ parselanaddr(struct lan_addr_s * lan_addr, const char * str)
|
|||||||
lan_addr->str[n] = '\0';
|
lan_addr->str[n] = '\0';
|
||||||
if(!inet_aton(lan_addr->str, &lan_addr->addr))
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
lan_addr->mask.s_addr = htonl(nbits ? (0xffffffff << (32 - nbits)) : 0);
|
lan_addr->mask.s_addr = htonl(nbits ? (0xffffffff << (32 - nbits)) : 0);
|
||||||
@ -344,7 +344,7 @@ init(int argc, char * * argv)
|
|||||||
enum media_types type;
|
enum media_types type;
|
||||||
char * path;
|
char * path;
|
||||||
char real_path[PATH_MAX];
|
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 */
|
/* first check if "-f" option is used */
|
||||||
for(i=2; i<argc; i++)
|
for(i=2; i<argc; i++)
|
||||||
@ -386,7 +386,7 @@ init(int argc, char * * argv)
|
|||||||
switch(ary_options[i].id)
|
switch(ary_options[i].id)
|
||||||
{
|
{
|
||||||
case UPNPIFNAME:
|
case UPNPIFNAME:
|
||||||
if(getifaddr(ary_options[i].value, ext_ip_addr, INET_ADDRSTRLEN) >= 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 )
|
if( *ext_ip_addr && parselanaddr(&lan_addr[n_lan_addr], ext_ip_addr) == 0 )
|
||||||
n_lan_addr++;
|
n_lan_addr++;
|
||||||
@ -649,7 +649,7 @@ init(int argc, char * * argv)
|
|||||||
int address_already_there = 0;
|
int address_already_there = 0;
|
||||||
int j;
|
int j;
|
||||||
i++;
|
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",
|
fprintf(stderr, "Network interface '%s' not found.\n",
|
||||||
argv[i]);
|
argv[i]);
|
||||||
@ -699,9 +699,9 @@ init(int argc, char * * argv)
|
|||||||
/* If no IP was specified, try to detect one */
|
/* If no IP was specified, try to detect one */
|
||||||
if( n_lan_addr < 1 )
|
if( n_lan_addr < 1 )
|
||||||
{
|
{
|
||||||
if( (getsysaddr(ext_ip_addr, INET_ADDRSTRLEN) < 0) &&
|
if( (getsysaddr(ext_ip_addr, sizeof(ext_ip_addr)) < 0) &&
|
||||||
(getifaddr("eth0", ext_ip_addr, INET_ADDRSTRLEN) < 0) &&
|
(getifaddr("eth0", ext_ip_addr, sizeof(ext_ip_addr)) < 0) &&
|
||||||
(getifaddr("eth1", ext_ip_addr, INET_ADDRSTRLEN) < 0) )
|
(getifaddr("eth1", ext_ip_addr, sizeof(ext_ip_addr)) < 0) )
|
||||||
{
|
{
|
||||||
DPRINTF(E_OFF, L_GENERAL, "No IP address automatically detected!\n");
|
DPRINTF(E_OFF, L_GENERAL, "No IP address automatically detected!\n");
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user