First implementation of ckm-listener-daemon.
[platform/core/security/key-manager.git] / src / listener / listener-daemon.cpp
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <fcntl.h>
4 #include <errno.h>
5 #include <unistd.h>
6 #include <syslog.h>
7 #include <string.h>
8 #include <sys/types.h>
9 #include <sys/stat.h>
10
11 #include <glib.h>
12 #include <package_manager.h>
13 #include <ckm/ckm-control.h>
14 #include <dlog.h>
15
16 #define CKM_TAG "CKM_LISTENER"
17
18 void eventCallback(
19     const char *type,
20     const char *package,
21     package_manager_event_type_e eventType,
22     package_manager_event_state_e eventState,
23     int progress,
24     package_manager_error_e error,
25     void *userData)
26 {
27     (void) type;
28     (void) progress;
29     (void) error;
30     (void) userData;
31
32     if (eventType != PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL)
33         return;
34
35     if (eventState != PACKAGE_MANAGER_EVENT_STATE_STARTED)
36         return;
37
38     if (package == NULL)
39         return;
40
41     SLOG(LOG_DEBUG, CKM_TAG, "Get callback. Uninstalation of: %s", package);
42     auto control = CKM::Control::create();
43     control->removeApplicationData(std::string(package));
44 }
45
46 int main(void) {
47     SLOG(LOG_DEBUG, CKM_TAG, "%s", "Start!");
48
49     // Let's operate in background
50     int result = fork();
51     if (result < 0){
52         SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in fork!");
53         exit(1);
54     }
55
56     if (result > 0)
57         exit(0);
58
59     // Let's disconnect from terminal
60     if (-1 == setsid()) {
61         SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in fork!");
62         exit(1);
63     }
64
65     // Let's close all descriptors
66 //    for (result = getdtablesize(); result>=0; --result)
67 //        close(result);
68
69 //    result = open("/dev/null", O_RDWR); // open stdin
70 //    dup(result); // stdout
71 //    dup(result); // stderr
72
73     umask(027);
74
75     // Let's change current directory
76     if (-1 == chdir("/")) {
77         SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in chdir!");
78         exit(1);
79     }
80
81     // Let's create lock file
82     result = open("/tmp/ckm-listener.lock", O_RDWR | O_CREAT, 0640);
83     if (result < 0) {
84         SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in opening lock file!");
85         exit(1);
86     }
87
88     if (lockf(result, F_TLOCK, 0) < 0) {
89         SLOG(LOG_DEBUG, CKM_TAG, "%s", "Daemon already working!");
90         exit(0);
91     }
92
93     char str[100];
94     sprintf(str, "%d\n", getpid());
95     result = write(result, str, strlen(str));
96
97     SLOG(LOG_DEBUG, CKM_TAG, "%s", str);
98
99     // Let's start to listen
100     GMainLoop *main_loop = g_main_loop_new(NULL, FALSE);
101     package_manager_h request;
102
103     package_manager_create(&request);
104     if (0 != package_manager_set_event_cb(request, eventCallback, NULL)) {
105         SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in package_manager_set_event_cb");
106         exit(-1);
107     }
108
109     /* Change file mode mask */
110
111     SLOG(LOG_DEBUG, CKM_TAG, "%s", "Ready to listen!");
112     g_main_loop_run(main_loop);
113     return 0;
114 }
115