INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
INCLUDE(FindPkgConfig)
-pkg_check_modules(pkgs REQUIRED dukgenerator)
+pkg_check_modules(pkgs REQUIRED dukgenerator libsystemd-daemon)
FOREACH(flag ${pkgs_CFLAGS})
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/config DESTINATION share/secure-storage/)
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/ss_manager.h DESTINATION include)
INSTALL(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/ss-serverd DESTINATION /etc/rc.d/init.d)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/systemd/secure-storage.service DESTINATION /usr/lib/systemd/system)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/systemd/secure-storage.socket DESTINATION /usr/lib/systemd/system)
Group: System/Security
License: Apache 2.0
Source0: secure-storage-%{version}.tar.gz
-Source1: secure-storage.service
BuildRequires: pkgconfig(openssl)
BuildRequires: pkgconfig(dlog)
-#BuildRequires: pkgconfig(libsystemd-daemon)
+BuildRequires: pkgconfig(libsystemd-daemon)
BuildRequires: pkgconfig(security-server)
BuildRequires: cmake
BuildRequires: pkgconfig(dukgenerator)
%make_install
mkdir -p %{buildroot}%{_prefix}/lib/systemd/system/multi-user.target.wants
-install -m 0644 %{SOURCE1} %{buildroot}%{_prefix}/lib/systemd/system/secure-storage.service
+mkdir -p %{buildroot}%{_prefix}/lib/systemd/system/sockets.target.wants
ln -s ../secure-storage.service %{buildroot}%{_prefix}/lib/systemd/system/multi-user.target.wants/secure-storage.service
+ln -s ../secure-storage.socket %{buildroot}%{_prefix}/lib/systemd/system/sockets.target.wants/secure-storage.socket
mkdir -p %{buildroot}%{_sysconfdir}/rc.d/rc3.d
mkdir -p %{buildroot}%{_sysconfdir}/rc.d/rc5.d
%{_bindir}/ss-server
%{_prefix}/lib/systemd/system/secure-storage.service
%{_prefix}/lib/systemd/system/multi-user.target.wants/secure-storage.service
+%{_prefix}/lib/systemd/system/secure-storage.socket
+%{_prefix}/lib/systemd/system/sockets.target.wants/secure-storage.socket
%{_datadir}/secure-storage/config
/usr/share/license/ss-server
#include <dirent.h>
#include <sys/ioctl.h>
#include <fcntl.h>
-
+#include <systemd/sd-daemon.h>
#include "secure_storage.h"
#include "ss_server_ipc.h"
#include "ss_server_main.h"
server_sockfd = client_sockfd = -1;
- if((server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
+ int number_fds = sd_listen_fds(1);
+ if (number_fds > 1)
{
- SLOGE("Error in function socket()..\n");
- send_data.rsp_type = SS_SOCKET_ERROR; // ipc error
+ SLOGE("Too many file descriptors received..\n");
+ send_data.rsp_type = SS_SOCKET_ERROR; // ipc error
goto Error_exit;
}
+ if (number_fds == 1)
+ {
+ int r;
+ if ((r = sd_is_socket_unix(SD_LISTEN_FDS_START, SOCK_STREAM, 1, SS_SOCK_PATH, 0)) <= 0)
+ {
+ SLOGE("The file descriptor received from systemd is of a wrong type.\n");
+ send_data.rsp_type = SS_SOCKET_ERROR; // ipc error
+ goto Error_exit;
+ }
+ server_sockfd = SD_LISTEN_FDS_START + 0;
+ }
+ else
+ {
+ if((server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
+ {
+ SLOGE("Error in function socket()..\n");
+ send_data.rsp_type = SS_SOCKET_ERROR; // ipc error
+ goto Error_exit;
+ }
- temp_len_sock = strlen(SS_SOCK_PATH);
-
- bzero(&serveraddr, sizeof(serveraddr));
- serveraddr.sun_family = AF_UNIX;
- strncpy(serveraddr.sun_path, SS_SOCK_PATH, temp_len_sock);
- serveraddr.sun_path[temp_len_sock] = '\0';
+ temp_len_sock = strlen(SS_SOCK_PATH);
+
+ memset(&serveraddr, '0', sizeof(serveraddr));
+ serveraddr.sun_family = AF_UNIX;
+ strncpy(serveraddr.sun_path, SS_SOCK_PATH, temp_len_sock);
+ serveraddr.sun_path[temp_len_sock] = '\0';
- if((bind(server_sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr))) < 0)
- {
- unlink("/tmp/SsSocket");
if((bind(server_sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr))) < 0)
{
- SLOGE("Error in function bind()..\n");
- send_data.rsp_type = SS_SOCKET_ERROR; // ipc error
- goto Error_close_exit;
+ unlink(SS_SOCK_PATH);
+ if((bind(server_sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr))) < 0)
+ {
+ SLOGE("Error in function bind()..\n");
+ send_data.rsp_type = SS_SOCKET_ERROR; // ipc error
+ goto Error_close_exit;
+ }
}
- }
- if(chmod(SS_SOCK_PATH, S_IRWXU | S_IRWXG | S_IRWXO) != 0)
- {
- send_data.rsp_type = SS_SOCKET_ERROR;
- goto Error_close_exit;
- }
+ if(chmod(SS_SOCK_PATH, S_IRWXU | S_IRWXG | S_IRWXO) != 0)
+ {
+ send_data.rsp_type = SS_SOCKET_ERROR;
+ goto Error_close_exit;
+ }
- if((listen(server_sockfd, 5)) < 0)
- {
- SLOGE("Error in function listen()..\n");
- send_data.rsp_type = SS_SOCKET_ERROR; // ipc error
- goto Error_close_exit;
+ if((listen(server_sockfd, 5)) < 0)
+ {
+ SLOGE("Error in function listen()..\n");
+ send_data.rsp_type = SS_SOCKET_ERROR; // ipc error
+ goto Error_close_exit;
+ }
}
signal(SIGINT, (void*)SigHandler);
+ sd_notify(0, "READY=1");
while(1)
{