mirror of
https://github.com/Silicondust/libhdhomerun
synced 2025-08-14 02:37:05 -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 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 *p = ds->ipv6_socks;
|
||||
while (p) {
|
||||
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;
|
||||
return;
|
||||
}
|
||||
|
@ -127,22 +133,16 @@ static void hdhomerun_discover_sock_add_ipv6(void *arg, uint32_t ifindex, const
|
|||
}
|
||||
|
||||
/* Bind socket. */
|
||||
detected_ip->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);
|
||||
}
|
||||
local_ip_in6->sin6_port = htons(hdhomerun_discover_get_local_port(ds));
|
||||
|
||||
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);
|
||||
return;
|
||||
}
|
||||
|
||||
/* 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->new_flag = true;
|
||||
*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 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);
|
||||
|
||||
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 *p = ds->ipv4_socks;
|
||||
while (p) {
|
||||
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;
|
||||
return;
|
||||
}
|
||||
|
@ -186,22 +192,16 @@ static void hdhomerun_discover_sock_add_ipv4(void *arg, uint32_t ifindex, const
|
|||
}
|
||||
|
||||
/* Bind socket. */
|
||||
detected_ip->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);
|
||||
}
|
||||
local_ip_in->sin_port = htons(hdhomerun_discover_get_local_port(ds));
|
||||
|
||||
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);
|
||||
return;
|
||||
}
|
||||
|
||||
/* 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->ipv4_subnet_mask = detected_subnet_mask;
|
||||
dss->new_flag = true;
|
||||
|
|
|
@ -66,11 +66,6 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba
|
|||
continue;
|
||||
}
|
||||
|
||||
if ((adapter->IfType != MIB_IF_TYPE_ETHERNET) && (adapter->IfType != IF_TYPE_IEEE80211)) {
|
||||
adapter = adapter->Next;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (adapter->PhysicalAddressLength != 6) {
|
||||
adapter = adapter->Next;
|
||||
continue;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue