From: Karol Lewandowski Date: Mon, 16 Apr 2018 10:45:15 +0000 (+0200) Subject: Enable systemd activation for TCP ports X-Git-Tag: accepted/tizen/unified/20180426.145755~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8c8b42c7a78a0604172001e2ce430cab1f95cba7;p=sdk%2Ftarget%2Fsdbd.git Enable systemd activation for TCP ports Change-Id: Id7d67ba3cd2a749362f6cfd91f139fc4d40a97b4 Signed-off-by: Karol Lewandowski Signed-off-by: Hyotaek Shim --- diff --git a/packaging/sdbd.spec b/packaging/sdbd.spec index 57a4dbb..a114dd8 100644 --- a/packaging/sdbd.spec +++ b/packaging/sdbd.spec @@ -11,7 +11,7 @@ Source0: %{name}-%{version}.tar.gz Source1001: sdbd_device.service Source1002: sdbd_emulator.service Source1003: %{name}.manifest -Source1004: sdbd_tcp.service +Source1004: sdbd_tcp.socket Source1005: sdbd_device_tv.service Source1006: sdbd_emulator_tv.service Source1007: sdbd.socket @@ -28,6 +28,7 @@ BuildRequires: pkgconfig(vconf) BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(gio-2.0) BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(libsystemd) Requires: dbus Provides: %{name}-profile_common = %{version}-%{release} Provides: %{name}-profile_mobile = %{version}-%{release} @@ -89,7 +90,10 @@ ln -s %{_unitdir}/sdbd.service %{buildroot}/%{_unitdir}/emulator_preinit.target. install -m 0644 %SOURCE1005 %{buildroot}%{_unitdir}/sdbd.service.tv install -m 0644 %SOURCE1001 %{buildroot}%{_unitdir}/sdbd.service -install -m 0644 %SOURCE1004 %{buildroot}%{_unitdir}/sdbd_tcp.service +install -m 0644 %SOURCE1004 %{buildroot}%{_unitdir}/sdbd_tcp.socket + +install -m 0755 -d %{buildroot}%{_unitdir}/sockets.target.wants/ +ln -s ../sdbd_tcp.socket %{buildroot}%{_unitdir}/sockets.target.wants/ mkdir -p %{buildroot}%{_prefix}/lib/udev/rules.d/ install -m 644 rules/99-sdbd.rules %{buildroot}%{_prefix}/lib/udev/rules.d/ @@ -131,7 +135,8 @@ chsmack -e "User::Shell" /sbin/sdbd-user %attr(0755, root, root) %{_sysconfdir}/init.d/sdbd %{_unitdir}/sdbd.service %{_unitdir}/sdbd.socket -%{_unitdir}/sdbd_tcp.service +%{_unitdir}/sdbd_tcp.socket +%{_unitdir}/sockets.target.wants/sdbd_tcp.socket %{_prefix}/lib/udev/rules.d/99-sdbd.rules %{TZ_SYS_BIN}/profile_command %{_sysconfdir}/sdbd/descs diff --git a/packaging/sdbd_tcp.service b/packaging/sdbd_tcp.service deleted file mode 100644 index fd5ec24..0000000 --- a/packaging/sdbd_tcp.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=sdbd -After=default.target - -[Service] -User=sdk -Group=sdk -Type=simple -#If necessary, Put Environment variable settings in a file like below -#ExecStartPre=/bin/bash -c "/bin/echo 'SDB_TRACE=all SDBD_LOG_PATH=/tmp' >> /tmp/.sdbdlog.conf" -PIDFile=/tmp/.sdbd.pid -RemainAfterExit=yes -SmackProcessLabel=System -Capabilities=cap_dac_override,cap_setgid,cap_setuid,cap_sys_admin=i -SecureBits=keep-caps -ExecStart=/usr/sbin/sdbd --listen-port=26101 diff --git a/packaging/sdbd_tcp.socket b/packaging/sdbd_tcp.socket new file mode 100644 index 0000000..0cfae9c --- /dev/null +++ b/packaging/sdbd_tcp.socket @@ -0,0 +1,11 @@ +[Unit] +Description=sdbd: TCP socket + +[Socket] +ListenStream=26101 +SmackLabelIPIn=* +SmackLabelIPOut=@ +Service=sdbd.service + +[Install] +WantedBy=sockets.target diff --git a/src/commandline_sdbd.c b/src/commandline_sdbd.c index eee6ac2..bf57048 100644 --- a/src/commandline_sdbd.c +++ b/src/commandline_sdbd.c @@ -16,6 +16,7 @@ #include "commandline_sdbd.h" #include "sdb.h" +#include "sdb_systemd.h" #include #include @@ -109,6 +110,8 @@ int parse_sdbd_commandline(SdbdCommandlineArgs *sdbd_args, int argc, char *argv[ if (sscanf(optarg, "%d", &sdbd_args->sdbd_port) < 1) { return SDBD_COMMANDLINE_FAILURE; } + if (sdb_port_get_tcp_listenfd() != -1) + printf("warning: sdb port was provided by systemd but overriden from command line\n"); print_sdbd_command(stdout, sdbd_args); break; case ARG_S_HELP: @@ -139,8 +142,8 @@ void apply_sdbd_commandline_defaults(SdbdCommandlineArgs *sdbd_args) { sdbd_args->sdb.host = strdup(QEMU_FORWARD_IP); sdbd_args->sdb.port = DEFAULT_SDB_PORT; - // by default don't listen on local transport - sdbd_args->sdbd_port = -1; + // by default don't listen on local transport (unless systemd passed it) + sdbd_args->sdbd_port = sdb_port_try_automatic(); } diff --git a/src/sdb_systemd.h b/src/sdb_systemd.h new file mode 100644 index 0000000..f183389 --- /dev/null +++ b/src/sdb_systemd.h @@ -0,0 +1,45 @@ +#ifndef SDB_SYSTEMD_H +#define SDB_SYSTEMD_H + +#ifndef _WIN32 + +#include +#include +#include "sysdeps.h" + + +static int sdb_port_get_tcp_listenfd(void) +{ + int fd = -1; + int maxfd = sd_listen_fds(0) + SD_LISTEN_FDS_START; + + for (fd = SD_LISTEN_FDS_START; fd < maxfd; fd++) { + if (sd_is_socket_inet(fd, AF_INET, SOCK_STREAM, 1, 0) > 0 + || sd_is_socket_inet(fd, AF_INET6, SOCK_STREAM, 1, 0) > 0) { + close_on_exec(fd); + return fd; + } + } + + return -1; +} + +static __inline__ int sdb_port_try_automatic(void) +{ + return sd_listen_fds(0) > 0 ? 0 : -1; +} + +#else + +static __inline__ int sdb_port_get_tcp_listenfd(void) +{ + return -1; +} + +static __inline__ int sdb_port_try_automatic(void) +{ + return -1; +} +#endif /* _WIN32 */ + +#endif /* SDB_SYSTEMD_H */ diff --git a/src/transport_local.c b/src/transport_local.c index 58a07a4..ab307d5 100644 --- a/src/transport_local.c +++ b/src/transport_local.c @@ -22,6 +22,8 @@ #include #include "sysdeps.h" +#include "sdb_systemd.h" + #include #ifndef HAVE_WIN32_IPC @@ -149,7 +151,7 @@ static void *server_socket_thread(void * arg) int port = (intptr_t)arg; D("transport: server_socket_thread() starting\n"); - serverfd = -1; + serverfd = sdb_port_get_tcp_listenfd(); for(;;) { if(serverfd == -1) { // socket_inaddr_any_server returns -1 if there is any error