* Increment version to 1.0.14.

* Fix TiVo beacon issue where it would only broadcast on eth0.
* Fix a couple gcc4.4 warnings.
This commit is contained in:
Justin Maggard 2009-06-16 01:08:29 +00:00
parent 94989f8b15
commit 944729cf12
6 changed files with 63 additions and 50 deletions

View File

@ -62,30 +62,32 @@ getsysaddr(char * buf, int len)
{ {
int i; int i;
int s = socket(PF_INET, SOCK_STREAM, 0); int s = socket(PF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
struct ifreq ifr;
int ret = -1;
for (i=1; i > 0; i++) for (i=1; i > 0; i++)
{ {
struct ifreq ifr;
struct sockaddr_in *addr = (struct sockaddr_in *) &ifr.ifr_addr;
ifr.ifr_ifindex = i; ifr.ifr_ifindex = i;
if( ioctl(s, SIOCGIFNAME, &ifr) < 0 ) if( ioctl(s, SIOCGIFNAME, &ifr) < 0 )
break; break;
if(ioctl(s, SIOCGIFADDR, &ifr, sizeof(struct ifreq)) < 0) if(ioctl(s, SIOCGIFADDR, &ifr, sizeof(struct ifreq)) < 0)
continue; continue;
if(strncmp(inet_ntoa(addr->sin_addr), "127.", 4) == 0) memcpy(&addr, &ifr.ifr_addr, sizeof(addr));
if(strncmp(inet_ntoa(addr.sin_addr), "127.", 4) == 0)
continue; 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));
close(s); close(s);
return -1; break;
} }
ret = 0;
break; break;
} }
close(s); close(s);
return 0; return(ret);
} }
int int

View File

@ -147,14 +147,14 @@ parselanaddr(struct lan_addr_s * lan_addr, const char * str)
} }
if(n>15) if(n>15)
{ {
fprintf(stderr, "Error parsing address/mask : %s\n", str); DPRINTF(E_OFF, L_GENERAL, "Error parsing address/mask: %s\n", str);
return -1; return -1;
} }
memcpy(lan_addr->str, str, n); memcpy(lan_addr->str, str, n);
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))
{ {
fprintf(stderr, "Error parsing address/mask : %s\n", str); DPRINTF(E_OFF, L_GENERAL, "Error parsing address/mask: %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);
@ -210,6 +210,7 @@ init(int argc, char * * argv)
char * string, * word; char * string, * word;
enum media_types type; enum media_types type;
char * path; char * path;
char ext_ip_addr[INET_ADDRSTRLEN] = {'\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++)
@ -226,7 +227,7 @@ init(int argc, char * * argv)
if( (getifhwaddr("eth0", mac_str, 64) < 0) && if( (getifhwaddr("eth0", mac_str, 64) < 0) &&
(getifhwaddr("eth1", mac_str, 64) < 0) ) (getifhwaddr("eth1", mac_str, 64) < 0) )
{ {
DPRINTF(E_WARN, L_GENERAL, "No MAC address found. Falling back to generic UUID.\n"); DPRINTF(E_OFF, L_GENERAL, "No MAC address found. Falling back to generic UUID.\n");
strcpy(mac_str, "554e4b4e4f57"); strcpy(mac_str, "554e4b4e4f57");
} }
strcpy(uuidvalue+5, "4d696e69-444c-164e-9d41-"); strcpy(uuidvalue+5, "4d696e69-444c-164e-9d41-");
@ -235,16 +236,6 @@ init(int argc, char * * argv)
getfriendlyname(friendly_name, FRIENDLYNAME_MAX_LEN); getfriendlyname(friendly_name, FRIENDLYNAME_MAX_LEN);
char ext_ip_addr[INET_ADDRSTRLEN];
if( (getsysaddr(ext_ip_addr, INET_ADDRSTRLEN) < 0) &&
(getifaddr("eth0", ext_ip_addr, INET_ADDRSTRLEN) < 0) &&
(getifaddr("eth1", ext_ip_addr, INET_ADDRSTRLEN) < 0) )
{
printf("No IP!\n");
return 1;
}
if( parselanaddr(&lan_addr[n_lan_addr], ext_ip_addr) == 0 )
n_lan_addr++;
runtime_vars.port = -1; runtime_vars.port = -1;
runtime_vars.notify_interval = 895; /* seconds between SSDP announces */ runtime_vars.notify_interval = 895; /* seconds between SSDP announces */
@ -469,10 +460,25 @@ init(int argc, char * * argv)
fprintf(stderr, "Unknown option: %s\n", argv[i]); fprintf(stderr, "Unknown option: %s\n", argv[i]);
} }
} }
/* 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) )
{
DPRINTF(E_OFF, L_GENERAL, "No IP address automatically detected!\n");
}
if( *ext_ip_addr && parselanaddr(&lan_addr[n_lan_addr], ext_ip_addr) == 0 )
{
n_lan_addr++;
}
}
if( (n_lan_addr==0) || (runtime_vars.port<=0) ) if( (n_lan_addr==0) || (runtime_vars.port<=0) )
{ {
fprintf(stderr, "Usage:\n\t" fprintf(stderr, "Usage:\n\t"
"%s [-f config_file] [-i ext_ifname] [-o ext_ip]\n" "%s [-f config_file]\n"
"\t\t[-a listening_ip] [-p port] [-d]\n" "\t\t[-a listening_ip] [-p port] [-d]\n"
/*"[-l logfile] " not functionnal */ /*"[-l logfile] " not functionnal */
"\t\t[-s serial] [-m model_number] \n" "\t\t[-s serial] [-m model_number] \n"
@ -675,7 +681,7 @@ main(int argc, char * * argv)
"messages. EXITING\n"); "messages. EXITING\n");
} }
#ifdef TIVO_SUPPORT #ifdef TIVO_SUPPORT
if( GETFLAG(TIVOMASK) ) if( GETFLAG(TIVOMASK) )
{ {
DPRINTF(E_WARN, L_GENERAL, "TiVo support is enabled.\n"); DPRINTF(E_WARN, L_GENERAL, "TiVo support is enabled.\n");
@ -693,13 +699,13 @@ main(int argc, char * * argv)
} }
tivo_bcast.sin_family = AF_INET; tivo_bcast.sin_family = AF_INET;
tivo_bcast.sin_addr.s_addr = htonl(getBcastAddress()); tivo_bcast.sin_addr.s_addr = htonl(getBcastAddress());
tivo_bcast.sin_port = htons( 2190 ); tivo_bcast.sin_port = htons(2190);
} }
else else
{ {
sbeacon = -1; sbeacon = -1;
} }
#endif #endif
SendSSDPGoodbye(snotify, n_lan_addr); SendSSDPGoodbye(snotify, n_lan_addr);

View File

@ -27,9 +27,6 @@ enable_tivo=no
# default presentation url is http address on port 80 # default presentation url is http address on port 80
#presentation_url=http://www.mylan/index.php #presentation_url=http://www.mylan/index.php
# report system uptime instead of daemon uptime
system_uptime=no
# notify interval in seconds. default is 30 seconds. # notify interval in seconds. default is 30 seconds.
notify_interval=900 notify_interval=900

View File

@ -98,31 +98,39 @@ OpenAndConfTivoBeaconSocket()
/* /*
* Returns the interface broadcast address to be used for beacons * Returns the interface broadcast address to be used for beacons
*/ */
uint32_t getBcastAddress( void ) uint32_t
getBcastAddress(void)
{ {
struct ifreq ifr; int i, rval;
struct sockaddr_in *sin; int s = socket(PF_INET, SOCK_STREAM, 0);
int s, rval; struct sockaddr_in sin;
struct sockaddr_in addr;
struct ifreq ifr;
s = socket( AF_INET, SOCK_DGRAM, 0 ); for (i=1; i > 0; i++)
if ( s < 0 )
{ {
return INADDR_BROADCAST; ifr.ifr_ifindex = i;
if( ioctl(s, SIOCGIFNAME, &ifr) < 0 )
break;
if(ioctl(s, SIOCGIFADDR, &ifr, sizeof(struct ifreq)) < 0)
continue;
memcpy(&addr, &ifr.ifr_addr, sizeof(addr));
if(strcmp(inet_ntoa(addr.sin_addr), lan_addr[0].str) == 0)
{
rval = ioctl(s, SIOCGIFBRDADDR, &ifr);
if( rval < 0 )
{
close(s);
return INADDR_BROADCAST;
}
memcpy(&sin, &ifr.ifr_broadaddr, sizeof(sin));
close(s);
DPRINTF(E_DEBUG, L_TIVO, "Interface: %s broadcast addr %s \n", ifr.ifr_name, inet_ntoa(sin.sin_addr));
return ntohl((uint32_t)(sin.sin_addr.s_addr));
}
} }
strcpy( ifr.ifr_name, "eth0" ); return INADDR_BROADCAST;
rval = ioctl( s, SIOCGIFBRDADDR, &ifr );
if ( rval < 0 )
{
close(s);
return INADDR_BROADCAST;
}
sin = (struct sockaddr_in *)&ifr.ifr_broadaddr;
close(s);
DPRINTF(E_DEBUG, L_TIVO, "Interface: %s broadcast addr %s \n", "eth0", inet_ntoa(sin->sin_addr) );
return ntohl((uint32_t)(sin->sin_addr.s_addr));
} }
/* /*

View File

@ -24,8 +24,8 @@ struct aBeacon
struct aBeacon* next; struct aBeacon* next;
}; };
uint32_t
uint32_t getBcastAddress( void ); getBcastAddress();
int int
OpenAndConfTivoBeaconSocket(); OpenAndConfTivoBeaconSocket();

View File

@ -15,7 +15,7 @@
#include <sqlite3.h> #include <sqlite3.h>
#define MINIDLNA_VERSION "1.0.13" #define MINIDLNA_VERSION "1.0.14"
#define CLIENT_CACHE_SLOTS 20 #define CLIENT_CACHE_SLOTS 20
#define USE_FORK 1 #define USE_FORK 1