Enable systemd activation for TCP ports 14/175814/10
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Mon, 16 Apr 2018 10:45:15 +0000 (12:45 +0200)
committerManish Rathod <manish.r@samsung.com>
Thu, 26 Apr 2018 05:50:55 +0000 (05:50 +0000)
Change-Id: Id7d67ba3cd2a749362f6cfd91f139fc4d40a97b4
Signed-off-by: Karol Lewandowski <k.lewandowsk@samsung.com>
Signed-off-by: Hyotaek Shim <hyotaek.shim@samsung.com>
packaging/sdbd.spec
packaging/sdbd_tcp.service [deleted file]
packaging/sdbd_tcp.socket [new file with mode: 0644]
src/commandline_sdbd.c
src/sdb_systemd.h [new file with mode: 0644]
src/transport_local.c

index 57a4dbb..a114dd8 100644 (file)
@@ -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 (file)
index fd5ec24..0000000
+++ /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 (file)
index 0000000..0cfae9c
--- /dev/null
@@ -0,0 +1,11 @@
+[Unit]
+Description=sdbd: TCP socket
+
+[Socket]
+ListenStream=26101
+SmackLabelIPIn=*
+SmackLabelIPOut=@
+Service=sdbd.service
+
+[Install]
+WantedBy=sockets.target
index eee6ac2..bf57048 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "commandline_sdbd.h"
 #include "sdb.h"
+#include "sdb_systemd.h"
 
 #include <stdio.h>
 #include <string.h>
@@ -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 (file)
index 0000000..f183389
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef SDB_SYSTEMD_H
+#define SDB_SYSTEMD_H
+
+#ifndef _WIN32
+
+#include <systemd/sd-daemon.h>
+#include <arpa/inet.h>
+#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 */
index 58a07a4..ab307d5 100644 (file)
@@ -22,6 +22,8 @@
 #include <netdb.h>
 
 #include "sysdeps.h"
+#include "sdb_systemd.h"
+
 #include <sys/types.h>
 
 #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