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
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}
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/
%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
+++ /dev/null
-[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
--- /dev/null
+[Unit]
+Description=sdbd: TCP socket
+
+[Socket]
+ListenStream=26101
+SmackLabelIPIn=*
+SmackLabelIPOut=@
+Service=sdbd.service
+
+[Install]
+WantedBy=sockets.target
#include "commandline_sdbd.h"
#include "sdb.h"
+#include "sdb_systemd.h"
#include <stdio.h>
#include <string.h>
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:
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();
}
--- /dev/null
+#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 */
#include <netdb.h>
#include "sysdeps.h"
+#include "sdb_systemd.h"
+
#include <sys/types.h>
#ifndef HAVE_WIN32_IPC
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