rtp-recv: Use getaddrinfo to improve support for ipv6.

Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/774>
This commit is contained in:
Alistair Leslie-Hughes 2023-01-26 08:37:20 +11:00 committed by Igor Kovalenko
parent f44cb36374
commit 5cefef591e

View file

@ -29,6 +29,9 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <math.h> #include <math.h>
#ifdef HAVE_NETDB_H
#include <netdb.h>
#endif
#include <pulse/rtclock.h> #include <pulse/rtclock.h>
#include <pulse/timeval.h> #include <pulse/timeval.h>
@ -677,9 +680,13 @@ static void check_death_event_cb(pa_mainloop_api *m, pa_time_event *t, const str
int pa__init(pa_module*m) { int pa__init(pa_module*m) {
struct userdata *u; struct userdata *u;
pa_modargs *ma = NULL; pa_modargs *ma = NULL;
#if defined(HAVE_GETADDRINFO)
struct addrinfo *sap_addrinfo = NULL;
#else
struct sockaddr_in sa4; struct sockaddr_in sa4;
#ifdef HAVE_IPV6 #ifdef HAVE_IPV6
struct sockaddr_in6 sa6; struct sockaddr_in6 sa6;
#endif
#endif #endif
struct sockaddr *sa; struct sockaddr *sa;
socklen_t salen; socklen_t salen;
@ -696,6 +703,27 @@ int pa__init(pa_module*m) {
sap_address = pa_modargs_get_value(ma, "sap_address", DEFAULT_SAP_ADDRESS); sap_address = pa_modargs_get_value(ma, "sap_address", DEFAULT_SAP_ADDRESS);
#if defined(HAVE_GETADDRINFO)
{
struct addrinfo hints;
char *service;
pa_zero(hints);
service = pa_sprintf_malloc("%d", htons(SAP_PORT));
hints.ai_flags = AI_NUMERICHOST;
if (getaddrinfo(sap_address, service, &hints, &sap_addrinfo) != 0) {
pa_xfree(service);
pa_log("Invalid SAP address '%s'", sap_address);
goto fail;
}
pa_xfree(service);
sa = sap_addrinfo->ai_addr;
salen = sap_addrinfo->ai_addrlen;
}
#else
if (inet_pton(AF_INET, sap_address, &sa4.sin_addr) > 0) { if (inet_pton(AF_INET, sap_address, &sa4.sin_addr) > 0) {
sa4.sin_family = AF_INET; sa4.sin_family = AF_INET;
sa4.sin_port = htons(SAP_PORT); sa4.sin_port = htons(SAP_PORT);
@ -712,6 +740,7 @@ int pa__init(pa_module*m) {
pa_log("Invalid SAP address '%s'", sap_address); pa_log("Invalid SAP address '%s'", sap_address);
goto fail; goto fail;
} }
#endif
latency_msec = DEFAULT_LATENCY_MSEC; latency_msec = DEFAULT_LATENCY_MSEC;
if (pa_modargs_get_value_u32(ma, "latency_msec", &latency_msec) < 0 || latency_msec < 1 || latency_msec > 300000) { if (pa_modargs_get_value_u32(ma, "latency_msec", &latency_msec) < 0 || latency_msec < 1 || latency_msec > 300000) {
@ -739,9 +768,18 @@ int pa__init(pa_module*m) {
pa_modargs_free(ma); pa_modargs_free(ma);
#if defined(HAVE_GETADDRINFO)
freeaddrinfo(sap_addrinfo);
#endif
return 0; return 0;
fail: fail:
#if defined(HAVE_GETADDRINFO)
if (sap_addrinfo)
freeaddrinfo(sap_addrinfo);
#endif
if (ma) if (ma)
pa_modargs_free(ma); pa_modargs_free(ma);