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. */
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) {
hdhomerun_debug_printf(ds->dbg, "discover: resource error\n");
return;
@ -181,7 +181,7 @@ static void hdhomerun_discover_sock_add_ipv4(void *arg, uint32_t ifindex, const
}
/* 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) {
hdhomerun_debug_printf(ds->dbg, "discover: resource error\n");
return;
@ -347,7 +347,7 @@ static void hdhomerun_discover_sock_detect_ipv6_localhost(struct hdhomerun_disco
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) {
return;
}
@ -378,7 +378,7 @@ static void hdhomerun_discover_sock_detect_ipv4_localhost(struct hdhomerun_disco
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) {
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)
{
if (hdhomerun_sock_sockaddr_is_ipv6_localhost((const struct sockaddr *)&device_if->ip_addr)) {
return 0; /* highest priority */
}
if (device_if->ip_addr.ss_family == AF_INET) {
if (hdhomerun_sock_sockaddr_is_ipv4_localhost((const struct sockaddr *)&device_if->ip_addr)) {
return 1;
}
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;
return 1; /* localhost ipv4 */
}
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)
@ -820,7 +820,7 @@ static void hdhomerun_discover_recv_internal_device_type(struct hdhomerun_discov
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) {
return;
}
@ -1231,8 +1231,8 @@ static bool hdhomerun_discover_recvfrom(struct hdhomerun_discover_t *ds, struct
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_if_t *device_if = (struct hdhomerun_discover2_device_if_t *)calloc(sizeof(struct hdhomerun_discover2_device_if_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(1, sizeof(struct hdhomerun_discover2_device_if_t));
if (!device || !device_if) {
if (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);
char *ifreq_buffer = (char *)calloc(ifreq_buffer_size, 1);
char *ifreq_buffer = (char *)calloc(1, ifreq_buffer_size);
if (!ifreq_buffer) {
close(sock);
return false;

View file

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