mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	Trying to listen on an IPv6 socket by default and only do IPv4 if that fails
(which it doesn't most of the time) is terribly confusing. What the user most likely wants is for it to listen to both IPv4 and IPv6 and gracefully continue if only of them succeed. git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@633 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
		
							parent
							
								
									90d6a919fa
								
							
						
					
					
						commit
						64571374b3
					
				
					 3 changed files with 145 additions and 60 deletions
				
			
		| 
						 | 
					@ -49,6 +49,7 @@
 | 
				
			||||||
#include <polypcore/modargs.h>
 | 
					#include <polypcore/modargs.h>
 | 
				
			||||||
#include <polypcore/log.h>
 | 
					#include <polypcore/log.h>
 | 
				
			||||||
#include <polypcore/native-common.h>
 | 
					#include <polypcore/native-common.h>
 | 
				
			||||||
 | 
					#include <polypcore/xmalloc.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef USE_TCP_SOCKETS
 | 
					#ifdef USE_TCP_SOCKETS
 | 
				
			||||||
#define SOCKET_DESCRIPTION "(TCP sockets)"
 | 
					#define SOCKET_DESCRIPTION "(TCP sockets)"
 | 
				
			||||||
| 
						 | 
					@ -162,41 +163,71 @@ static const char* const valid_modargs[] = {
 | 
				
			||||||
    NULL
 | 
					    NULL
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static pa_socket_server *create_socket_server(pa_core *c, pa_modargs *ma) {
 | 
					struct userdata {
 | 
				
			||||||
    pa_socket_server *s;
 | 
					 | 
				
			||||||
#if defined(USE_TCP_SOCKETS)
 | 
					#if defined(USE_TCP_SOCKETS)
 | 
				
			||||||
 | 
					    void *protocol_ipv4;
 | 
				
			||||||
 | 
					    void *protocol_ipv6;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    void *protocol_unix;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int pa__init(pa_core *c, pa_module*m) {
 | 
				
			||||||
 | 
					    pa_modargs *ma = NULL;
 | 
				
			||||||
 | 
					    int ret = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    struct userdata *u = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(USE_TCP_SOCKETS)
 | 
				
			||||||
 | 
					    pa_socket_server *s_ipv4 = NULL;
 | 
				
			||||||
 | 
					    pa_socket_server *s_ipv6 = NULL;
 | 
				
			||||||
    int loopback = 1;
 | 
					    int loopback = 1;
 | 
				
			||||||
    uint32_t port = IPV4_PORT;
 | 
					    uint32_t port = IPV4_PORT;
 | 
				
			||||||
    const char *listen_on;
 | 
					    const char *listen_on;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    pa_socket_server *s;
 | 
				
			||||||
 | 
					    int r;
 | 
				
			||||||
 | 
					    const char *v;
 | 
				
			||||||
 | 
					    char tmp[PATH_MAX];
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert(c && m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(USE_TCP_SOCKETS)
 | 
				
			||||||
 | 
					    if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
 | 
				
			||||||
 | 
					        pa_log(__FILE__": Failed to parse module arguments");
 | 
				
			||||||
 | 
					        goto finish;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pa_modargs_get_value_boolean(ma, "loopback", &loopback) < 0) {
 | 
					    if (pa_modargs_get_value_boolean(ma, "loopback", &loopback) < 0) {
 | 
				
			||||||
        pa_log(__FILE__": loopback= expects a boolean argument.");
 | 
					        pa_log(__FILE__": loopback= expects a boolean argument.");
 | 
				
			||||||
        return NULL;
 | 
					        goto fail;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pa_modargs_get_value_u32(ma, "port", &port) < 0 || port < 1 || port > 0xFFFF) {
 | 
					    if (pa_modargs_get_value_u32(ma, "port", &port) < 0 || port < 1 || port > 0xFFFF) {
 | 
				
			||||||
        pa_log(__FILE__": port= expects a numerical argument between 1 and 65535.");
 | 
					        pa_log(__FILE__": port= expects a numerical argument between 1 and 65535.");
 | 
				
			||||||
        return NULL;
 | 
					        goto fail;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    listen_on = pa_modargs_get_value(ma, "listen", NULL);
 | 
					    listen_on = pa_modargs_get_value(ma, "listen", NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (listen_on) {
 | 
					    if (listen_on) {
 | 
				
			||||||
        if (!(s = pa_socket_server_new_ip_string(c->mainloop, listen_on, port, TCPWRAP_SERVICE)))
 | 
					        s_ipv4 = pa_socket_server_new_ipv4_string(c->mainloop, listen_on, port, TCPWRAP_SERVICE);
 | 
				
			||||||
            return NULL;
 | 
					        s_ipv6 = pa_socket_server_new_ipv6_string(c->mainloop, listen_on, port, TCPWRAP_SERVICE);
 | 
				
			||||||
 | 
					        if (!s_ipv4 && !s_ipv6)
 | 
				
			||||||
 | 
					            goto fail;
 | 
				
			||||||
    } else if (loopback) {
 | 
					    } else if (loopback) {
 | 
				
			||||||
        if (!(s = pa_socket_server_new_ip_loopback(c->mainloop, port, TCPWRAP_SERVICE)))
 | 
					        s_ipv4 = pa_socket_server_new_ipv4_loopback(c->mainloop, port, TCPWRAP_SERVICE);
 | 
				
			||||||
            return NULL;
 | 
					        s_ipv6 = pa_socket_server_new_ipv6_loopback(c->mainloop, port, TCPWRAP_SERVICE);
 | 
				
			||||||
 | 
					        if (!s_ipv4 && !s_ipv6)
 | 
				
			||||||
 | 
					            goto fail;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        if (!(s = pa_socket_server_new_ip_any(c->mainloop, port, TCPWRAP_SERVICE)))
 | 
					        s_ipv4 = pa_socket_server_new_ipv4_any(c->mainloop, port, TCPWRAP_SERVICE);
 | 
				
			||||||
            return NULL;
 | 
					        s_ipv6 = pa_socket_server_new_ipv6_any(c->mainloop, port, TCPWRAP_SERVICE);
 | 
				
			||||||
 | 
					        if (!s_ipv4 && !s_ipv6)
 | 
				
			||||||
 | 
					            goto fail;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    int r;
 | 
					 | 
				
			||||||
    const char *v;
 | 
					 | 
				
			||||||
    char tmp[PATH_MAX];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    v = pa_modargs_get_value(ma, "socket", UNIX_SOCKET);
 | 
					    v = pa_modargs_get_value(ma, "socket", UNIX_SOCKET);
 | 
				
			||||||
    assert(v);
 | 
					    assert(v);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -204,42 +235,42 @@ static pa_socket_server *create_socket_server(pa_core *c, pa_modargs *ma) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pa_make_secure_parent_dir(tmp) < 0) {
 | 
					    if (pa_make_secure_parent_dir(tmp) < 0) {
 | 
				
			||||||
        pa_log(__FILE__": Failed to create secure socket directory.");
 | 
					        pa_log(__FILE__": Failed to create secure socket directory.");
 | 
				
			||||||
        return NULL;
 | 
					        goto fail;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((r = pa_unix_socket_remove_stale(tmp)) < 0) {
 | 
					    if ((r = pa_unix_socket_remove_stale(tmp)) < 0) {
 | 
				
			||||||
        pa_log(__FILE__": Failed to remove stale UNIX socket '%s': %s", tmp, strerror(errno));
 | 
					        pa_log(__FILE__": Failed to remove stale UNIX socket '%s': %s", tmp, strerror(errno));
 | 
				
			||||||
        return NULL;
 | 
					        goto fail;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (r)
 | 
					    if (r)
 | 
				
			||||||
        pa_log(__FILE__": Removed stale UNIX socket '%s'.", tmp);
 | 
					        pa_log(__FILE__": Removed stale UNIX socket '%s'.", tmp);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (!(s = pa_socket_server_new_unix(c->mainloop, tmp)))
 | 
					    if (!(s = pa_socket_server_new_unix(c->mainloop, tmp)))
 | 
				
			||||||
        return NULL;
 | 
					        goto fail;
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    return s;
 | 
					
 | 
				
			||||||
 | 
					    u = pa_xmalloc0(sizeof(struct userdata));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(USE_TCP_SOCKETS)
 | 
				
			||||||
 | 
					    if (s_ipv4) {
 | 
				
			||||||
 | 
					        u->protocol_ipv4 = protocol_new(c, s_ipv4, m, ma);
 | 
				
			||||||
 | 
					        if (!u->protocol_ipv4)
 | 
				
			||||||
 | 
					            pa_socket_server_unref(s_ipv4);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int pa__init(pa_core *c, pa_module*m) {
 | 
					    if (s_ipv6) {
 | 
				
			||||||
    pa_socket_server *s;
 | 
					        u->protocol_ipv6 = protocol_new(c, s_ipv4, m, ma);
 | 
				
			||||||
    pa_modargs *ma = NULL;
 | 
					        if (!u->protocol_ipv6)
 | 
				
			||||||
    int ret = -1;
 | 
					            pa_socket_server_unref(s_ipv6);
 | 
				
			||||||
    assert(c && m);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
 | 
					 | 
				
			||||||
        pa_log(__FILE__": Failed to parse module arguments");
 | 
					 | 
				
			||||||
        goto finish;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!(s = create_socket_server(c, ma)))
 | 
					    if (!u->protocol_ipv4 && !u->protocol_ipv6)
 | 
				
			||||||
        goto finish;
 | 
					        goto fail;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
    if (!(m->userdata = protocol_new(c, s, m, ma))) {
 | 
					    if (!(u->protocol_unix = protocol_new(c, s, m, ma)))
 | 
				
			||||||
        pa_socket_server_unref(s);
 | 
					        goto fail;
 | 
				
			||||||
        goto finish;
 | 
					#endif
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = 0;
 | 
					    ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -248,9 +279,36 @@ finish:
 | 
				
			||||||
        pa_modargs_free(ma);
 | 
					        pa_modargs_free(ma);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fail:
 | 
				
			||||||
 | 
					    if (u) {
 | 
				
			||||||
 | 
					#if defined(USE_TCP_SOCKETS)
 | 
				
			||||||
 | 
					        if (u->protocol_ipv4)
 | 
				
			||||||
 | 
					            protocol_free(u->protocol_ipv4);
 | 
				
			||||||
 | 
					        if (u->protocol_ipv6)
 | 
				
			||||||
 | 
					            protocol_free(u->protocol_ipv6);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        if (u->protocol_unix)
 | 
				
			||||||
 | 
					            protocol_free(u->protocol_unix);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					        pa_xfree(u);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					#if defined(USE_TCP_SOCKETS)
 | 
				
			||||||
 | 
					        if (s_ipv4)
 | 
				
			||||||
 | 
					            pa_socket_server_unref(s_ipv4);
 | 
				
			||||||
 | 
					        if (s_ipv6)
 | 
				
			||||||
 | 
					            pa_socket_server_unref(s_ipv6);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        if (s)
 | 
				
			||||||
 | 
					            pa_socket_server_unref(s);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    goto finish;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void pa__done(pa_core *c, pa_module*m) {
 | 
					void pa__done(pa_core *c, pa_module*m) {
 | 
				
			||||||
 | 
					    struct userdata *u;
 | 
				
			||||||
    assert(c && m);
 | 
					    assert(c && m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(USE_PROTOCOL_ESOUND) && !defined(USE_TCP_SOCKETS)
 | 
					#if defined(USE_PROTOCOL_ESOUND) && !defined(USE_TCP_SOCKETS)
 | 
				
			||||||
| 
						 | 
					@ -260,5 +318,18 @@ void pa__done(pa_core *c, pa_module*m) {
 | 
				
			||||||
		pa_log("%s: Failed to remove %s : %s.", __FILE__, ESD_UNIX_SOCKET_DIR, strerror (errno));
 | 
							pa_log("%s: Failed to remove %s : %s.", __FILE__, ESD_UNIX_SOCKET_DIR, strerror (errno));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protocol_free(m->userdata);
 | 
					    u = m->userdata;
 | 
				
			||||||
 | 
					    assert(u);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(USE_TCP_SOCKETS)
 | 
				
			||||||
 | 
					    if (u->protocol_ipv4)
 | 
				
			||||||
 | 
					        protocol_free(u->protocol_ipv4);
 | 
				
			||||||
 | 
					    if (u->protocol_ipv6)
 | 
				
			||||||
 | 
					        protocol_free(u->protocol_ipv6);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    if (u->protocol_unix)
 | 
				
			||||||
 | 
					        protocol_free(u->protocol_unix);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pa_xfree(u);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -314,46 +314,57 @@ fail:
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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_ipv4_loopback(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service) {
 | 
				
			||||||
    pa_socket_server *s;
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    assert(m);
 | 
					    assert(m);
 | 
				
			||||||
    assert(port > 0);
 | 
					    assert(port > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!(s = pa_socket_server_new_ipv6(m, in6addr_loopback.s6_addr, port, tcpwrap_service)))
 | 
					    return pa_socket_server_new_ipv4(m, INADDR_LOOPBACK, port, tcpwrap_service);
 | 
				
			||||||
        s = pa_socket_server_new_ipv4(m, INADDR_LOOPBACK, port, tcpwrap_service);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return s;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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_ipv6_loopback(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service) {
 | 
				
			||||||
    pa_socket_server *s;
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    assert(m);
 | 
					    assert(m);
 | 
				
			||||||
    assert(port > 0);
 | 
					    assert(port > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!(s = pa_socket_server_new_ipv6(m, in6addr_any.s6_addr, port, tcpwrap_service)))
 | 
					    return pa_socket_server_new_ipv6(m, in6addr_loopback.s6_addr, port, tcpwrap_service);
 | 
				
			||||||
        s = pa_socket_server_new_ipv4(m, INADDR_ANY, port, tcpwrap_service);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    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) {
 | 
					pa_socket_server* pa_socket_server_new_ipv4_any(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service) {
 | 
				
			||||||
    struct in6_addr ipv6;
 | 
					    assert(m);
 | 
				
			||||||
 | 
					    assert(port > 0);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return pa_socket_server_new_ipv4(m, INADDR_ANY, port, tcpwrap_service);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pa_socket_server* pa_socket_server_new_ipv6_any(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service) {
 | 
				
			||||||
 | 
					    assert(m);
 | 
				
			||||||
 | 
					    assert(port > 0);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return pa_socket_server_new_ipv6(m, in6addr_any.s6_addr, port, tcpwrap_service);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pa_socket_server* pa_socket_server_new_ipv4_string(pa_mainloop_api *m, const char *name, uint16_t port, const char *tcpwrap_service) {
 | 
				
			||||||
    struct in_addr ipv4;
 | 
					    struct in_addr ipv4;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    assert(m);
 | 
					    assert(m);
 | 
				
			||||||
    assert(name);
 | 
					    assert(name);
 | 
				
			||||||
    assert(port > 0);
 | 
					    assert(port > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (inet_pton(AF_INET, name, &ipv4) > 0)
 | 
				
			||||||
 | 
					        return pa_socket_server_new_ipv4(m, ntohl(ipv4.s_addr), port, tcpwrap_service);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pa_socket_server* pa_socket_server_new_ipv6_string(pa_mainloop_api *m, const char *name, uint16_t port, const char *tcpwrap_service) {
 | 
				
			||||||
 | 
					    struct in6_addr ipv6;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    assert(m);
 | 
				
			||||||
 | 
					    assert(name);
 | 
				
			||||||
 | 
					    assert(port > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (inet_pton(AF_INET6, name, &ipv6) > 0)
 | 
					    if (inet_pton(AF_INET6, name, &ipv6) > 0)
 | 
				
			||||||
        return pa_socket_server_new_ipv6(m, ipv6.s6_addr, port, tcpwrap_service);
 | 
					        return pa_socket_server_new_ipv6(m, ipv6.s6_addr, port, tcpwrap_service);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (inet_pton(AF_INET, name, &ipv4) > 0)
 | 
					 | 
				
			||||||
        return pa_socket_server_new_ipv4(m, ntohl(ipv4.s_addr), port, tcpwrap_service);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pa_log_warn(__FILE__": failed to parse '%s'.", name);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,9 +34,12 @@ pa_socket_server* pa_socket_server_new(pa_mainloop_api *m, int fd);
 | 
				
			||||||
pa_socket_server* pa_socket_server_new_unix(pa_mainloop_api *m, const char *filename);
 | 
					pa_socket_server* pa_socket_server_new_unix(pa_mainloop_api *m, const char *filename);
 | 
				
			||||||
pa_socket_server* pa_socket_server_new_ipv4(pa_mainloop_api *m, uint32_t address, uint16_t port, const char *tcpwrap_service);
 | 
					pa_socket_server* pa_socket_server_new_ipv4(pa_mainloop_api *m, uint32_t address, uint16_t port, const char *tcpwrap_service);
 | 
				
			||||||
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_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_ipv4_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_ipv6_loopback(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);
 | 
					pa_socket_server* pa_socket_server_new_ipv4_any(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service);
 | 
				
			||||||
 | 
					pa_socket_server* pa_socket_server_new_ipv6_any(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service);
 | 
				
			||||||
 | 
					pa_socket_server* pa_socket_server_new_ipv4_string(pa_mainloop_api *m, const char *name, uint16_t port, const char *tcpwrap_service);
 | 
				
			||||||
 | 
					pa_socket_server* pa_socket_server_new_ipv6_string(pa_mainloop_api *m, const char *name, uint16_t port, const char *tcpwrap_service);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void pa_socket_server_unref(pa_socket_server*s);
 | 
					void pa_socket_server_unref(pa_socket_server*s);
 | 
				
			||||||
pa_socket_server* pa_socket_server_ref(pa_socket_server *s);
 | 
					pa_socket_server* pa_socket_server_ref(pa_socket_server *s);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue