release 20250506

This commit is contained in:
nickkelsey 2025-05-12 13:54:01 -07:00
commit 572ddaf9a0
3 changed files with 69 additions and 96 deletions

View file

@ -120,7 +120,7 @@ static void hdhomerun_discover_sock_add_ipv6(void *arg, uint32_t ifindex, const
} }
/* Create socket. */ /* Create socket. */
struct hdhomerun_discover_sock_t *dss = (struct hdhomerun_discover_sock_t *)calloc(sizeof(struct hdhomerun_discover_sock_t), 1); struct hdhomerun_discover_sock_t *dss = (struct hdhomerun_discover_sock_t *)calloc(1, sizeof(struct hdhomerun_discover_sock_t));
if (!dss) { if (!dss) {
hdhomerun_debug_printf(ds->dbg, "discover: resource error\n"); hdhomerun_debug_printf(ds->dbg, "discover: resource error\n");
return; return;
@ -181,7 +181,7 @@ static void hdhomerun_discover_sock_add_ipv4(void *arg, uint32_t ifindex, const
} }
/* Create socket. */ /* Create socket. */
struct hdhomerun_discover_sock_t *dss = (struct hdhomerun_discover_sock_t *)calloc(sizeof(struct hdhomerun_discover_sock_t), 1); struct hdhomerun_discover_sock_t *dss = (struct hdhomerun_discover_sock_t *)calloc(1, sizeof(struct hdhomerun_discover_sock_t));
if (!dss) { if (!dss) {
hdhomerun_debug_printf(ds->dbg, "discover: resource error\n"); hdhomerun_debug_printf(ds->dbg, "discover: resource error\n");
return; return;
@ -347,7 +347,7 @@ static void hdhomerun_discover_sock_detect_ipv6_localhost(struct hdhomerun_disco
return; return;
} }
struct hdhomerun_discover_sock_t *dss = (struct hdhomerun_discover_sock_t *)calloc(sizeof(struct hdhomerun_discover_sock_t), 1); struct hdhomerun_discover_sock_t *dss = (struct hdhomerun_discover_sock_t *)calloc(1, sizeof(struct hdhomerun_discover_sock_t));
if (!dss) { if (!dss) {
return; return;
} }
@ -378,7 +378,7 @@ static void hdhomerun_discover_sock_detect_ipv4_localhost(struct hdhomerun_disco
return; return;
} }
struct hdhomerun_discover_sock_t *dss = (struct hdhomerun_discover_sock_t *)calloc(sizeof(struct hdhomerun_discover_sock_t), 1); struct hdhomerun_discover_sock_t *dss = (struct hdhomerun_discover_sock_t *)calloc(1, sizeof(struct hdhomerun_discover_sock_t));
if (!dss) { if (!dss) {
return; return;
} }
@ -772,31 +772,31 @@ static void hdhomerun_discover_send_ipv4_localhost(struct hdhomerun_discover_t *
static uint8_t hdhomerun_discover_compute_device_if_priority(struct hdhomerun_discover2_device_if_t *device_if) static uint8_t hdhomerun_discover_compute_device_if_priority(struct hdhomerun_discover2_device_if_t *device_if)
{ {
if (hdhomerun_sock_sockaddr_is_ipv6_localhost((const struct sockaddr *)&device_if->ip_addr)) { if (device_if->ip_addr.ss_family == AF_INET) {
return 0; /* highest priority */
}
if (hdhomerun_sock_sockaddr_is_ipv4_localhost((const struct sockaddr *)&device_if->ip_addr)) { if (hdhomerun_sock_sockaddr_is_ipv4_localhost((const struct sockaddr *)&device_if->ip_addr)) {
return 1; return 1; /* localhost ipv4 */
}
if (device_if->ip_addr.ss_family == AF_INET6) {
if (hdhomerun_sock_sockaddr_is_ipv6_global((const struct sockaddr *)&device_if->ip_addr)) {
return 2;
}
if (!hdhomerun_sock_sockaddr_is_ipv6_linklocal((const struct sockaddr *)&device_if->ip_addr)) {
return 3;
}
return 4;
} }
if (!hdhomerun_sock_sockaddr_is_ipv4_autoip((const struct sockaddr *)&device_if->ip_addr)) { if (!hdhomerun_sock_sockaddr_is_ipv4_autoip((const struct sockaddr *)&device_if->ip_addr)) {
return 5; return 2; /* dhcp or static ipv4 */
} }
return 6; return 6; /* auto ip */
} else {
if (hdhomerun_sock_sockaddr_is_ipv6_localhost((const struct sockaddr *)&device_if->ip_addr)) {
return 0; /* localhost ipv6 = highest priority */
}
if (hdhomerun_sock_sockaddr_is_ipv6_global((const struct sockaddr *)&device_if->ip_addr)) {
return 3; /* global ipv6 */
}
if (!hdhomerun_sock_sockaddr_is_ipv6_linklocal((const struct sockaddr *)&device_if->ip_addr)) {
return 4; /* site ipv6 */
}
return 5; /* link-local ipv6 */
}
} }
static void hdhomerun_discover_recv_internal_device_type(struct hdhomerun_discover2_device_t *device, struct hdhomerun_pkt_t *rx_pkt) static void hdhomerun_discover_recv_internal_device_type(struct hdhomerun_discover2_device_t *device, struct hdhomerun_pkt_t *rx_pkt)
@ -820,7 +820,7 @@ static void hdhomerun_discover_recv_internal_device_type(struct hdhomerun_discov
p = p->next; p = p->next;
} }
struct hdhomerun_discover2_device_type_t *new_type = (struct hdhomerun_discover2_device_type_t *)calloc(sizeof(struct hdhomerun_discover2_device_type_t), 1); struct hdhomerun_discover2_device_type_t *new_type = (struct hdhomerun_discover2_device_type_t *)calloc(1, sizeof(struct hdhomerun_discover2_device_type_t));
if (!new_type) { if (!new_type) {
return; return;
} }
@ -1231,8 +1231,8 @@ static bool hdhomerun_discover_recvfrom(struct hdhomerun_discover_t *ds, struct
return activity; return activity;
} }
struct hdhomerun_discover2_device_t *device = (struct hdhomerun_discover2_device_t *)calloc(sizeof(struct hdhomerun_discover2_device_t), 1); struct hdhomerun_discover2_device_t *device = (struct hdhomerun_discover2_device_t *)calloc(1, sizeof(struct hdhomerun_discover2_device_t));
struct hdhomerun_discover2_device_if_t *device_if = (struct hdhomerun_discover2_device_if_t *)calloc(sizeof(struct hdhomerun_discover2_device_if_t), 1); struct hdhomerun_discover2_device_if_t *device_if = (struct hdhomerun_discover2_device_if_t *)calloc(1, sizeof(struct hdhomerun_discover2_device_if_t));
if (!device || !device_if) { if (!device || !device_if) {
if (device) { if (device) {
free(device); free(device);

View file

@ -59,7 +59,7 @@ bool hdhomerun_local_ip_info2(int af, hdhomerun_local_ip_info2_callback_t callba
} }
int ifreq_buffer_size = 128 * sizeof(struct ifreq); int ifreq_buffer_size = 128 * sizeof(struct ifreq);
char *ifreq_buffer = (char *)calloc(ifreq_buffer_size, 1); char *ifreq_buffer = (char *)calloc(1, ifreq_buffer_size);
if (!ifreq_buffer) { if (!ifreq_buffer) {
close(sock); close(sock);
return false; return false;

View file

@ -281,6 +281,29 @@ bool hdhomerun_sock_bind_ex(struct hdhomerun_sock_t *sock, const struct sockaddr
return true; return true;
} }
static bool hdhomerun_sock_poll(struct hdhomerun_sock_t *sock, short events, uint64_t current_time, uint64_t stop_time)
{
struct pollfd poll_event;
poll_event.fd = sock->sock;
poll_event.events = events;
poll_event.revents = 0;
while (current_time < stop_time) {
uint64_t timeout = stop_time - current_time;
if (poll(&poll_event, 1, (int)timeout) > 0) {
return (poll_event.revents & events) != 0;
}
if ((errno != EAGAIN) && (errno != EWOULDBLOCK) && (errno != EINPROGRESS)) {
return false;
}
current_time = getcurrenttime();
}
return false;
}
bool hdhomerun_sock_connect_ex(struct hdhomerun_sock_t *sock, const struct sockaddr *remote_addr, uint64_t timeout) bool hdhomerun_sock_connect_ex(struct hdhomerun_sock_t *sock, const struct sockaddr *remote_addr, uint64_t timeout)
{ {
socklen_t remote_addr_size; socklen_t remote_addr_size;
@ -301,16 +324,8 @@ bool hdhomerun_sock_connect_ex(struct hdhomerun_sock_t *sock, const struct socka
} }
} }
struct pollfd poll_event; uint64_t current_time = getcurrenttime();
poll_event.fd = sock->sock; if (!hdhomerun_sock_poll(sock, POLLOUT, current_time, current_time + timeout)) {
poll_event.events = POLLOUT;
poll_event.revents = 0;
if (poll(&poll_event, 1, (int)timeout) <= 0) {
return false;
}
if ((poll_event.revents & POLLOUT) == 0) {
return false; return false;
} }
@ -334,19 +349,11 @@ bool hdhomerun_sock_send(struct hdhomerun_sock_t *sock, const void *data, size_t
length -= ret; length -= ret;
} }
uint64_t stop_time = getcurrenttime() + timeout; uint64_t current_time = getcurrenttime();
uint64_t stop_time = current_time + timeout;
while (1) { while (1) {
struct pollfd poll_event; if (!hdhomerun_sock_poll(sock, POLLOUT, current_time, stop_time)) {
poll_event.fd = sock->sock;
poll_event.events = POLLOUT;
poll_event.revents = 0;
if (poll(&poll_event, 1, (int)timeout) <= 0) {
return false;
}
if ((poll_event.revents & POLLOUT) == 0) {
return false; return false;
} }
@ -364,12 +371,7 @@ bool hdhomerun_sock_send(struct hdhomerun_sock_t *sock, const void *data, size_t
length -= ret; length -= ret;
} }
uint64_t current_time = getcurrenttime(); current_time = getcurrenttime();
if (current_time >= stop_time) {
return false;
}
timeout = stop_time - current_time;
} }
} }
@ -402,19 +404,11 @@ bool hdhomerun_sock_sendto_ex(struct hdhomerun_sock_t *sock, const struct sockad
length -= ret; length -= ret;
} }
uint64_t stop_time = getcurrenttime() + timeout; uint64_t current_time = getcurrenttime();
uint64_t stop_time = current_time + timeout;
while (1) { while (1) {
struct pollfd poll_event; if (!hdhomerun_sock_poll(sock, POLLOUT, current_time, stop_time)) {
poll_event.fd = sock->sock;
poll_event.events = POLLOUT;
poll_event.revents = 0;
if (poll(&poll_event, 1, (int)timeout) <= 0) {
return false;
}
if ((poll_event.revents & POLLOUT) == 0) {
return false; return false;
} }
@ -432,12 +426,7 @@ bool hdhomerun_sock_sendto_ex(struct hdhomerun_sock_t *sock, const struct sockad
length -= ret; length -= ret;
} }
uint64_t current_time = getcurrenttime(); current_time = getcurrenttime();
if (current_time >= stop_time) {
return false;
}
timeout = stop_time - current_time;
} }
} }
@ -456,26 +445,18 @@ bool hdhomerun_sock_recv(struct hdhomerun_sock_t *sock, void *data, size_t *leng
return false; return false;
} }
struct pollfd poll_event; uint64_t current_time = getcurrenttime();
poll_event.fd = sock->sock; if (!hdhomerun_sock_poll(sock, POLLIN, current_time, current_time + timeout)) {
poll_event.events = POLLIN;
poll_event.revents = 0;
if (poll(&poll_event, 1, (int)timeout) <= 0) {
return false;
}
if ((poll_event.revents & POLLIN) == 0) {
return false; return false;
} }
ret = recv(sock->sock, data, *length, 0); ret = recv(sock->sock, data, *length, 0);
if (ret > 0) { if (ret <= 0) {
*length = (size_t)ret; return false;
return true;
} }
return false; *length = (size_t)ret;
return true;
} }
bool hdhomerun_sock_recvfrom_ex(struct hdhomerun_sock_t *sock, struct sockaddr_storage *remote_addr, void *data, size_t *length, uint64_t timeout) bool hdhomerun_sock_recvfrom_ex(struct hdhomerun_sock_t *sock, struct sockaddr_storage *remote_addr, void *data, size_t *length, uint64_t timeout)
@ -494,24 +475,16 @@ bool hdhomerun_sock_recvfrom_ex(struct hdhomerun_sock_t *sock, struct sockaddr_s
return false; return false;
} }
struct pollfd poll_event; uint64_t current_time = getcurrenttime();
poll_event.fd = sock->sock; if (!hdhomerun_sock_poll(sock, POLLIN, current_time, current_time + timeout)) {
poll_event.events = POLLIN;
poll_event.revents = 0;
if (poll(&poll_event, 1, (int)timeout) <= 0) {
return false;
}
if ((poll_event.revents & POLLIN) == 0) {
return false; return false;
} }
ret = recvfrom(sock->sock, data, *length, 0, (struct sockaddr *)remote_addr, &sockaddr_size); ret = recvfrom(sock->sock, data, *length, 0, (struct sockaddr *)remote_addr, &sockaddr_size);
if (ret > 0) { if (ret <= 0) {
*length = (size_t)ret; return false;
return true;
} }
return false; *length = (size_t)ret;
return true;
} }