From 572ddaf9a06afbc098377f84ee840f7644cf4390 Mon Sep 17 00:00:00 2001 From: nickkelsey Date: Mon, 12 May 2025 13:54:01 -0700 Subject: [PATCH] release 20250506 --- hdhomerun_discover.c | 46 +++++++-------- hdhomerun_sock_netdevice.c | 2 +- hdhomerun_sock_posix.c | 117 ++++++++++++++----------------------- 3 files changed, 69 insertions(+), 96 deletions(-) diff --git a/hdhomerun_discover.c b/hdhomerun_discover.c index 8dae716..5ae07b7 100644 --- a/hdhomerun_discover.c +++ b/hdhomerun_discover.c @@ -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; /* localhost ipv4 */ + } - if (hdhomerun_sock_sockaddr_is_ipv4_localhost((const struct sockaddr *)&device_if->ip_addr)) { - return 1; - } + if (!hdhomerun_sock_sockaddr_is_ipv4_autoip((const struct sockaddr *)&device_if->ip_addr)) { + return 2; /* dhcp or static ipv4 */ + } + + 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 (device_if->ip_addr.ss_family == AF_INET6) { if (hdhomerun_sock_sockaddr_is_ipv6_global((const struct sockaddr *)&device_if->ip_addr)) { - return 2; + return 3; /* global ipv6 */ } if (!hdhomerun_sock_sockaddr_is_ipv6_linklocal((const struct sockaddr *)&device_if->ip_addr)) { - return 3; + return 4; /* site ipv6 */ } - return 4; + return 5; /* link-local ipv6 */ } - - if (!hdhomerun_sock_sockaddr_is_ipv4_autoip((const struct sockaddr *)&device_if->ip_addr)) { - return 5; - } - - return 6; } 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); diff --git a/hdhomerun_sock_netdevice.c b/hdhomerun_sock_netdevice.c index cd3eb2b..0d8901e 100644 --- a/hdhomerun_sock_netdevice.c +++ b/hdhomerun_sock_netdevice.c @@ -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; diff --git a/hdhomerun_sock_posix.c b/hdhomerun_sock_posix.c index f610e13..3746dda 100644 --- a/hdhomerun_sock_posix.c +++ b/hdhomerun_sock_posix.c @@ -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) { - *length = (size_t)ret; - return true; + if (ret <= 0) { + return false; } - return false; + *length = (size_t)ret; + return true; }