Convert to systemd API
authorDariusz Michaluk <d.michaluk@samsung.com>
Thu, 13 Jun 2013 09:59:55 +0000 (11:59 +0200)
committerDariusz Michaluk <d.michaluk@samsung.com>
Thu, 4 Jul 2013 07:15:41 +0000 (09:15 +0200)
-enable socket activation,
-enable sd_notify (start-up completion notification),
-build package changes.

Change-Id: I8435218029ccb673865c20e54838e9d36cb683b6

CMakeLists.txt
packaging/secure-storage.spec
server/src/ss_server_ipc.c
systemd/secure-storage.service [moved from packaging/secure-storage.service with 93% similarity]
systemd/secure-storage.socket [new file with mode: 0644]

index 3d8f9fd..3ea168d 100644 (file)
@@ -13,7 +13,7 @@ SET(VERSION ${VERSION_MAJOR}.0.0)
 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}")
@@ -73,3 +73,5 @@ INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/secure-storage.pc DESTINATION ${LIB_IN
 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)
index 6757b0f..22e8950 100755 (executable)
@@ -5,10 +5,9 @@ Release:    4
 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)
@@ -59,8 +58,9 @@ make %{?jobs:-j%jobs}
 %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
@@ -98,6 +98,8 @@ systemctl daemon-reload
 %{_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
 
index be34cd8..e0cc5e0 100755 (executable)
@@ -32,7 +32,7 @@
 #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"
@@ -199,45 +199,67 @@ void SsServerComm(void)
 
        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) 
        {
similarity index 93%
rename from packaging/secure-storage.service
rename to systemd/secure-storage.service
index d46ceee..553539e 100644 (file)
@@ -3,6 +3,7 @@
 Description=Start the Secure Storage server
 
 [Service]
+Type=notify
 ExecStartPre=-/bin/mkdir -p /csa
 ExecStart=/usr/bin/ss-server
 
diff --git a/systemd/secure-storage.socket b/systemd/secure-storage.socket
new file mode 100644 (file)
index 0000000..631c09a
--- /dev/null
@@ -0,0 +1,6 @@
+[Socket]
+ListenStream=/tmp/SsSocket
+SocketMode=0777
+
+[Install]
+WantedBy=sockets.target