10 #include <systemd/sd-daemon.h>
13 #include <package_manager.h>
14 #include <ckm/ckm-control.h>
17 #define CKM_TAG "CKM_LISTENER"
22 package_manager_event_type_e eventType,
23 package_manager_event_state_e eventState,
25 package_manager_error_e error,
33 if (eventType != PACKAGE_MANAGER_EVENT_TYPE_UNINSTALL)
36 if (eventState != PACKAGE_MANAGER_EVENT_STATE_STARTED)
42 SLOG(LOG_DEBUG, CKM_TAG, "Get callback. Uninstalation of: %s", package);
43 auto control = CKM::Control::create();
44 control->removeApplicationData(std::string(package));
48 SLOG(LOG_DEBUG, CKM_TAG, "%s", "Start!");
50 // Let's operate in background
53 SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in fork!");
60 // Let's disconnect from terminal
62 SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in fork!");
66 // Let's close all descriptors
67 // for (result = getdtablesize(); result>=0; --result)
74 result = open("/dev/null", O_RDWR); // open stdin
78 fd_stdout = dup(result); // stdout
79 fd_stderr = dup(result); // stderr
80 SLOG(LOG_DEBUG, CKM_TAG, "%d : %s", fd_stdout, "stdout file descriptor");
81 SLOG(LOG_DEBUG, CKM_TAG, "%d : %s", fd_stderr, "stderr file descriptor");
86 // Let's change current directory
87 if (-1 == chdir("/")) {
88 SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in chdir!");
92 // Let's create lock file
93 result = open("/tmp/ckm-listener.lock", O_RDWR | O_CREAT, 0640);
95 SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in opening lock file!");
99 if (lockf(result, F_TLOCK, 0) < 0) {
100 SLOG(LOG_DEBUG, CKM_TAG, "%s", "Daemon already working!");
105 sprintf(str, "%d\n", getpid());
106 result = write(result, str, strlen(str));
108 SLOG(LOG_DEBUG, CKM_TAG, "%s", str);
110 // Let's start to listen
111 GMainLoop *main_loop = g_main_loop_new(NULL, FALSE);
112 package_manager_h request;
114 package_manager_create(&request);
115 if (0 != package_manager_set_event_cb(request, eventCallback, NULL)) {
116 SLOG(LOG_DEBUG, CKM_TAG, "%s", "Error in package_manager_set_event_cb");
120 /* Change file mode mask */
122 SLOG(LOG_DEBUG, CKM_TAG, "%s", "Ready to listen!");
123 g_main_loop_run(main_loop);