[pulseaudio-discuss] [PATCH] Implement systemd socket activation

Peter Meerwald pmeerw at pmeerw.net
Fri Jan 3 15:27:03 PST 2014


> Use libsystemd-daemon and two unit files to provide socket activation
> for the default native unix socket ($XDG_RUNTIME_DIR/pulse/native)
> from the user manager.
> In the future this would allow to drop all the complex server
> location and autospawn code, and just rely on the user manager
> to do the right thing.

I have yet to try this, here are a couple of trivial comments:

(1) I get warning with libsystemd-daemon not available

daemon/main.c: In function ‘main’:
daemon/main.c:412:9: warning: unused variable ‘systemd_fds’ 
[-Wunused-variable]
     int systemd_fds = -1;
         ^
  CC       modules/module_native_protocol_unix_la-module-protocol-stub.lo
modules/module-protocol-stub.c: In function 
'module_native_protocol_unix_LTX_pa__init':
modules/module-protocol-stub.c:427:1: warning: label 'success' defined but 
not used [-Wunused-label]
 success:
 ^
  CCLD     module-native-protocol-unix.la

(2) shouldn't this check for HAVE_SYSTEMD_DAEMON?

+if !HAVE_SYSTEMD
 xdgautostart_in_files = \
 		daemon/pulseaudio.desktop.in \
 		daemon/pulseaudio-kde.desktop.in
 xdgautostart_DATA = $(xdgautostart_in_files:.desktop.in=.desktop)
 @INTLTOOL_DESKTOP_RULE@
 endif
+endif

(3) some output in configure would be nice, like this:
    Enable systemd login:          no
    Enable systemd journal:        no

(4) coding style: no space after function name
    if (sd_is_socket_inet (SD_LISTEN_FDS_START + i, AF_INET6, SOCK_STREAM, -1, 0))

(5) the log message could be more descriptive and hint at systemd / 
inherited sockets:
    if (inherited_fds > how_many) {
        pa_log("Too many sockets.");
        goto fail;
    }

(6) files daemon/pulseaudio.service, daemon/pulseaudio.socket seem to be 
missing?

(7) some documentation would be nice

> ---
>  configure.ac                       |  3 +-
>  src/Makefile.am                    | 61 ++++++++++++++++++++++--------------
>  src/daemon/main.c                  | 36 +++++++++++++++------
>  src/modules/module-protocol-stub.c | 64 ++++++++++++++++++++++++++++++++++++++
>  src/pulsecore/socket-server.c      | 43 +++++++++++++++++++++++++
>  src/pulsecore/socket-server.h      |  3 ++
>  6 files changed, 176 insertions(+), 34 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index 64ab9fa..0fc37e7 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1158,7 +1158,8 @@ AC_ARG_ENABLE([systemd],
>      AS_HELP_STRING([--disable-systemd],[Disable optional systemd support]))
>  
>  AS_IF([test "x$enable_systemd" != "xno"],
> -    [PKG_CHECK_MODULES(SYSTEMD, [ libsystemd-login ], HAVE_SYSTEMD=1, HAVE_SYSTEMD=0)],
> +    [PKG_CHECK_MODULES(SYSTEMD, [ libsystemd-login ], HAVE_SYSTEMD=1, HAVE_SYSTEMD=0)
> +    PKG_CHECK_MODULES(SYSTEMD_DAEMON, [ libsystemd-daemon ], HAVE_SYSTEMD_DAEMON=1, HAVE_SYSTEMD_DAEMON=0)],
>      HAVE_SYSTEMD=0)
>  
>  AS_IF([test "x$enable_systemd" = "xyes" && test "x$HAVE_SYSTEMD" = "x0"],
> diff --git a/src/Makefile.am b/src/Makefile.am
> index c89cd6d..278a10e 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -101,6 +101,8 @@ EXTRA_DIST = \
>  		modules/module-defs.h.m4 \
>  		daemon/pulseaudio.desktop.in \
>  		daemon/pulseaudio-kde.desktop.in \
> +                daemon/pulseaudio.service.in \
> +	        daemon/pulseaudio.socket \
>  		map-file \
>  		daemon/pulseaudio-system.conf \
>  		modules/echo-cancel/adrian-license.txt
> @@ -117,13 +119,24 @@ dbuspolicy_DATA = \
>  endif
>  
>  if HAVE_X11
> +if !HAVE_SYSTEMD
>  xdgautostart_in_files = \
>  		daemon/pulseaudio.desktop.in \
>  		daemon/pulseaudio-kde.desktop.in
>  xdgautostart_DATA = $(xdgautostart_in_files:.desktop.in=.desktop)
>  @INTLTOOL_DESKTOP_RULE@
>  endif
> +endif
>  
> +if HAVE_SYSTEMD
> +systemduserunitdir = $(prefix)/lib/systemd/user
> +systemduserunit_DATA = \
> +	daemon/pulseaudio.service \
> +	daemon/pulseaudio.socket
> +
> +daemon/pulseaudio.service : daemon/pulseaudio.service.in
> +	$(SED) -e "s|[@]bindir@|$(bindir)|" $< > $@
> +endif
>  
>  ###################################
>  #          Includes               #
> @@ -149,8 +162,8 @@ pulseaudio_SOURCES = \
>  		daemon/ltdl-bind-now.c daemon/ltdl-bind-now.h \
>  		daemon/main.c
>  
> -pulseaudio_CFLAGS = $(AM_CFLAGS) $(CAP_CFLAGS)
> -pulseaudio_LDADD = $(AM_LDADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la $(LIBLTDL) $(CAP_LIBS)
> +pulseaudio_CFLAGS = $(AM_CFLAGS) $(CAP_CFLAGS) $(SYSTEMD_DAEMON_CFLAGS)
> +pulseaudio_LDADD = $(AM_LDADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la $(LIBLTDL) $(CAP_LIBS) $(SYSTEMD_DAEMON_LIBS)
>  # This is needed because automake doesn't properly expand the foreach below
>  pulseaudio_DEPENDENCIES = libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la $(PREOPEN_LIBS)
>  
> @@ -192,8 +205,10 @@ endif
>  
>  if HAVE_X11
>  bin_PROGRAMS += pax11publish
> +if !HAVE_SYSTEMD
>  bin_SCRIPTS += start-pulseaudio-x11 start-pulseaudio-kde
>  endif
> +endif
>  
>  pacat_SOURCES = utils/pacat.c
>  pacat_LDADD = $(AM_LDADD) libpulse.la libpulsecommon- at PA_MAJORMINOR@.la $(LIBSNDFILE_LIBS)
> @@ -1478,14 +1493,14 @@ builddirs:
>  # Simple protocol
>  
>  module_simple_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c
> -module_simple_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_SIMPLE $(AM_CFLAGS)
> +module_simple_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_SIMPLE $(SYSTEMD_DAEMON_CFLAGS) $(AM_CFLAGS)
>  module_simple_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS)
> -module_simple_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-simple.la
> +module_simple_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) $(SYSTEMD_DAEMON_LIBS) libprotocol-simple.la
>  
>  module_simple_protocol_unix_la_SOURCES = modules/module-protocol-stub.c
> -module_simple_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_SIMPLE $(AM_CFLAGS)
> +module_simple_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_SIMPLE $(SYSTEMD_DAEMON_CFLAGS) $(AM_CFLAGS)
>  module_simple_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS)
> -module_simple_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-simple.la
> +module_simple_protocol_unix_la_LIBADD = $(MODULE_LIBADD) $(SYSTEMD_DAEMON_LIBS) libprotocol-simple.la
>  
>  # CLI protocol
>  
> @@ -1494,26 +1509,26 @@ module_cli_la_LDFLAGS = $(MODULE_LDFLAGS)
>  module_cli_la_LIBADD = $(MODULE_LIBADD) libcli.la
>  
>  module_cli_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c
> -module_cli_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_CLI $(AM_CFLAGS)
> +module_cli_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_CLI $(SYSTEMD_DAEMON_CFLAGS) $(AM_CFLAGS)
>  module_cli_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS)
> -module_cli_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-cli.la
> +module_cli_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) $(SYSTEMD_DAEMON_LIBS) libprotocol-cli.la
>  
>  module_cli_protocol_unix_la_SOURCES = modules/module-protocol-stub.c
> -module_cli_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_CLI $(AM_CFLAGS)
> +module_cli_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_CLI $(SYSTEMD_DAEMON_CFLAGS) $(AM_CFLAGS)
>  module_cli_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS)
> -module_cli_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-cli.la
> +module_cli_protocol_unix_la_LIBADD = $(MODULE_LIBADD) $(SYSTEMD_DAEMON_LIBS) libprotocol-cli.la
>  
>  # HTTP protocol
>  
>  module_http_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c
> -module_http_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_HTTP $(AM_CFLAGS)
> +module_http_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_HTTP $(SYSTEMD_DAEMON_CFLAGS) $(AM_CFLAGS)
>  module_http_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS)
> -module_http_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-http.la
> +module_http_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) $(SYSTEMD_DAEMON_LIBS) libprotocol-http.la
>  
>  module_http_protocol_unix_la_SOURCES = modules/module-protocol-stub.c
> -module_http_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_HTTP $(AM_CFLAGS)
> +module_http_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_HTTP $(SYSTEMD_DAEMON_CFLAGS) $(AM_CFLAGS)
>  module_http_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS)
> -module_http_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-http.la
> +module_http_protocol_unix_la_LIBADD = $(MODULE_LIBADD) $(SYSTEMD_DAEMON_LIBS) libprotocol-http.la
>  
>  # D-Bus protocol
>  
> @@ -1536,32 +1551,32 @@ module_dbus_protocol_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS)
>  # Native protocol
>  
>  module_native_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c
> -module_native_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_NATIVE $(AM_CFLAGS)
> +module_native_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_NATIVE $(SYSTEMD_DAEMON_CFLAGS) $(AM_CFLAGS)
>  module_native_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS)
> -module_native_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la
> +module_native_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) $(SYSTEMD_DAEMON_LIBS) libprotocol-native.la
>  
>  module_native_protocol_unix_la_SOURCES = modules/module-protocol-stub.c
> -module_native_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_NATIVE $(AM_CFLAGS)
> +module_native_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_NATIVE $(SYSTEMD_DAEMON_CFLAGS) $(AM_CFLAGS)
>  module_native_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS)
> -module_native_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la
> +module_native_protocol_unix_la_LIBADD = $(MODULE_LIBADD) $(SYSTEMD_DAEMON_LIBS) libprotocol-native.la
>  
>  module_native_protocol_fd_la_SOURCES = modules/module-native-protocol-fd.c
>  module_native_protocol_fd_la_CFLAGS = $(AM_CFLAGS)
>  module_native_protocol_fd_la_LDFLAGS = $(MODULE_LDFLAGS)
> -module_native_protocol_fd_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la
> +module_native_protocol_fd_la_LIBADD = $(MODULE_LIBADD) $(SYSTEMD_DAEMON_LIBS) libprotocol-native.la
>  
>  # EsounD protocol
>  
>  if HAVE_ESOUND
>  module_esound_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c
> -module_esound_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_ESOUND $(AM_CFLAGS)
> +module_esound_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_ESOUND $(SYSTEMD_DAEMON_CFLAGS) $(AM_CFLAGS)
>  module_esound_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS)
> -module_esound_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-esound.la
> +module_esound_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) $(SYSTEMD_DAEMON_LIBS) libprotocol-esound.la
>  
>  module_esound_protocol_unix_la_SOURCES = modules/module-protocol-stub.c
> -module_esound_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_ESOUND $(AM_CFLAGS)
> +module_esound_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_ESOUND $(SYSTEMD_DAEMON_CFLAGS) $(AM_CFLAGS)
>  module_esound_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS)
> -module_esound_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-esound.la
> +module_esound_protocol_unix_la_LIBADD = $(MODULE_LIBADD) $(SYSTEMD_DAEMON_LIBS) libprotocol-esound.la
>  
>  module_esound_compat_spawnfd_la_SOURCES = modules/module-esound-compat-spawnfd.c
>  module_esound_compat_spawnfd_la_LDFLAGS = $(MODULE_LDFLAGS)
> diff --git a/src/daemon/main.c b/src/daemon/main.c
> index e01371e..6098277 100644
> --- a/src/daemon/main.c
> +++ b/src/daemon/main.c
> @@ -58,6 +58,10 @@
>  #include <dbus/dbus.h>
>  #endif
>  
> +#ifdef HAVE_SYSTEMD
> +#include <systemd/sd-daemon.h>
> +#endif
> +
>  #include <pulse/client-conf.h>
>  #ifdef HAVE_X11
>  #include <pulse/client-conf-x11.h>
> @@ -405,6 +409,7 @@ int main(int argc, char *argv[]) {
>      bool valid_pid_file = false;
>      bool ltdl_init = false;
>      int passed_fd = -1;
> +    int systemd_fds = -1;
>      const char *e;
>  #ifdef HAVE_FORK
>      int daemon_pipe[2] = { -1, -1 };
> @@ -472,16 +477,27 @@ int main(int argc, char *argv[]) {
>              passed_fd = -1;
>      }
>  
> -    /* We might be autospawned, in which case have no idea in which
> -     * context we have been started. Let's cleanup our execution
> -     * context as good as possible */
> -
> -    pa_reset_personality();
> -    pa_drop_root();
> -    pa_close_all(passed_fd, -1);
> -    pa_reset_sigs(-1);
> -    pa_unblock_sigs(-1);
> -    pa_reset_priority();
> +#ifdef HAVE_SYSTEMD
> +    systemd_fds = sd_listen_fds (false);
> +    if (systemd_fds > 0 ||
> +        getenv("MANAGERPID") != NULL) {
> +        /* We were spawned by systemd, so we know
> +           the environment and process attributes are
> +           clean */
> +    } else
> +#endif
> +    {
> +        /* We might be autospawned, in which case have no idea in which
> +         * context we have been started. Let's cleanup our execution
> +         * context as good as possible */
> +
> +        pa_reset_personality();
> +        pa_drop_root();
> +        pa_close_all(passed_fd, -1);
> +        pa_reset_sigs(-1);
> +        pa_unblock_sigs(-1);
> +        pa_reset_priority();
> +    }
>  
>      setlocale(LC_ALL, "");
>      pa_init_i18n();
> diff --git a/src/modules/module-protocol-stub.c b/src/modules/module-protocol-stub.c
> index 3218a01..d8db913 100644
> --- a/src/modules/module-protocol-stub.c
> +++ b/src/modules/module-protocol-stub.c
> @@ -32,6 +32,10 @@
>  #include <netinet/in.h>
>  #endif
>  
> +#ifdef HAVE_SYSTEMD
> +#include <systemd/sd-daemon.h>
> +#endif
> +
>  #include <pulse/xmalloc.h>
>  
>  #include <pulsecore/core-error.h>
> @@ -244,6 +248,9 @@ int pa__init(pa_module*m) {
>  #else
>      int r;
>  #endif
> +#if defined(HAVE_SYSTEMD)
> +    int inherited_fds;
> +#endif
>  
>  #if defined(USE_PROTOCOL_NATIVE) || defined(USE_PROTOCOL_HTTP)
>      char t[256];
> @@ -286,6 +293,61 @@ int pa__init(pa_module*m) {
>      u->esound_options->module = m;
>  #endif
>  
> +#if defined(HAVE_SYSTEMD)
> +    inherited_fds = sd_listen_fds (true);
> +    if (inherited_fds > 0) {
> +        int how_many, i;
> +#if defined(USE_TCP_SOCKETS) && defined(HAVE_IPV6)
> +        how_many = 2;
> +#else
> +        how_many = 1;
> +#endif
> +
> +        if (inherited_fds > how_many) {
> +            pa_log("Too many sockets.");
> +            goto fail;
> +        }
> +
> +        for (i = 0; i < inherited_fds; i++) {
> +#if defined(USE_TCP_SOCKETS)
> +#ifdef HAVE_IPV6
> +        if (sd_is_socket_inet (SD_LISTEN_FDS_START + i, AF_INET6, SOCK_STREAM, -1, 0))
> +            u->socket_server_ipv6 = pa_socket_server_new_ipv6_adopt (m->core->mainloop, SD_LISTEN_FDS_START + i);
> +#endif
> +        if (sd_is_socket_inet (SD_LISTEN_FDS_START + i, AF_INET, SOCK_STREAM, -1, 0))
> +            u->socket_server_ipv4 = pa_socket_server_new_ipv4_adopt (m->core->mainloop, SD_LISTEN_FDS_START + i);
> +#else
> +        if (sd_is_socket_unix (SD_LISTEN_FDS_START + i, SOCK_STREAM, -1, NULL, 0))
> +            u->socket_server_unix = pa_socket_server_new_unix_adopt (m->core->mainloop, SD_LISTEN_FDS_START + i);
> +#endif
> +        }
> +
> +#if defined(USE_TCP_SOCKETS)
> +#ifdef HAVE_IPV6
> +        if (!u->socket_server_ipv4 && !u->socket_server_ipv6)
> +#else
> +        if (!u->socket_server_ipv4)
> +#endif
> +            goto fail;
> +
> +        if (u->socket_server_ipv4)
> +          pa_socket_server_set_callback(u->socket_server_ipv4, socket_server_on_connection_cb, u);
> +#  ifdef HAVE_IPV6
> +        if (u->socket_server_ipv6)
> +          pa_socket_server_set_callback(u->socket_server_ipv6, socket_server_on_connection_cb, u);
> +#  endif
> +
> +#else
> +        if (!u->socket_server_unix)
> +            goto fail;
> +
> +        pa_socket_server_set_callback(u->socket_server_unix, socket_server_on_connection_cb, u);
> +#endif
> +
> +        goto success;
> +    }
> +#endif
> +
>  #if defined(USE_TCP_SOCKETS)
>  
>      if (pa_in_system_mode() || pa_modargs_get_value(ma, "port", NULL))
> @@ -362,6 +424,8 @@ int pa__init(pa_module*m) {
>  
>  #endif
>  
> +success:
> +
>  #if defined(USE_PROTOCOL_NATIVE)
>  #  if defined(USE_TCP_SOCKETS)
>      if (u->socket_server_ipv4)
> diff --git a/src/pulsecore/socket-server.c b/src/pulsecore/socket-server.c
> index ef77563..3d1d533 100644
> --- a/src/pulsecore/socket-server.c
> +++ b/src/pulsecore/socket-server.c
> @@ -221,12 +221,33 @@ fail:
>      return NULL;
>  }
>  
> +pa_socket_server *pa_socket_server_new_unix_adopt(pa_mainloop_api *m, int fd) {
> +    pa_socket_server *s;
> +    struct sockaddr_un address;
> +    socklen_t addr_len;
> +
> +    pa_make_socket_low_delay(fd);
> +    pa_assert_se(s = pa_socket_server_new(m, fd));
> +
> +    addr_len = sizeof address;
> +    if (getsockname(fd, &address, &addr_len) == 0)
> +        s->filename = pa_xstrdup(address.sun_path);
> +
> +    s->type = SOCKET_SERVER_UNIX;
> +
> +    return s;
> +}
> +
>  #else /* HAVE_SYS_UN_H */
>  
>  pa_socket_server* pa_socket_server_new_unix(pa_mainloop_api *m, const char *filename) {
>      return NULL;
>  }
>  
> +pa_socket_server *pa_socket_server_new_unix_adopt(pa_mainloop_api *m, int fd) {
> +    return NULL;
> +}
> +
>  #endif /* HAVE_SYS_UN_H */
>  
>  pa_socket_server* pa_socket_server_new_ipv4(pa_mainloop_api *m, uint32_t address, uint16_t port, bool fallback, const char *tcpwrap_service) {
> @@ -290,6 +311,17 @@ fail:
>      return NULL;
>  }
>  
> +pa_socket_server *pa_socket_server_new_ipv4_adopt(pa_mainloop_api *m, int fd) {
> +    pa_socket_server *s;
> +
> +    pa_make_tcp_socket_low_delay(fd);
> +    pa_assert_se(s = pa_socket_server_new(m, fd));
> +
> +    s->type = SOCKET_SERVER_IPV4;
> +
> +    return s;
> +}
> +
>  #ifdef HAVE_IPV6
>  pa_socket_server* pa_socket_server_new_ipv6(pa_mainloop_api *m, const uint8_t address[16], uint16_t port, bool fallback, const char *tcpwrap_service) {
>      pa_socket_server *ss;
> @@ -358,6 +390,17 @@ fail:
>  
>      return NULL;
>  }
> +
> +pa_socket_server *pa_socket_server_new_ipv6_adopt(pa_mainloop_api *m, int fd) {
> +    pa_socket_server *s;
> +
> +    pa_make_tcp_socket_low_delay(fd);
> +    pa_assert_se(s = pa_socket_server_new(m, fd));
> +
> +    s->type = SOCKET_SERVER_IPV6;
> +
> +    return s;
> +}
>  #endif
>  
>  pa_socket_server* pa_socket_server_new_ipv4_loopback(pa_mainloop_api *m, uint16_t port, bool fallback, const char *tcpwrap_service) {
> diff --git a/src/pulsecore/socket-server.h b/src/pulsecore/socket-server.h
> index a72bd9e..1bd9819 100644
> --- a/src/pulsecore/socket-server.h
> +++ b/src/pulsecore/socket-server.h
> @@ -33,12 +33,15 @@ typedef struct pa_socket_server pa_socket_server;
>  
>  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_adopt(pa_mainloop_api *m, int fd);
>  pa_socket_server* pa_socket_server_new_ipv4(pa_mainloop_api *m, uint32_t address, uint16_t port, bool fallback, const char *tcpwrap_service);
> +pa_socket_server* pa_socket_server_new_ipv4_adopt(pa_mainloop_api *m, int fd);
>  pa_socket_server* pa_socket_server_new_ipv4_loopback(pa_mainloop_api *m, uint16_t port, bool fallback, const char *tcpwrap_service);
>  pa_socket_server* pa_socket_server_new_ipv4_any(pa_mainloop_api *m, uint16_t port, bool fallback, const char *tcpwrap_service);
>  pa_socket_server* pa_socket_server_new_ipv4_string(pa_mainloop_api *m, const char *name, uint16_t port, bool fallback, const char *tcpwrap_service);
>  #ifdef HAVE_IPV6
>  pa_socket_server* pa_socket_server_new_ipv6(pa_mainloop_api *m, const uint8_t address[16], uint16_t port, bool fallback, const char *tcpwrap_service);
> +pa_socket_server* pa_socket_server_new_ipv6_adopt(pa_mainloop_api *m, int fd);
>  pa_socket_server* pa_socket_server_new_ipv6_loopback(pa_mainloop_api *m, uint16_t port, bool fallback, const char *tcpwrap_service);
>  pa_socket_server* pa_socket_server_new_ipv6_any(pa_mainloop_api *m, uint16_t port, bool fallback, const char *tcpwrap_service);
>  pa_socket_server* pa_socket_server_new_ipv6_string(pa_mainloop_api *m, const char *name, uint16_t port, bool fallback, const char *tcpwrap_service);
> 

-- 

Peter Meerwald
+43-664-2444418 (mobile)


More information about the pulseaudio-discuss mailing list