First implementation of ckm-listener-daemon.
authorBartlomiej Grzelewski <b.grzelewski@samsung.com>
Thu, 7 Aug 2014 12:23:45 +0000 (14:23 +0200)
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>
Fri, 12 Sep 2014 12:59:27 +0000 (14:59 +0200)
Change-Id: I80bb8dd113568a7059755a0d1a446c9feae25e6b

CMakeLists.txt
packaging/key-manager.spec
src/CMakeLists.txt
src/listener/CMakeLists.txt [new file with mode: 0644]
src/listener/listener-daemon.cpp [new file with mode: 0644]

index dc38ff6..4d83b58 100644 (file)
@@ -63,6 +63,7 @@ SET(TARGET_KEY_MANAGER_CLIENT "key-manager-client")
 SET(TARGET_KEY_MANAGER_CONTROL_CLIENT "key-manager-control-client")
 SET(TARGET_KEY_MANAGER_COMMON "key-manager-commons")
 SET(TARGET_KEY_MANAGER_KEY_PROVIDER "key-manager-key-provider")
+SET(TARGET_LISTENER "key-manager-listener")
 
 SET(TARGET_TEST_MERGED "ckm-tests-internal")
 
index f5137b0..f1ac51d 100755 (executable)
@@ -13,6 +13,8 @@ BuildRequires: libattr-devel
 BuildRequires: pkgconfig(libsmack)
 BuildRequires: pkgconfig(libsystemd-daemon)
 BuildRequires: pkgconfig(db-util)
+BuildRequires: pkgconfig(capi-appfw-package-manager)
+BuildRequires: pkgconfig(glib-2.0)
 BuildRequires: boost-devel
 Requires: boost-test
 %{?systemd_requires}
@@ -123,6 +125,7 @@ fi
 %files -n key-manager
 %manifest %{_datadir}/key-manager.manifest
 %attr(755,root,root) /usr/bin/key-manager
+%attr(755,root,root) /usr/bin/key-manager-listener
 %{_libdir}/libkey-manager-commons.so*
 %{_libdir}/libkey-manager-key-provider.so*
 %attr(-,root,root) /usr/lib/systemd/system/multi-user.target.wants/central-key-manager.service
index 6d54883..86f1344 100644 (file)
@@ -207,3 +207,4 @@ INSTALL(FILES
 ################################################################################
 
 ADD_SUBDIRECTORY(manager)
+ADD_SUBDIRECTORY(listener)
diff --git a/src/listener/CMakeLists.txt b/src/listener/CMakeLists.txt
new file mode 100644 (file)
index 0000000..b3e1328
--- /dev/null
@@ -0,0 +1,24 @@
+PKG_CHECK_MODULES(LISTENER_DEP
+    REQUIRED
+    dlog
+    glib-2.0
+    capi-appfw-package-manager
+    )
+
+SET(LISTENER_SOURCES ${PROJECT_SOURCE_DIR}/src/listener/listener-daemon.cpp)
+
+INCLUDE_DIRECTORIES(
+    ${PROJECT_SOURCE_DIR}/src/include
+    ${LISTENER_DEP_INCLUDE_DIRS}
+    )
+
+ADD_EXECUTABLE(${TARGET_LISTENER} ${LISTENER_SOURCES})
+
+TARGET_LINK_LIBRARIES(
+    ${TARGET_LISTENER}
+    ${LISTENER_DEP_LIBRARIES}
+    ${TARGET_KEY_MANAGER_CLIENT}
+    ${TARGET_KEY_MANAGER_CONTROL_CLIENT}
+    )
+
+INSTALL(TARGETS ${TARGET_LISTENER} DESTINATION bin)
diff --git a/src/listener/listener-daemon.cpp b/src/listener/listener-daemon.cpp
new file mode 100644 (file)
index 0000000..bf5ea95
--- /dev/null
@@ -0,0 +1,115 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <glib.h>
+#include <package_manager.h>
+#include <ckm/ckm-control.h>
+#include <dlog.h>
+
+#define CKM_TAG "CKM_LISTENER"
+
+void eventCallback(
+    const char *type,
+    const char *package,
+    package_manager_event_type_e eventType,
+    package_manager_event_state_e eventState,
+    int progress,
+    package_manager_error_e error,
+    void *userData)
+{
+    (void) type;
+    (void) progress;
+    (void) error;
+    (void) userData;
+
+    if (eventType != PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL)
+        return;
+
+    if (eventState != PACKAGE_MANAGER_EVENT_STATE_STARTED)
+        return;
+
+    if (package == NULL)
+        return;
+
+    SLOG(LOG_DEBUG, CKM_TAG, "Get callback. Uninstalation of: %s", package);
+    auto control = CKM::Control::create();
+    control->removeApplicationData(std::string(package));
+}
+
+int main(void) {
+    SLOG(LOG_DEBUG, CKM_TAG, "%s", "Start!");
+
+    // Let's operate in background
+    int result = fork();
+    if (result < 0){
+        SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in fork!");
+        exit(1);
+    }
+
+    if (result > 0)
+        exit(0);
+
+    // Let's disconnect from terminal
+    if (-1 == setsid()) {
+        SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in fork!");
+        exit(1);
+    }
+
+    // Let's close all descriptors
+//    for (result = getdtablesize(); result>=0; --result)
+//        close(result);
+
+//    result = open("/dev/null", O_RDWR); // open stdin
+//    dup(result); // stdout
+//    dup(result); // stderr
+
+    umask(027);
+
+    // Let's change current directory
+    if (-1 == chdir("/")) {
+        SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in chdir!");
+        exit(1);
+    }
+
+    // Let's create lock file
+    result = open("/tmp/ckm-listener.lock", O_RDWR | O_CREAT, 0640);
+    if (result < 0) {
+        SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in opening lock file!");
+        exit(1);
+    }
+
+    if (lockf(result, F_TLOCK, 0) < 0) {
+        SLOG(LOG_DEBUG, CKM_TAG, "%s", "Daemon already working!");
+        exit(0);
+    }
+
+    char str[100];
+    sprintf(str, "%d\n", getpid());
+    result = write(result, str, strlen(str));
+
+    SLOG(LOG_DEBUG, CKM_TAG, "%s", str);
+
+    // Let's start to listen
+    GMainLoop *main_loop = g_main_loop_new(NULL, FALSE);
+    package_manager_h request;
+
+    package_manager_create(&request);
+    if (0 != package_manager_set_event_cb(request, eventCallback, NULL)) {
+        SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in package_manager_set_event_cb");
+        exit(-1);
+    }
+
+    /* Change file mode mask */
+
+    SLOG(LOG_DEBUG, CKM_TAG, "%s", "Ready to listen!");
+    g_main_loop_run(main_loop);
+    return 0;
+}
+