diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/modules/module-protocol-stub.c | 10 | ||||
-rw-r--r-- | src/polypcore/socket-server.c | 18 | ||||
-rw-r--r-- | src/polypcore/socket-server.h | 1 |
3 files changed, 27 insertions, 2 deletions
diff --git a/src/modules/module-protocol-stub.c b/src/modules/module-protocol-stub.c index f72a68a5..641e3624 100644 --- a/src/modules/module-protocol-stub.c +++ b/src/modules/module-protocol-stub.c @@ -52,7 +52,7 @@ #ifdef USE_TCP_SOCKETS #define SOCKET_DESCRIPTION "(TCP sockets)" -#define SOCKET_USAGE "port=<TCP port number> loopback=<listen on loopback device only?>" +#define SOCKET_USAGE "port=<TCP port number> loopback=<listen on loopback device only?> listen=<address to listen on>" #else #define SOCKET_DESCRIPTION "(UNIX sockets)" #define SOCKET_USAGE "socket=<path to UNIX socket>" @@ -146,6 +146,7 @@ static const char* const valid_modargs[] = { #if defined(USE_TCP_SOCKETS) "port", "loopback", + "listen", #else "socket", #endif @@ -157,6 +158,7 @@ static pa_socket_server *create_socket_server(pa_core *c, pa_modargs *ma) { #if defined(USE_TCP_SOCKETS) int loopback = 1; uint32_t port = IPV4_PORT; + const char *listen_on; if (pa_modargs_get_value_boolean(ma, "loopback", &loopback) < 0) { pa_log(__FILE__": loopback= expects a boolean argument.\n"); @@ -168,8 +170,12 @@ static pa_socket_server *create_socket_server(pa_core *c, pa_modargs *ma) { return NULL; } + listen_on = pa_modargs_get_value(ma, "listen", NULL); - if (loopback) { + if (listen_on) { + if (!(s = pa_socket_server_new_ip_string(c->mainloop, listen_on, port, TCPWRAP_SERVICE))) + return NULL; + } else if (loopback) { if (!(s = pa_socket_server_new_ip_loopback(c->mainloop, port, TCPWRAP_SERVICE))) return NULL; } else { diff --git a/src/polypcore/socket-server.c b/src/polypcore/socket-server.c index 5f84911d..b1297496 100644 --- a/src/polypcore/socket-server.c +++ b/src/polypcore/socket-server.c @@ -334,6 +334,24 @@ pa_socket_server* pa_socket_server_new_ip_any(pa_mainloop_api *m, uint16_t port, return s; } +pa_socket_server* pa_socket_server_new_ip_string(pa_mainloop_api *m, const char *name, uint16_t port, const char *tcpwrap_service) { + uint8_t ipv6[16]; + uint32_t ipv4; + + assert(m); + assert(name); + assert(port > 0); + + if (inet_pton(AF_INET6, name, ipv6) > 0) + return pa_socket_server_new_ipv6(m, ipv6, port, tcpwrap_service); + + if (inet_pton(AF_INET, name, &ipv4) > 0) + return pa_socket_server_new_ipv4(m, ntohl(ipv4), port, tcpwrap_service); + + pa_log_warn(__FILE__": failed to parse '%s'.\n", name); + + return NULL; +} static void socket_server_free(pa_socket_server*s) { assert(s); diff --git a/src/polypcore/socket-server.h b/src/polypcore/socket-server.h index d11cee49..3babbc14 100644 --- a/src/polypcore/socket-server.h +++ b/src/polypcore/socket-server.h @@ -36,6 +36,7 @@ pa_socket_server* pa_socket_server_new_ipv4(pa_mainloop_api *m, uint32_t address pa_socket_server* pa_socket_server_new_ipv6(pa_mainloop_api *m, const uint8_t address[16], uint16_t port, const char *tcpwrap_service); pa_socket_server* pa_socket_server_new_ip_loopback(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service); pa_socket_server* pa_socket_server_new_ip_any(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service); +pa_socket_server* pa_socket_server_new_ip_string(pa_mainloop_api *m, const char *name, uint16_t port, const char *tcpwrap_service); void pa_socket_server_unref(pa_socket_server*s); pa_socket_server* pa_socket_server_ref(pa_socket_server *s); |