cmake_minimum_required(VERSION 2.6)
project(sensor_framework_main CXX)
+include(TizenCommon)
include(FindPkgConfig)
-pkg_check_modules(rpkgs REQUIRED sf_common vconf heynoti)
+pkg_check_modules(rpkgs REQUIRED sf_common vconf heynoti libsystemd-daemon)
add_definitions(${rpkgs_CFLAGS})
# to install pkgconfig setup file.
endif()
install(PROGRAMS sfsvc DESTINATION /etc/rc.d/init.d)
+
+####################### systemd files installation ############################
+INSTALL(FILES
+ ${CMAKE_CURRENT_SOURCE_DIR}/systemd/sensor-framework.service
+ ${CMAKE_CURRENT_SOURCE_DIR}/systemd/sensor-framework.socket
+ DESTINATION ${LIB_INSTALL_DIR}/systemd/system)
+
Group: Framework/system
License: Apache License, Version 2.0
Source0: %{name}-%{version}.tar.gz
-Source1: sensor-framework.service
Source1001: sensor-framework.manifest
%ifarch %{arm}
BuildRequires: pkgconfig(sf_common)
BuildRequires: pkgconfig(vconf)
BuildRequires: pkgconfig(heynoti)
+BuildRequires: pkgconfig(libsystemd-daemon)
+%{?systemd_requires}
%description
Sensor framework
cp LICENSE %{buildroot}/usr/share/license/%{name}
mkdir -p %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants
-install -m 0644 %SOURCE1 %{buildroot}%{_libdir}/systemd/system/
+mkdir -p %{buildroot}%{_libdir}/systemd/system/sockets.target.wants
ln -s ../sensor-framework.service %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants/sensor-framework.service
+ln -s ../sensor-framework.socket %{buildroot}%{_libdir}/systemd/system/sockets.target.wants/sensor-framework.socket
# FIXME: remove initscripts after we start using systemd
mkdir -p %{buildroot}%{_sysconfdir}/rc.d/rc3.d
vconftool set -t int memory/private/sensor/80002 0 -i
vconftool set -t int memory/private/sensor/poweroff 0 -i
+systemctl daemon-reload
+
%files
-%manifest %{name}.manifest
+%manifest sensor-framework.manifest
%attr(0755,root,root) %{_sysconfdir}/rc.d/init.d/sfsvc
%{_sysconfdir}/rc.d/rc3.d/S40sfsvc
%{_sysconfdir}/rc.d/rc4.d/S40sfsvc
%attr(0644,root,root)/usr/etc/sf_processor.conf
%attr(0644,root,root)/usr/etc/sf_sensor.conf
%{_libdir}/systemd/system/sensor-framework.service
+%{_libdir}/systemd/system/sensor-framework.socket
%{_libdir}/systemd/system/multi-user.target.wants/sensor-framework.service
+%{_libdir}/systemd/system/sockets.target.wants/sensor-framework.socket
/usr/share/license/%{name}
void sf_main_loop_stop(void);
private:
+ int get_systemd_socket(const char *name);
+
+private:
struct client_ctx_t {
ctype *module;
-
+#include <systemd/sd-daemon.h>
#include <stdio.h>
#include <errno.h>
#include <dlfcn.h>
}
}
+int cserver::get_systemd_socket(const char *name)
+{
+ int type = SOCK_STREAM;
+ int listening = 1;
+ size_t length = 0;
+ int fd = -1;
+ int n;
+
+ // Gets number of created by systemd file descriptors that represent open sockets.
+ n = sd_listen_fds(1);
+
+ // Check open sockets count (must be 1)
+ if (n != 1)
+ return -1;
+
+ // File descriptor calculation
+ fd = SD_LISTEN_FDS_START + 0;
+
+ // File descriptor veryfication.
+ if(sd_is_socket_unix(fd, type, listening, name, length) > 0)
+ return fd;
+
+ // No proper socket or error
+ return -1;
+}
+
+
void cserver::sf_main_loop(void)
{
csock *ipc = NULL;
+ int sockfd = -1;
int fd = -1;
g_mainloop = g_main_loop_new(NULL, FALSE);
try {
- ipc = new csock((char*)STR_SF_IPC_SOCKET, csock::SOCK_TCP|csock::SOCK_WORKER, 0, 1);
+ // Get systemd socket
+ sockfd = cserver::get_systemd_socket(STR_SF_IPC_SOCKET);
+
+ if (sockfd >= 0) {
+ // Systemd socket exists - short csock object setup
+ ipc = new csock(sockfd, csock::SOCK_TCP|csock::SOCK_WORKER);
+ } else {
+ // No systemd socket - standard csock object setup
+ ipc = new csock((char*)STR_SF_IPC_SOCKET, csock::SOCK_TCP|csock::SOCK_WORKER, 0, 1);
+ }
} catch (int ErrNo) {
ERR("ipc class create fail , errno : %d , errstr : %s\n",ErrNo, strerror(ErrNo));
return ;
fd = -1;
}
+ // Notification to systemd
+ sd_notify(0, "READY=1");
+
g_main_loop_run(g_mainloop);
g_main_loop_unref(g_mainloop);
Description=Start the sensor framework
[Service]
-Type=simple
+Type=notify
ExecStart=/usr/bin/sf_server -s /usr/etc/sf_sensor.conf -f /usr/etc/sf_filter.conf -p /usr/etc/sf_processor.conf -d /usr/etc/sf_data_stream.conf
[Install]
--- /dev/null
+[Unit]
+Description=Sensor Framework socket
+
+[Socket]
+ListenStream=/tmp/sf_socket
+SocketMode=0777
+PassCredentials=yes
+Accept=false