mirror of
https://github.com/Silicondust/libhdhomerun
synced 2025-08-20 13:33:29 -07:00
release 20250506
This commit is contained in:
parent
e8f29fd4e0
commit
572ddaf9a0
3 changed files with 69 additions and 96 deletions
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue