Import libhdhomerun + firmware (release 20130328)
libhdhomerun:
http://download.silicondust.com/hdhomerun/libhdhomerun_20130328.tgz
firmware:
http://download.silicondust.com/hdhomerun/hdhomerun3_atsc_firmware_20130328.bin
http://download.silicondust.com/hdhomerun/hdhomerun3_cablecard_firmware_20130328.bin
Change-Id: I0a4eaad353130b98248bb99856697afa550adee5
diff --git a/fwhdhomerun/hdhomerun3_atsc_firmware_20130328.bin b/fwhdhomerun/hdhomerun3_atsc_firmware_20130328.bin
new file mode 100644
index 0000000..7f7e33b
--- /dev/null
+++ b/fwhdhomerun/hdhomerun3_atsc_firmware_20130328.bin
Binary files differ
diff --git a/fwhdhomerun/hdhomerun3_cablecard_firmware_20130328.bin b/fwhdhomerun/hdhomerun3_cablecard_firmware_20130328.bin
new file mode 100644
index 0000000..8e7fd35
--- /dev/null
+++ b/fwhdhomerun/hdhomerun3_cablecard_firmware_20130328.bin
Binary files differ
diff --git a/libhdhomerun/Makefile b/libhdhomerun/Makefile
old mode 100755
new mode 100644
diff --git a/libhdhomerun/README b/libhdhomerun/README
old mode 100755
new mode 100644
diff --git a/libhdhomerun/hdhomerun.h b/libhdhomerun/hdhomerun.h
old mode 100755
new mode 100644
diff --git a/libhdhomerun/hdhomerun_channels.c b/libhdhomerun/hdhomerun_channels.c
old mode 100755
new mode 100644
index c78ebce..79da716
--- a/libhdhomerun/hdhomerun_channels.c
+++ b/libhdhomerun/hdhomerun_channels.c
@@ -140,45 +140,57 @@
static const struct hdhomerun_channelmap_record_t hdhomerun_channelmap_table[] = {
{"au-bcast", hdhomerun_channelmap_range_au_bcast, "au-bcast", "AU"},
{"au-cable", hdhomerun_channelmap_range_eu_cable, "au-cable", "AU"},
- {"eu-bcast", hdhomerun_channelmap_range_eu_bcast, "eu-bcast", "EU PA"},
- {"eu-cable", hdhomerun_channelmap_range_eu_cable, "eu-cable", "EU"},
+ {"eu-bcast", hdhomerun_channelmap_range_eu_bcast, "eu-bcast", NULL},
+ {"eu-cable", hdhomerun_channelmap_range_eu_cable, "eu-cable", NULL},
{"tw-bcast", hdhomerun_channelmap_range_us_bcast, "tw-bcast", "TW"},
{"tw-cable", hdhomerun_channelmap_range_us_cable, "tw-cable", "TW"},
{"kr-bcast", hdhomerun_channelmap_range_us_bcast, "kr-bcast", "KR"},
{"kr-cable", hdhomerun_channelmap_range_kr_cable, "kr-cable", "KR"},
- {"us-bcast", hdhomerun_channelmap_range_us_bcast, "us-bcast", "CA US"},
- {"us-cable", hdhomerun_channelmap_range_us_cable, "us-cable us-hrc us-irc", "CA PA US"},
- {"us-hrc", hdhomerun_channelmap_range_us_hrc , "us-cable us-hrc us-irc", "CA PA US"},
- {"us-irc", hdhomerun_channelmap_range_us_irc, "us-cable us-hrc us-irc", "CA PA US"},
+ {"us-bcast", hdhomerun_channelmap_range_us_bcast, "us-bcast", NULL},
+ {"us-cable", hdhomerun_channelmap_range_us_cable, "us-cable us-hrc us-irc", NULL},
+ {"us-hrc", hdhomerun_channelmap_range_us_hrc , "us-cable us-hrc us-irc", NULL},
+ {"us-irc", hdhomerun_channelmap_range_us_irc, "us-cable us-hrc us-irc", NULL},
{NULL, NULL, NULL, NULL}
};
-const char *hdhomerun_channelmap_get_channelmap_from_country_source(const char *countrycode, const char *source)
+const char *hdhomerun_channelmap_get_channelmap_from_country_source(const char *countrycode, const char *source, const char *supported)
{
- bool_t country_found = FALSE;
+ const char *default_result = NULL;
const struct hdhomerun_channelmap_record_t *record = hdhomerun_channelmap_table;
while (record->channelmap) {
+ /* Ignore records that do not match the requested source. */
+ if (!strstr(record->channelmap, source)) {
+ record++;
+ continue;
+ }
+
+ /* Ignore records that are not supported by the hardware. */
+ if (!strstr(supported, record->channelmap)) {
+ record++;
+ continue;
+ }
+
+ /* If this record is the default result then remember it and keep searching. */
+ if (!record->countrycodes) {
+ default_result = record->channelmap;
+ record++;
+ continue;
+ }
+
+ /* Ignore records that have a countrycode filter and do not match. */
if (!strstr(record->countrycodes, countrycode)) {
record++;
continue;
}
- if (strstr(record->channelmap, source)) {
- return record->channelmap;
- }
-
- country_found = TRUE;
- record++;
+ /* Record found with exact match for source and countrycode. */
+ return record->channelmap;
}
- if (!country_found) {
- return hdhomerun_channelmap_get_channelmap_from_country_source("EU", source);
- }
-
- return NULL;
+ return default_result;
}
const char *hdhomerun_channelmap_get_channelmap_scan_group(const char *channelmap)
@@ -346,7 +358,7 @@
entry->channel_number = channel_number;
entry->frequency = range->frequency + ((uint32_t)(channel_number - range->channel_range_start) * range->spacing);
entry->frequency = hdhomerun_channel_frequency_round_normal(entry->frequency);
- sprintf(entry->name, "%s:%u", channelmap, entry->channel_number);
+ hdhomerun_sprintf(entry->name, entry->name + sizeof(entry->name), "%s:%u", channelmap, entry->channel_number);
hdhomerun_channel_list_build_insert(channel_list, entry);
}
diff --git a/libhdhomerun/hdhomerun_channels.h b/libhdhomerun/hdhomerun_channels.h
old mode 100755
new mode 100644
index 7772ce8..8b79166
--- a/libhdhomerun/hdhomerun_channels.h
+++ b/libhdhomerun/hdhomerun_channels.h
@@ -37,7 +37,7 @@
struct hdhomerun_channel_entry_t;
struct hdhomerun_channel_list_t;
-extern LIBTYPE const char *hdhomerun_channelmap_get_channelmap_from_country_source(const char *countrycode, const char *source);
+extern LIBTYPE const char *hdhomerun_channelmap_get_channelmap_from_country_source(const char *countrycode, const char *source, const char *supported);
extern LIBTYPE const char *hdhomerun_channelmap_get_channelmap_scan_group(const char *channelmap);
extern LIBTYPE uint16_t hdhomerun_channel_entry_channel_number(struct hdhomerun_channel_entry_t *entry);
diff --git a/libhdhomerun/hdhomerun_channelscan.c b/libhdhomerun/hdhomerun_channelscan.c
old mode 100755
new mode 100644
index 8c1f8db..a96f925
--- a/libhdhomerun/hdhomerun_channelscan.c
+++ b/libhdhomerun/hdhomerun_channelscan.c
@@ -60,6 +60,7 @@
void channelscan_destroy(struct hdhomerun_channelscan_t *scan)
{
+ hdhomerun_channel_list_destroy(scan->channel_list);
free(scan);
}
@@ -67,7 +68,7 @@
{
/* Set channel. */
char channel_str[64];
- sprintf(channel_str, "auto:%ld", (unsigned long)frequency);
+ hdhomerun_sprintf(channel_str, channel_str + sizeof(channel_str), "auto:%u", (unsigned int)frequency);
int ret = hdhomerun_device_set_tuner_channel(scan->hd, channel_str);
if (ret <= 0) {
@@ -175,8 +176,7 @@
struct hdhomerun_channelscan_program_t program;
memset(&program, 0, sizeof(program));
- strncpy(program.program_str, line, sizeof(program.program_str));
- program.program_str[sizeof(program.program_str) - 1] = 0;
+ hdhomerun_sprintf(program.program_str, program.program_str + sizeof(program.program_str), "%s", line);
unsigned int program_number;
unsigned int virtual_major, virtual_minor;
@@ -237,8 +237,10 @@
/* Combine channels with same frequency. */
result->frequency = hdhomerun_channel_entry_frequency(entry);
- strncpy(result->channel_str, hdhomerun_channel_entry_name(entry), sizeof(result->channel_str) - 1);
- result->channel_str[sizeof(result->channel_str) - 1] = 0;
+
+ char *ptr = result->channel_str;
+ char *end = result->channel_str + sizeof(result->channel_str);
+ hdhomerun_sprintf(ptr, end, hdhomerun_channel_entry_name(entry));
while (1) {
entry = hdhomerun_channel_list_prev(scan->channel_list, entry);
@@ -252,8 +254,8 @@
break;
}
- char *ptr = strchr(result->channel_str, 0);
- sprintf(ptr, ", %s", hdhomerun_channel_entry_name(entry));
+ ptr = strchr(ptr, 0);
+ hdhomerun_sprintf(ptr, end, ", %s", hdhomerun_channel_entry_name(entry));
}
return 1;
diff --git a/libhdhomerun/hdhomerun_channelscan.h b/libhdhomerun/hdhomerun_channelscan.h
old mode 100755
new mode 100644
diff --git a/libhdhomerun/hdhomerun_config.c b/libhdhomerun/hdhomerun_config.c
old mode 100755
new mode 100644
index a88268e..56469d7
--- a/libhdhomerun/hdhomerun_config.c
+++ b/libhdhomerun/hdhomerun_config.c
@@ -93,8 +93,8 @@
static uint32_t parse_ip_addr(const char *str)
{
- unsigned long a[4];
- if (sscanf(str, "%lu.%lu.%lu.%lu", &a[0], &a[1], &a[2], &a[3]) != 4) {
+ unsigned int a[4];
+ if (sscanf(str, "%u.%u.%u.%u", &a[0], &a[1], &a[2], &a[3]) != 4) {
return 0;
}
@@ -126,8 +126,8 @@
int index;
for (index = 0; index < count; index++) {
struct hdhomerun_discover_device_t *result = &result_list[index];
- printf("hdhomerun device %08lX found at %u.%u.%u.%u\n",
- (unsigned long)result->device_id,
+ printf("hdhomerun device %08X found at %u.%u.%u.%u\n",
+ (unsigned int)result->device_id,
(unsigned int)(result->ip_addr >> 24) & 0x0FF, (unsigned int)(result->ip_addr >> 16) & 0x0FF,
(unsigned int)(result->ip_addr >> 8) & 0x0FF, (unsigned int)(result->ip_addr >> 0) & 0x0FF
);
@@ -303,8 +303,8 @@
break;
}
- cmd_scan_printf(fp, "SCANNING: %lu (%s)\n",
- (unsigned long)result.frequency, result.channel_str
+ cmd_scan_printf(fp, "SCANNING: %u (%s)\n",
+ (unsigned int)result.frequency, result.channel_str
);
ret = hdhomerun_device_channelscan_detect(hd, &result);
@@ -671,7 +671,7 @@
/* Device ID check. */
uint32_t device_id_requested = hdhomerun_device_get_device_id_requested(hd);
if (!hdhomerun_discover_validate_device_id(device_id_requested)) {
- fprintf(stderr, "invalid device id: %08lX\n", (unsigned long)device_id_requested);
+ fprintf(stderr, "invalid device id: %08X\n", (unsigned int)device_id_requested);
}
/* Connect to device and check model. */
diff --git a/libhdhomerun/hdhomerun_control.c b/libhdhomerun/hdhomerun_control.c
old mode 100755
new mode 100644
index 2873e53..15f18fe
--- a/libhdhomerun/hdhomerun_control.c
+++ b/libhdhomerun/hdhomerun_control.c
@@ -368,8 +368,16 @@
{
struct hdhomerun_pkt_t *tx_pkt = &cs->tx_pkt;
struct hdhomerun_pkt_t *rx_pkt = &cs->rx_pkt;
+ bool_t upload_delay = FALSE;
uint32_t sequence = 0;
+ /* Special case detection. */
+ char *version_str;
+ int ret = hdhomerun_control_get(cs, "/sys/version", &version_str, NULL);
+ if (ret > 0) {
+ upload_delay = strcmp(version_str, "20120704beta1") == 0;
+ }
+
/* Upload. */
while (1) {
uint8_t data[256];
@@ -388,6 +396,10 @@
}
sequence += (uint32_t)length;
+
+ if (upload_delay) {
+ msleep_approx(25);
+ }
}
if (sequence == 0) {
diff --git a/libhdhomerun/hdhomerun_control.h b/libhdhomerun/hdhomerun_control.h
old mode 100755
new mode 100644
diff --git a/libhdhomerun/hdhomerun_debug.c b/libhdhomerun/hdhomerun_debug.c
old mode 100755
new mode 100644
index 9686f61..52ac321
--- a/libhdhomerun/hdhomerun_debug.c
+++ b/libhdhomerun/hdhomerun_debug.c
@@ -300,12 +300,8 @@
pthread_mutex_lock(&dbg->print_lock);
if (dbg->prefix) {
- int len = snprintf(ptr, end - ptr, "%s ", dbg->prefix);
- len = (len <= 0) ? 0 : len;
- ptr += len;
- if (ptr > end) {
- ptr = end;
- }
+ hdhomerun_sprintf(ptr, end, "%s ", dbg->prefix);
+ ptr = strchr(ptr, 0);
}
pthread_mutex_unlock(&dbg->print_lock);
@@ -313,29 +309,17 @@
/*
* Message text.
*/
- int len = vsnprintf(ptr, end - ptr, fmt, args);
- len = (len < 0) ? 0 : len; /* len does not include null */
- ptr += len;
- if (ptr > end) {
- ptr = end;
- }
+ hdhomerun_vsprintf(ptr, end, fmt, args);
+ ptr = strchr(ptr, 0);
/*
* Force newline.
*/
- if ((ptr[-1] != '\n') && (ptr + 1 <= end)) {
- *ptr++ = '\n';
+ if (ptr[-1] != '\n') {
+ hdhomerun_sprintf(ptr, end, "\n");
}
/*
- * Force NULL.
- */
- if (ptr + 1 > end) {
- ptr = end - 1;
- }
- *ptr++ = 0;
-
- /*
* Enqueue.
*/
pthread_mutex_lock(&dbg->queue_lock);
diff --git a/libhdhomerun/hdhomerun_debug.h b/libhdhomerun/hdhomerun_debug.h
old mode 100755
new mode 100644
diff --git a/libhdhomerun/hdhomerun_device.c b/libhdhomerun/hdhomerun_device.c
old mode 100755
new mode 100644
index 059c043..fb6e5e0
--- a/libhdhomerun/hdhomerun_device.c
+++ b/libhdhomerun/hdhomerun_device.c
@@ -68,8 +68,8 @@
hd->tuner = 0;
hd->lockkey = 0;
- sprintf(hd->name, "%08lX-%u", (unsigned long)hd->device_id, hd->tuner);
- hd->model[0] = 0; /* clear cached model string */
+ hdhomerun_sprintf(hd->name, hd->name + sizeof(hd->name), "%08X-%u", (unsigned int)hd->device_id, hd->tuner);
+ hdhomerun_sprintf(hd->model, hd->model + sizeof(hd->model), ""); /* clear cached model string */
return 1;
}
@@ -87,9 +87,9 @@
hd->tuner = 0;
hd->lockkey = 0;
- unsigned long ip = multicast_ip;
- sprintf(hd->name, "%lu.%lu.%lu.%lu", (ip >> 24) & 0xFF, (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, (ip >> 0) & 0xFF);
- sprintf(hd->model, "multicast");
+ unsigned int ip = multicast_ip;
+ hdhomerun_sprintf(hd->name, hd->name + sizeof(hd->name), "%u.%u.%u.%u", (ip >> 24) & 0xFF, (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, (ip >> 0) & 0xFF);
+ hdhomerun_sprintf(hd->model, hd->model + sizeof(hd->model), "multicast");
return 1;
}
@@ -120,7 +120,7 @@
}
hd->tuner = tuner;
- sprintf(hd->name, "%08lX-%u", (unsigned long)hd->device_id, hd->tuner);
+ hdhomerun_sprintf(hd->name, hd->name + sizeof(hd->name), "%08X-%u", (unsigned int)hd->device_id, hd->tuner);
return 1;
}
@@ -193,17 +193,17 @@
}
if (*ptr == 0) {
- unsigned long device_id;
- if (sscanf(device_str, "%lx", &device_id) != 1) {
+ unsigned int device_id;
+ if (sscanf(device_str, "%x", &device_id) != 1) {
return NULL;
}
return hdhomerun_device_create((uint32_t)device_id, 0, 0, dbg);
}
if (*ptr == '-') {
- unsigned long device_id;
+ unsigned int device_id;
unsigned int tuner;
- if (sscanf(device_str, "%lx-%u", &device_id, &tuner) != 2) {
+ if (sscanf(device_str, "%x-%u", &device_id, &tuner) != 2) {
return NULL;
}
return hdhomerun_device_create((uint32_t)device_id, 0, tuner, dbg);
@@ -212,10 +212,10 @@
return NULL;
}
-static struct hdhomerun_device_t *hdhomerun_device_create_from_str_ip_result(unsigned long a[4], unsigned int port, unsigned int tuner, struct hdhomerun_debug_t *dbg)
+static struct hdhomerun_device_t *hdhomerun_device_create_from_str_ip_result(unsigned int a[4], unsigned int port, unsigned int tuner, struct hdhomerun_debug_t *dbg)
{
- unsigned long device_ip = (a[0] << 24) | (a[1] << 16) | (a[2] << 8) | (a[3] << 0);
- struct hdhomerun_device_t *hd = hdhomerun_device_create(HDHOMERUN_DEVICE_ID_WILDCARD, (uint32_t)device_ip, tuner, dbg);
+ uint32_t device_ip = (uint32_t)((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | (a[3] << 0));
+ struct hdhomerun_device_t *hd = hdhomerun_device_create(HDHOMERUN_DEVICE_ID_WILDCARD, device_ip, tuner, dbg);
if (!hd) {
return NULL;
}
@@ -229,17 +229,17 @@
static struct hdhomerun_device_t *hdhomerun_device_create_from_str_ip(const char *device_str, struct hdhomerun_debug_t *dbg)
{
- unsigned long a[4];
+ unsigned int a[4];
unsigned int port = 0;
unsigned int tuner = 0;
- if (sscanf(device_str, "%lu.%lu.%lu.%lu:%u", &a[0], &a[1], &a[2], &a[3], &port) == 5) {
+ if (sscanf(device_str, "%u.%u.%u.%u:%u", &a[0], &a[1], &a[2], &a[3], &port) == 5) {
return hdhomerun_device_create_from_str_ip_result(a, port, tuner, dbg);
}
- if (sscanf(device_str, "%lu.%lu.%lu.%lu-%u", &a[0], &a[1], &a[2], &a[3], &tuner) == 5) {
+ if (sscanf(device_str, "%u.%u.%u.%u-%u", &a[0], &a[1], &a[2], &a[3], &tuner) == 5) {
return hdhomerun_device_create_from_str_ip_result(a, port, tuner, dbg);
}
- if (sscanf(device_str, "%lu.%lu.%lu.%lu", &a[0], &a[1], &a[2], &a[3]) == 4) {
+ if (sscanf(device_str, "%u.%u.%u.%u", &a[0], &a[1], &a[2], &a[3]) == 4) {
return hdhomerun_device_create_from_str_ip_result(a, port, tuner, dbg);
}
@@ -398,8 +398,8 @@
return 0;
}
- unsigned long value = 0;
- sscanf(ptr + strlen(tag), "%lu", &value);
+ unsigned int value = 0;
+ sscanf(ptr + strlen(tag), "%u", &value);
return (uint32_t)value;
}
@@ -480,7 +480,7 @@
memset(status, 0, sizeof(struct hdhomerun_tuner_status_t));
char name[32];
- sprintf(name, "/tuner%u/status", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/status", hd->tuner);
char *status_str;
int ret = hdhomerun_control_get(hd->cs, name, &status_str, NULL);
@@ -572,7 +572,7 @@
memset(vstatus, 0, sizeof(struct hdhomerun_tuner_vstatus_t));
char var_name[32];
- sprintf(var_name, "/tuner%u/vstatus", hd->tuner);
+ hdhomerun_sprintf(var_name, var_name + sizeof(var_name), "/tuner%u/vstatus", hd->tuner);
char *vstatus_str;
int ret = hdhomerun_control_get(hd->cs, var_name, &vstatus_str, NULL);
@@ -640,7 +640,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/streaminfo", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/streaminfo", hd->tuner);
return hdhomerun_control_get(hd->cs, name, pstreaminfo, NULL);
}
@@ -652,7 +652,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/channel", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/channel", hd->tuner);
return hdhomerun_control_get(hd->cs, name, pchannel, NULL);
}
@@ -664,7 +664,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/vchannel", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/vchannel", hd->tuner);
return hdhomerun_control_get(hd->cs, name, pvchannel, NULL);
}
@@ -676,7 +676,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/channelmap", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/channelmap", hd->tuner);
return hdhomerun_control_get(hd->cs, name, pchannelmap, NULL);
}
@@ -688,7 +688,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/filter", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/filter", hd->tuner);
return hdhomerun_control_get(hd->cs, name, pfilter, NULL);
}
@@ -700,7 +700,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/program", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/program", hd->tuner);
return hdhomerun_control_get(hd->cs, name, pprogram, NULL);
}
@@ -712,7 +712,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/target", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/target", hd->tuner);
return hdhomerun_control_get(hd->cs, name, ptarget, NULL);
}
@@ -735,8 +735,8 @@
}
*ptr++ = 0;
- unsigned long raw;
- if (sscanf(result, "%lx", &raw) != 1) {
+ unsigned int raw;
+ if (sscanf(result, "%x", &raw) != 1) {
break;
}
@@ -770,7 +770,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/plotsample", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/plotsample", hd->tuner);
return hdhomerun_device_get_tuner_plotsample_internal(hd, name, psamples, pcount);
}
@@ -792,7 +792,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/lockkey", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/lockkey", hd->tuner);
return hdhomerun_control_get(hd->cs, name, powner, NULL);
}
@@ -834,8 +834,8 @@
}
if (pversion_num) {
- unsigned long version_num;
- if (sscanf(version_str, "%lu", &version_num) != 1) {
+ unsigned int version_num;
+ if (sscanf(version_str, "%u", &version_num) != 1) {
*pversion_num = 0;
} else {
*pversion_num = (uint32_t)version_num;
@@ -887,7 +887,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/channel", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/channel", hd->tuner);
return hdhomerun_control_set_with_lockkey(hd->cs, name, channel, hd->lockkey, NULL, NULL);
}
@@ -899,7 +899,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/vchannel", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/vchannel", hd->tuner);
return hdhomerun_control_set_with_lockkey(hd->cs, name, vchannel, hd->lockkey, NULL, NULL);
}
@@ -911,7 +911,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/channelmap", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/channelmap", hd->tuner);
return hdhomerun_control_set_with_lockkey(hd->cs, name, channelmap, hd->lockkey, NULL, NULL);
}
@@ -923,29 +923,17 @@
}
char name[32];
- sprintf(name, "/tuner%u/filter", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/filter", hd->tuner);
return hdhomerun_control_set_with_lockkey(hd->cs, name, filter, hd->lockkey, NULL, NULL);
}
-static int hdhomerun_device_set_tuner_filter_by_array_append(char **pptr, char *end, uint16_t range_begin, uint16_t range_end)
+static bool_t hdhomerun_device_set_tuner_filter_by_array_append(char *ptr, char *end, uint16_t range_begin, uint16_t range_end)
{
- char *ptr = *pptr;
-
- size_t available = end - ptr;
- size_t required;
-
if (range_begin == range_end) {
- required = snprintf(ptr, available, "0x%04x ", range_begin) + 1;
+ return hdhomerun_sprintf(ptr, end, "0x%04x ", (unsigned int)range_begin);
} else {
- required = snprintf(ptr, available, "0x%04x-0x%04x ", range_begin, range_end) + 1;
+ return hdhomerun_sprintf(ptr, end, "0x%04x-0x%04x ", (unsigned int)range_begin, (unsigned int)range_end);
}
-
- if (required > available) {
- return FALSE;
- }
-
- *pptr = strchr(ptr, 0);
- return TRUE;
}
int hdhomerun_device_set_tuner_filter_by_array(struct hdhomerun_device_t *hd, unsigned char filter_array[0x2000])
@@ -963,9 +951,10 @@
if (range_begin == 0xFFFF) {
continue;
}
- if (!hdhomerun_device_set_tuner_filter_by_array_append(&ptr, end, range_begin, range_end)) {
+ if (!hdhomerun_device_set_tuner_filter_by_array_append(ptr, end, range_begin, range_end)) {
return 0;
}
+ ptr = strchr(ptr, 0);
range_begin = 0xFFFF;
range_end = 0xFFFF;
continue;
@@ -981,16 +970,17 @@
}
if (range_begin != 0xFFFF) {
- if (!hdhomerun_device_set_tuner_filter_by_array_append(&ptr, end, range_begin, range_end)) {
+ if (!hdhomerun_device_set_tuner_filter_by_array_append(ptr, end, range_begin, range_end)) {
return 0;
}
+ ptr = strchr(ptr, 0);
}
/* Remove trailing space. */
if (ptr > filter) {
ptr--;
+ *ptr = 0;
}
- *ptr = 0;
return hdhomerun_device_set_tuner_filter(hd, filter);
}
@@ -1003,7 +993,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/program", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/program", hd->tuner);
return hdhomerun_control_set_with_lockkey(hd->cs, name, program, hd->lockkey, NULL, NULL);
}
@@ -1015,7 +1005,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/target", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/target", hd->tuner);
return hdhomerun_control_set_with_lockkey(hd->cs, name, target, hd->lockkey, NULL, NULL);
}
@@ -1034,7 +1024,7 @@
char target[64];
uint32_t local_ip = hdhomerun_control_get_local_addr(hd->cs);
uint16_t local_port = hdhomerun_video_get_local_port(hd->vs);
- sprintf(target, "%s://%u.%u.%u.%u:%u",
+ hdhomerun_sprintf(target, target + sizeof(target), "%s://%u.%u.%u.%u:%u",
protocol,
(unsigned int)(local_ip >> 24) & 0xFF, (unsigned int)(local_ip >> 16) & 0xFF,
(unsigned int)(local_ip >> 8) & 0xFF, (unsigned int)(local_ip >> 0) & 0xFF,
@@ -1107,10 +1097,10 @@
uint32_t new_lockkey = random_get32();
char name[32];
- sprintf(name, "/tuner%u/lockkey", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/lockkey", hd->tuner);
char new_lockkey_str[64];
- sprintf(new_lockkey_str, "%u", (unsigned int)new_lockkey);
+ hdhomerun_sprintf(new_lockkey_str, new_lockkey_str + sizeof(new_lockkey_str), "%u", (unsigned int)new_lockkey);
int ret = hdhomerun_control_set_with_lockkey(hd->cs, name, new_lockkey_str, hd->lockkey, NULL, perror);
if (ret <= 0) {
@@ -1137,7 +1127,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/lockkey", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/lockkey", hd->tuner);
int ret = hdhomerun_control_set_with_lockkey(hd->cs, name, "none", hd->lockkey, NULL, NULL);
hd->lockkey = 0;
@@ -1155,7 +1145,7 @@
}
char name[32];
- sprintf(name, "/tuner%u/lockkey", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/lockkey", hd->tuner);
int ret = hdhomerun_control_set(hd->cs, name, "force", NULL, NULL);
hd->lockkey = 0;
@@ -1339,13 +1329,11 @@
return NULL;
}
if (ret == 0) {
- strncpy(hd->model, "hdhomerun_atsc", sizeof(hd->model) - 1);
- hd->model[sizeof(hd->model) - 1] = 0;
+ hdhomerun_sprintf(hd->model, hd->model + sizeof(hd->model), "hdhomerun_atsc");
return hd->model;
}
- strncpy(hd->model, model_str, sizeof(hd->model) - 1);
- hd->model[sizeof(hd->model) - 1] = 0;
+ hdhomerun_sprintf(hd->model, hd->model + sizeof(hd->model), "%s", model_str);
return hd->model;
}
@@ -1373,7 +1361,7 @@
if (hd->cs) {
char name[32];
- sprintf(name, "/tuner%u/debug", hd->tuner);
+ hdhomerun_sprintf(name, name + sizeof(name), "/tuner%u/debug", hd->tuner);
char *debug_str;
char *error_str;
diff --git a/libhdhomerun/hdhomerun_device.h b/libhdhomerun/hdhomerun_device.h
old mode 100755
new mode 100644
diff --git a/libhdhomerun/hdhomerun_device_selector.c b/libhdhomerun/hdhomerun_device_selector.c
old mode 100755
new mode 100644
index f57f125..08a47f2
--- a/libhdhomerun/hdhomerun_device_selector.c
+++ b/libhdhomerun/hdhomerun_device_selector.c
@@ -201,7 +201,7 @@
/* Create and add device. */
char device_name[32];
- sprintf(device_name, "%S", wdevice_name);
+ hdhomerun_sprintf(device_name, device_name + sizeof(device_name), "%S", wdevice_name);
struct hdhomerun_device_t *hd = hdhomerun_device_create_from_str(device_name, hds->dbg);
if (!hd) {
@@ -258,9 +258,9 @@
*ptr = 0;
}
- unsigned long a[4];
- unsigned long target_port;
- if (sscanf(target, "%lu.%lu.%lu.%lu:%lu", &a[0], &a[1], &a[2], &a[3], &target_port) != 5) {
+ unsigned int a[4];
+ unsigned int target_port;
+ if (sscanf(target, "%u.%u.%u.%u:%u", &a[0], &a[1], &a[2], &a[3], &target_port) != 5) {
hdhomerun_debug_printf(hds->dbg, "hdhomerun_device_selector_choose_test: device %s in use, no target set (%s)\n", name, target);
return FALSE;
}
diff --git a/libhdhomerun/hdhomerun_device_selector.h b/libhdhomerun/hdhomerun_device_selector.h
old mode 100755
new mode 100644
diff --git a/libhdhomerun/hdhomerun_discover.c b/libhdhomerun/hdhomerun_discover.c
old mode 100755
new mode 100644
index 0307013..83a8f4e
--- a/libhdhomerun/hdhomerun_discover.c
+++ b/libhdhomerun/hdhomerun_discover.c
@@ -46,6 +46,7 @@
unsigned int sock_count;
struct hdhomerun_pkt_t tx_pkt;
struct hdhomerun_pkt_t rx_pkt;
+ struct hdhomerun_debug_t *dbg;
};
static bool_t hdhomerun_discover_sock_add(struct hdhomerun_discover_t *ds, uint32_t local_ip, uint32_t subnet_mask)
@@ -72,6 +73,7 @@
/* Bind socket. */
if (!hdhomerun_sock_bind(sock, local_ip, 0, FALSE)) {
+ hdhomerun_debug_printf(ds->dbg, "discover: failed to bind to %u.%u.%u.%u:0\n", (unsigned int)(local_ip >> 24) & 0xFF, (unsigned int)(local_ip >> 16) & 0xFF, (unsigned int)(local_ip >> 8) & 0xFF, (unsigned int)(local_ip >> 0) & 0xFF);
hdhomerun_sock_destroy(sock);
return FALSE;
}
@@ -86,13 +88,15 @@
return TRUE;
}
-struct hdhomerun_discover_t *hdhomerun_discover_create(void)
+struct hdhomerun_discover_t *hdhomerun_discover_create(struct hdhomerun_debug_t *dbg)
{
struct hdhomerun_discover_t *ds = (struct hdhomerun_discover_t *)calloc(1, sizeof(struct hdhomerun_discover_t));
if (!ds) {
return NULL;
}
+ ds->dbg = dbg;
+
/* Create a routable socket (always first entry). */
if (!hdhomerun_discover_sock_add(ds, 0, 0)) {
free(ds);
@@ -125,8 +129,13 @@
struct hdhomerun_local_ip_info_t ip_info_list[HDHOMERUN_DISOCVER_MAX_SOCK_COUNT];
int count = hdhomerun_local_ip_info(ip_info_list, HDHOMERUN_DISOCVER_MAX_SOCK_COUNT);
if (count < 0) {
+ hdhomerun_debug_printf(ds->dbg, "discover: hdhomerun_local_ip_info returned error\n");
count = 0;
}
+ if (count > HDHOMERUN_DISOCVER_MAX_SOCK_COUNT) {
+ hdhomerun_debug_printf(ds->dbg, "discover: too many local IP addresses\n");
+ count = HDHOMERUN_DISOCVER_MAX_SOCK_COUNT;
+ }
int index;
for (index = 0; index < count; index++) {
@@ -404,7 +413,7 @@
return 0;
}
- struct hdhomerun_discover_t *ds = hdhomerun_discover_create();
+ struct hdhomerun_discover_t *ds = hdhomerun_discover_create(NULL);
if (!ds) {
return -1;
}
diff --git a/libhdhomerun/hdhomerun_discover.h b/libhdhomerun/hdhomerun_discover.h
old mode 100755
new mode 100644
index 2f0d906..633d3a2
--- a/libhdhomerun/hdhomerun_discover.h
+++ b/libhdhomerun/hdhomerun_discover.h
@@ -59,7 +59,7 @@
/*
* Optional: persistent discover instance available for discover polling use.
*/
-extern LIBTYPE struct hdhomerun_discover_t *hdhomerun_discover_create(void);
+extern LIBTYPE struct hdhomerun_discover_t *hdhomerun_discover_create(struct hdhomerun_debug_t *dbg);
extern LIBTYPE void hdhomerun_discover_destroy(struct hdhomerun_discover_t *ds);
extern LIBTYPE int hdhomerun_discover_find_devices(struct hdhomerun_discover_t *ds, uint32_t target_ip, uint32_t device_type, uint32_t device_id, struct hdhomerun_discover_device_t result_list[], int max_count);
diff --git a/libhdhomerun/hdhomerun_os.h b/libhdhomerun/hdhomerun_os.h
old mode 100755
new mode 100644
diff --git a/libhdhomerun/hdhomerun_os_posix.c b/libhdhomerun/hdhomerun_os_posix.c
old mode 100755
new mode 100644
index 25eece8..91b9edf
--- a/libhdhomerun/hdhomerun_os_posix.c
+++ b/libhdhomerun/hdhomerun_os_posix.c
@@ -36,12 +36,12 @@
{
FILE *fp = fopen("/dev/urandom", "rb");
if (!fp) {
- return (uint32_t)rand();
+ return (uint32_t)getcurrenttime();
}
uint32_t Result;
if (fread(&Result, 4, 1, fp) != 1) {
- Result = (uint32_t)rand();
+ Result = (uint32_t)getcurrenttime();
}
fclose(fp);
@@ -103,3 +103,33 @@
msleep_approx(stop_time - current_time);
}
}
+
+bool_t hdhomerun_vsprintf(char *buffer, char *end, const char *fmt, va_list ap)
+{
+ if (buffer >= end) {
+ return FALSE;
+ }
+
+ int length = vsnprintf(buffer, end - buffer - 1, fmt, ap);
+ if (length < 0) {
+ *buffer = 0;
+ return FALSE;
+ }
+
+ if (buffer + length + 1 > end) {
+ *(end - 1) = 0;
+ return FALSE;
+
+ }
+
+ return TRUE;
+}
+
+bool_t hdhomerun_sprintf(char *buffer, char *end, const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ bool_t result = hdhomerun_vsprintf(buffer, end, fmt, ap);
+ va_end(ap);
+ return result;
+}
diff --git a/libhdhomerun/hdhomerun_os_posix.h b/libhdhomerun/hdhomerun_os_posix.h
old mode 100755
new mode 100644
index 2969b20..3d94991
--- a/libhdhomerun/hdhomerun_os_posix.h
+++ b/libhdhomerun/hdhomerun_os_posix.h
@@ -66,6 +66,9 @@
extern LIBTYPE void msleep_approx(uint64_t ms);
extern LIBTYPE void msleep_minimum(uint64_t ms);
+extern LIBTYPE bool_t hdhomerun_vsprintf(char *buffer, char *end, const char *fmt, va_list ap);
+extern LIBTYPE bool_t hdhomerun_sprintf(char *buffer, char *end, const char *fmt, ...);
+
#ifdef __cplusplus
}
#endif
diff --git a/libhdhomerun/hdhomerun_os_windows.c b/libhdhomerun/hdhomerun_os_windows.c
old mode 100755
new mode 100644
index 5f844db..4de10e4
--- a/libhdhomerun/hdhomerun_os_windows.c
+++ b/libhdhomerun/hdhomerun_os_windows.c
@@ -36,7 +36,7 @@
{
HCRYPTPROV hProv;
if (!CryptAcquireContext(&hProv, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
- return (uint32_t)rand();
+ return (uint32_t)getcurrenttime();
}
uint32_t Result;
@@ -127,6 +127,36 @@
ReleaseMutex(*mutex);
}
+bool_t hdhomerun_vsprintf(char *buffer, char *end, const char *fmt, va_list ap)
+{
+ if (buffer >= end) {
+ return FALSE;
+ }
+
+ int length = _vsnprintf(buffer, end - buffer - 1, fmt, ap);
+ if (length < 0) {
+ *buffer = 0;
+ return FALSE;
+ }
+
+ if (buffer + length + 1 > end) {
+ *(end - 1) = 0;
+ return FALSE;
+
+ }
+
+ return TRUE;
+}
+
+bool_t hdhomerun_sprintf(char *buffer, char *end, const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ bool_t result = hdhomerun_vsprintf(buffer, end, fmt, ap);
+ va_end(ap);
+ return result;
+}
+
/*
* The console output format should be set to UTF-8, however in XP and Vista this breaks batch file processing.
* Attempting to restore on exit fails to restore if the program is terminated by the user.
diff --git a/libhdhomerun/hdhomerun_os_windows.h b/libhdhomerun/hdhomerun_os_windows.h
old mode 100755
new mode 100644
index ff9e1d4..b151fd1
--- a/libhdhomerun/hdhomerun_os_windows.h
+++ b/libhdhomerun/hdhomerun_os_windows.h
@@ -69,7 +69,6 @@
#define atoll _atoi64
#define strdup _strdup
#define strcasecmp _stricmp
-#define snprintf _snprintf
#define fseeko _fseeki64
#define ftello _ftelli64
#define THREAD_FUNC_PREFIX DWORD WINAPI
@@ -89,6 +88,9 @@
extern LIBTYPE void pthread_mutex_lock(pthread_mutex_t *mutex);
extern LIBTYPE void pthread_mutex_unlock(pthread_mutex_t *mutex);
+extern LIBTYPE bool_t hdhomerun_vsprintf(char *buffer, char *end, const char *fmt, va_list ap);
+extern LIBTYPE bool_t hdhomerun_sprintf(char *buffer, char *end, const char *fmt, ...);
+
/*
* The console output format should be set to UTF-8, however in XP and Vista this breaks batch file processing.
* Attempting to restore on exit fails to restore if the program is terminated by the user.
diff --git a/libhdhomerun/hdhomerun_pkt.c b/libhdhomerun/hdhomerun_pkt.c
old mode 100755
new mode 100644
diff --git a/libhdhomerun/hdhomerun_pkt.h b/libhdhomerun/hdhomerun_pkt.h
old mode 100755
new mode 100644
diff --git a/libhdhomerun/hdhomerun_sock.h b/libhdhomerun/hdhomerun_sock.h
old mode 100755
new mode 100644
diff --git a/libhdhomerun/hdhomerun_sock_posix.c b/libhdhomerun/hdhomerun_sock_posix.c
old mode 100755
new mode 100644
index 52dccc0..74dcd7c
--- a/libhdhomerun/hdhomerun_sock_posix.c
+++ b/libhdhomerun/hdhomerun_sock_posix.c
@@ -105,6 +105,19 @@
struct ifreq *ifr = (struct ifreq *)ptr;
ptr += _SIZEOF_ADDR_IFREQ(*ifr);
+ /* Flags. */
+ if (ioctl(sock, SIOCGIFFLAGS, ifr) != 0) {
+ continue;
+ }
+
+ if ((ifr->ifr_flags & IFF_UP) == 0) {
+ continue;
+ }
+ if ((ifr->ifr_flags & IFF_RUNNING) == 0) {
+ continue;
+ }
+
+ /* Local IP address. */
if (ioctl(sock, SIOCGIFADDR, ifr) != 0) {
continue;
}
@@ -115,6 +128,7 @@
continue;
}
+ /* Subnet mask. */
if (ioctl(sock, SIOCGIFNETMASK, ifr) != 0) {
continue;
}
@@ -122,13 +136,14 @@
struct sockaddr_in *subnet_mask_in = (struct sockaddr_in *)&(ifr->ifr_addr);
uint32_t subnet_mask = ntohl(subnet_mask_in->sin_addr.s_addr);
- struct hdhomerun_local_ip_info_t *ip_info = &ip_info_list[count++];
- ip_info->ip_addr = ip_addr;
- ip_info->subnet_mask = subnet_mask;
-
- if (count >= max_count) {
- break;
+ /* Report. */
+ if (count < max_count) {
+ struct hdhomerun_local_ip_info_t *ip_info = &ip_info_list[count];
+ ip_info->ip_addr = ip_addr;
+ ip_info->subnet_mask = subnet_mask;
}
+
+ count++;
}
free(ifc.ifc_buf);
diff --git a/libhdhomerun/hdhomerun_sock_windows.c b/libhdhomerun/hdhomerun_sock_windows.c
old mode 100755
new mode 100644
index c599694..4eb0c45
--- a/libhdhomerun/hdhomerun_sock_windows.c
+++ b/libhdhomerun/hdhomerun_sock_windows.c
@@ -91,14 +91,13 @@
continue;
}
- struct hdhomerun_local_ip_info_t *ip_info = &ip_info_list[count++];
- ip_info->ip_addr = ip_addr;
- ip_info->subnet_mask = subnet_mask;
-
- if (count >= max_count) {
- break;
+ if (count < max_count) {
+ struct hdhomerun_local_ip_info_t *ip_info = &ip_info_list[count];
+ ip_info->ip_addr = ip_addr;
+ ip_info->subnet_mask = subnet_mask;
}
+ count++;
IPAddr = IPAddr->Next;
}
diff --git a/libhdhomerun/hdhomerun_types.h b/libhdhomerun/hdhomerun_types.h
old mode 100755
new mode 100644
diff --git a/libhdhomerun/hdhomerun_video.c b/libhdhomerun/hdhomerun_video.c
old mode 100755
new mode 100644
index 52b8dca..abfb7ac
--- a/libhdhomerun/hdhomerun_video.c
+++ b/libhdhomerun/hdhomerun_video.c
@@ -372,10 +372,10 @@
struct hdhomerun_video_stats_t stats;
hdhomerun_video_get_stats(vs, &stats);
- hdhomerun_debug_printf(vs->dbg, "video sock: pkt=%lu net=%lu te=%lu miss=%lu drop=%lu\n",
- (unsigned long)stats.packet_count, (unsigned long)stats.network_error_count,
- (unsigned long)stats.transport_error_count, (unsigned long)stats.sequence_error_count,
- (unsigned long)stats.overflow_error_count
+ hdhomerun_debug_printf(vs->dbg, "video sock: pkt=%u net=%u te=%u miss=%u drop=%u\n",
+ (unsigned int)stats.packet_count, (unsigned int)stats.network_error_count,
+ (unsigned int)stats.transport_error_count, (unsigned int)stats.sequence_error_count,
+ (unsigned int)stats.overflow_error_count
);
}
diff --git a/libhdhomerun/hdhomerun_video.h b/libhdhomerun/hdhomerun_video.h
old mode 100755
new mode 100644
diff --git a/libhdhomerun/lgpl.txt b/libhdhomerun/lgpl.txt
old mode 100755
new mode 100644