mirror of
https://github.com/Silicondust/libhdhomerun
synced 2025-08-19 04:59:32 -07:00
20221027
This commit is contained in:
parent
328fdab47f
commit
7f7c09e8b9
2 changed files with 24 additions and 29 deletions
|
@ -97,13 +97,19 @@ static void hdhomerun_discover_sock_add_ipv6(void *arg, uint32_t ifindex, const
|
||||||
}
|
}
|
||||||
|
|
||||||
struct hdhomerun_discover_t *ds = (struct hdhomerun_discover_t *)arg;
|
struct hdhomerun_discover_t *ds = (struct hdhomerun_discover_t *)arg;
|
||||||
struct sockaddr_in6 *detected_ip = (struct sockaddr_in6 *)local_ip;
|
struct sockaddr_in6 *local_ip_in6 = (struct sockaddr_in6 *)local_ip;
|
||||||
|
|
||||||
|
char local_ip_str[64];
|
||||||
|
hdhomerun_sock_sockaddr_to_ip_str(local_ip_str, local_ip, true);
|
||||||
|
if (hdhomerun_sock_sockaddr_is_addr(local_ip)) {
|
||||||
|
hdhomerun_debug_printf(ds->dbg, "discover: local ip %s/%u\n", local_ip_str, cidr);
|
||||||
|
}
|
||||||
|
|
||||||
struct hdhomerun_discover_sock_t **pprev = &ds->ipv6_socks;
|
struct hdhomerun_discover_sock_t **pprev = &ds->ipv6_socks;
|
||||||
struct hdhomerun_discover_sock_t *p = ds->ipv6_socks;
|
struct hdhomerun_discover_sock_t *p = ds->ipv6_socks;
|
||||||
while (p) {
|
while (p) {
|
||||||
struct sockaddr_in6 *p_ip = (struct sockaddr_in6 *)&p->local_ip;
|
struct sockaddr_in6 *p_ip = (struct sockaddr_in6 *)&p->local_ip;
|
||||||
if ((p->ifindex == ifindex) && (memcmp(p_ip->sin6_addr.s6_addr, detected_ip->sin6_addr.s6_addr, 16) == 0)) {
|
if ((p->ifindex == ifindex) && (memcmp(p_ip->sin6_addr.s6_addr, local_ip_in6->sin6_addr.s6_addr, 16) == 0)) {
|
||||||
p->new_flag = true;
|
p->new_flag = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -127,22 +133,16 @@ static void hdhomerun_discover_sock_add_ipv6(void *arg, uint32_t ifindex, const
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Bind socket. */
|
/* Bind socket. */
|
||||||
detected_ip->sin6_port = htons(hdhomerun_discover_get_local_port(ds));
|
local_ip_in6->sin6_port = htons(hdhomerun_discover_get_local_port(ds));
|
||||||
|
|
||||||
if (!hdhomerun_sock_bind_ex(dss->sock, (const struct sockaddr *)detected_ip, true)) {
|
|
||||||
if (ds->dbg) {
|
|
||||||
int last_error = hdhomerun_sock_getlasterror();
|
|
||||||
char detected_ip_str[64];
|
|
||||||
hdhomerun_sock_sockaddr_to_ip_str(detected_ip_str, (const struct sockaddr *)detected_ip, true);
|
|
||||||
hdhomerun_debug_printf(ds->dbg, "discover: failed to bind to local ip %s (%d)\n", detected_ip_str, last_error);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (!hdhomerun_sock_bind_ex(dss->sock, local_ip, true)) {
|
||||||
|
hdhomerun_debug_printf(ds->dbg, "discover: failed to bind to local ip %s (%d)\n", local_ip_str, hdhomerun_sock_getlasterror());
|
||||||
hdhomerun_discover_sock_free(dss);
|
hdhomerun_discover_sock_free(dss);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Success. */
|
/* Success. */
|
||||||
memcpy(&dss->local_ip, detected_ip, sizeof(struct sockaddr_in6));
|
memcpy(&dss->local_ip, local_ip_in6, sizeof(struct sockaddr_in6));
|
||||||
dss->ifindex = ifindex;
|
dss->ifindex = ifindex;
|
||||||
dss->new_flag = true;
|
dss->new_flag = true;
|
||||||
*pprev = dss;
|
*pprev = dss;
|
||||||
|
@ -155,14 +155,20 @@ static void hdhomerun_discover_sock_add_ipv4(void *arg, uint32_t ifindex, const
|
||||||
}
|
}
|
||||||
|
|
||||||
struct hdhomerun_discover_t *ds = (struct hdhomerun_discover_t *)arg;
|
struct hdhomerun_discover_t *ds = (struct hdhomerun_discover_t *)arg;
|
||||||
struct sockaddr_in *detected_ip = (struct sockaddr_in *)local_ip;
|
struct sockaddr_in *local_ip_in = (struct sockaddr_in *)local_ip;
|
||||||
uint32_t detected_subnet_mask = 0xFFFFFFFF << (32 - cidr);
|
uint32_t detected_subnet_mask = 0xFFFFFFFF << (32 - cidr);
|
||||||
|
|
||||||
|
char local_ip_str[64];
|
||||||
|
hdhomerun_sock_sockaddr_to_ip_str(local_ip_str, local_ip, true);
|
||||||
|
if (hdhomerun_sock_sockaddr_is_addr(local_ip)) {
|
||||||
|
hdhomerun_debug_printf(ds->dbg, "discover: local ip %s/%u\n", local_ip_str, cidr);
|
||||||
|
}
|
||||||
|
|
||||||
struct hdhomerun_discover_sock_t **pprev = &ds->ipv4_socks;
|
struct hdhomerun_discover_sock_t **pprev = &ds->ipv4_socks;
|
||||||
struct hdhomerun_discover_sock_t *p = ds->ipv4_socks;
|
struct hdhomerun_discover_sock_t *p = ds->ipv4_socks;
|
||||||
while (p) {
|
while (p) {
|
||||||
struct sockaddr_in *p_ip = (struct sockaddr_in *)&p->local_ip;
|
struct sockaddr_in *p_ip = (struct sockaddr_in *)&p->local_ip;
|
||||||
if ((p->ifindex == ifindex) && (p_ip->sin_addr.s_addr == detected_ip->sin_addr.s_addr) && (p->ipv4_subnet_mask == detected_subnet_mask)) {
|
if ((p->ifindex == ifindex) && (p_ip->sin_addr.s_addr == local_ip_in->sin_addr.s_addr) && (p->ipv4_subnet_mask == detected_subnet_mask)) {
|
||||||
p->new_flag = true;
|
p->new_flag = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -186,22 +192,16 @@ static void hdhomerun_discover_sock_add_ipv4(void *arg, uint32_t ifindex, const
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Bind socket. */
|
/* Bind socket. */
|
||||||
detected_ip->sin_port = htons(hdhomerun_discover_get_local_port(ds));
|
local_ip_in->sin_port = htons(hdhomerun_discover_get_local_port(ds));
|
||||||
|
|
||||||
if (!hdhomerun_sock_bind_ex(dss->sock, (const struct sockaddr *)detected_ip, true)) {
|
|
||||||
if (ds->dbg) {
|
|
||||||
int last_error = hdhomerun_sock_getlasterror();
|
|
||||||
char detected_ip_str[64];
|
|
||||||
hdhomerun_sock_sockaddr_to_ip_str(detected_ip_str, (const struct sockaddr *)detected_ip, true);
|
|
||||||
hdhomerun_debug_printf(ds->dbg, "discover: failed to bind to local ip %s (%d)\n", detected_ip_str, last_error);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (!hdhomerun_sock_bind_ex(dss->sock, local_ip, true)) {
|
||||||
|
hdhomerun_debug_printf(ds->dbg, "discover: failed to bind to local ip %s (%d)\n", local_ip_str, hdhomerun_sock_getlasterror());
|
||||||
hdhomerun_discover_sock_free(dss);
|
hdhomerun_discover_sock_free(dss);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Success. */
|
/* Success. */
|
||||||
memcpy(&dss->local_ip, detected_ip, sizeof(struct sockaddr_in));
|
memcpy(&dss->local_ip, local_ip_in, sizeof(struct sockaddr_in));
|
||||||
dss->ifindex = ifindex;
|
dss->ifindex = ifindex;
|
||||||
dss->ipv4_subnet_mask = detected_subnet_mask;
|
dss->ipv4_subnet_mask = detected_subnet_mask;
|
||||||
dss->new_flag = true;
|
dss->new_flag = true;
|
||||||
|
|
|
@ -66,11 +66,6 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((adapter->IfType != MIB_IF_TYPE_ETHERNET) && (adapter->IfType != IF_TYPE_IEEE80211)) {
|
|
||||||
adapter = adapter->Next;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (adapter->PhysicalAddressLength != 6) {
|
if (adapter->PhysicalAddressLength != 6) {
|
||||||
adapter = adapter->Next;
|
adapter = adapter->Next;
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue