Load procfs on booting time
[platform/core/connectivity/stc-manager.git] / plugin / procfs / stc-plugin-procfs.c
index df69301..80cf9b1 100755 (executable)
@@ -145,8 +145,7 @@ static proc_value_s * __proc_tree_find_parent(proc_value_s *value)
        return parent;
 }
 
-static void __proc_tree_add(proc_key_s *key,
-                           proc_value_s *value)
+static void __proc_tree_add(proc_key_s *key, proc_value_s *value)
 {
        proc_value_s *lookup;
        proc_value_s *parent;
@@ -156,32 +155,54 @@ static void __proc_tree_add(proc_key_s *key,
                return;
        }
 
+       if (key == NULL || value == NULL) {
+               if (STC_DEBUG_LOG)
+                       STC_LOGE("invalid parameters");
+               return;
+       }
+
        lookup = g_tree_lookup(proc_tree, key);
        if (lookup) {
                if (STC_DEBUG_LOG)
                        STC_LOGD("LOOKUP: tgid[\033[1;33m%s\033[0;m] pid[%s] ppid[\033[1;35m%s\033[0;m] "
-                               "cmdline[\033[0;34m%s\033[0;m] name[%s]", lookup->status[PROC_STATUS_TGID],
-                               lookup->status[PROC_STATUS_PID], lookup->status[PROC_STATUS_PPID],
-                               lookup->cmdline, lookup->status[PROC_STATUS_NAME]);
+                                "cmdline[\033[0;34m%s\033[0;m] name[%s]", lookup->status[PROC_STATUS_TGID],
+                                lookup->status[PROC_STATUS_PID], lookup->status[PROC_STATUS_PPID],
+                                lookup->cmdline, lookup->status[PROC_STATUS_NAME]);
                return;
        }
 
+       proc_key_s *proc_key = MALLOC0(proc_key_s, 1);
+       if (proc_key == NULL) {
+               STC_LOGE("memory allocation failed");
+               return;
+       }
+
+       proc_value_s *proc_value = MALLOC0(proc_value_s, 1);
+       if (proc_value == NULL) {
+               STC_LOGE("memory allocation failed");
+               FREE(proc_key);
+               return;
+       }
+
+       memcpy(proc_key, key, sizeof(proc_key_s));
+       memcpy(proc_value, value, sizeof(proc_value_s));
+
        if (STC_DEBUG_LOG)
                STC_LOGD("cmdline [%s] pid[%s] ppid[%s]", value->cmdline,
-                       value->status[PROC_STATUS_PID], value->status[PROC_STATUS_PPID]);
+                        value->status[PROC_STATUS_PID], value->status[PROC_STATUS_PPID]);
 
-       g_tree_insert(proc_tree, key, value);
+       g_tree_insert(proc_tree, proc_key, proc_value);
 
        if (STC_DEBUG_LOG)
                __proc_tree_printall();
 
-       parent = __proc_tree_find_parent(value);
+       parent = __proc_tree_find_parent(proc_value);
        if (parent != NULL)
-               stc_plugin_procfs_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, key->pid,
+               stc_plugin_procfs_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, proc_key->pid,
                        parent->cmdline, parent->cmdline, STC_APP_TYPE_SERVICE);
        else
-               stc_plugin_procfs_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, key->pid,
-                       value->cmdline, value->cmdline, STC_APP_TYPE_SERVICE);
+               stc_plugin_procfs_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, proc_key->pid,
+                       proc_value->cmdline, proc_value->cmdline, STC_APP_TYPE_SERVICE);
 }
 
 static void __proc_tree_remove(const proc_key_s *key)
@@ -278,6 +299,10 @@ static void __process_event_fork(int tgid, int pid)
        char cmdline[PROC_NAME_MAX] = {0, };
        char status[PROC_STATUS_CNT][PROC_BUF_MAX];
 
+       /* TODO: Add newly created thread to the process tasks */
+       if (tgid != pid)
+               return;
+
        memset(status, 0x0, sizeof(status));
 
        if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) &&
@@ -290,26 +315,16 @@ static void __process_event_fork(int tgid, int pid)
                }
 
                unsigned int i;
-               proc_key_s *key;
-               proc_value_s *value;
-
-               key = MALLOC0(proc_key_s, 1);
-               if (key == NULL) {
-                       STC_LOGE("memory allocation failed");
-                       return;
-               }
+               proc_key_s key;
+               proc_value_s value;
 
-               value = MALLOC0(proc_value_s, 1);
-               if (value == NULL) {
-                       STC_LOGE("memory allocation failed");
-                       FREE(key);
-                       return;
-               }
+               memset(&key, 0x0, sizeof(proc_key_s));
+               memset(&value, 0x0, sizeof(proc_value_s));
 
-               key->pid = tgid;
+               key.pid = tgid;
                for (i = 0; i < PROC_STATUS_CNT; ++i)
-                       g_strlcpy(value->status[i], status[i], sizeof(value->status[i]));
-               g_strlcpy(value->cmdline, cmdline, sizeof(value->cmdline));
+                       g_strlcpy(value.status[i], status[i], sizeof(value.status[i]));
+               g_strlcpy(value.cmdline, cmdline, sizeof(value.cmdline));
 
                if (STC_DEBUG_LOG) {
                        STC_LOGD("\033[1;34mFORK\033[0;m: tgid[\033[1;33m%d\033[0;m] ppid=[\033[1;35m%s\033[0;m] "
@@ -319,7 +334,7 @@ static void __process_event_fork(int tgid, int pid)
                                status[PROC_STATUS_NAME], status[PROC_STATUS_STATE], status[PROC_STATUS_TRACERPID]);
                }
 
-               __proc_tree_add(key, value);
+               __proc_tree_add(&key, &value);
        }
 }
 
@@ -328,6 +343,10 @@ static void __process_event_exec(int tgid, int pid)
        char cmdline[PROC_NAME_MAX] = {0, };
        char status[PROC_STATUS_CNT][PROC_BUF_MAX];
 
+       /* TODO: Add newly created thread to the process tasks */
+       if (tgid != pid)
+               return;
+
        memset(status, 0x0, sizeof(status));
 
        if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) &&
@@ -340,26 +359,17 @@ static void __process_event_exec(int tgid, int pid)
                }
 
                unsigned int i;
-               proc_key_s *key;
-               proc_value_s *value;
-
-               key = MALLOC0(proc_key_s, 1);
-               if (key == NULL) {
-                       STC_LOGE("memory allocation failed");
-                       return;
-               }
+               proc_key_s key;
+               proc_value_s value;
 
-               value = MALLOC0(proc_value_s, 1);
-               if (value == NULL) {
-                       STC_LOGE("memory allocation failed");
-                       FREE(key);
-                       return;
-               }
+               memset(&key, 0x0, sizeof(proc_key_s));
+               memset(&value, 0x0, sizeof(proc_value_s));
 
-               key->pid = tgid;
+               key.pid = tgid;
                for (i = 0; i < PROC_STATUS_CNT; ++i)
-                       g_strlcpy(value->status[i], status[i], sizeof(value->status[i]));
-               g_strlcpy(value->cmdline, cmdline, sizeof(value->cmdline));
+                       g_strlcpy(value.status[i], status[i],
+                                 sizeof(value.status[i]));
+               g_strlcpy(value.cmdline, cmdline, sizeof(value.cmdline));
 
                if (STC_DEBUG_LOG) {
                        STC_LOGD("\033[1;32mEXEC\033[0;m: tgid[\033[1;33m%d\033[0;m] ppid=[\033[1;35m%s\033[0;m] "
@@ -369,7 +379,7 @@ static void __process_event_exec(int tgid, int pid)
                                status[PROC_STATUS_NAME], status[PROC_STATUS_STATE], status[PROC_STATUS_TRACERPID]);
                }
 
-               __proc_tree_add(key, value);
+               __proc_tree_add(&key, &value);
        }
 }
 
@@ -406,7 +416,7 @@ static gboolean __process_nl_connector_message(GIOChannel *source,
                /* G_IO_ERR/G_IO_HUP/G_IO_NVAL received */
 
                STC_LOGE("Netlink Connector socket received G_IO event, closing"
-                        " socket. G_IO_ERR [%d], G_IO_HUP [%d], G_IO_NVAL [%s]",
+                        " socket. G_IO_ERR [%u], G_IO_HUP [%u], G_IO_NVAL [%u]",
                         (condition & G_IO_ERR), (condition & G_IO_HUP),
                         (condition & G_IO_NVAL));
                __reopen_nl_connector_sock();
@@ -513,6 +523,37 @@ static int __unsubscribe_proc_events(void)
        return 0;
 }
 
+static bool __process_pid_cb(pid_t pid, void *user_data)
+{
+       char cmdline[PROC_NAME_MAX] = {0, };
+       char status[PROC_STATUS_CNT][PROC_BUF_MAX];
+
+       memset(status, 0x0, sizeof(status));
+
+       if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) &&
+           STC_ERROR_NONE == proc_get_status(pid, status)) {
+
+               if (__check_excn(cmdline))
+                       return true;
+
+               unsigned int i;
+               proc_key_s key;
+               proc_value_s value;
+
+               memset(&key, 0x0, sizeof(proc_key_s));
+               memset(&value, 0x0, sizeof(proc_value_s));
+
+               key.pid = pid;
+               for (i = 0; i < PROC_STATUS_CNT; ++i)
+                       g_strlcpy(value.status[i], status[i], sizeof(value.status[i]));
+               g_strlcpy(value.cmdline, cmdline, sizeof(value.cmdline));
+
+               __proc_tree_add(&key, &value);
+       }
+
+       return true;
+}
+
 int stc_plugin_procfs_initialize(void)
 {
        __STC_LOG_FUNC_ENTER__;
@@ -548,8 +589,20 @@ int stc_plugin_procfs_deinitialize(void)
        return STC_ERROR_NONE;
 }
 
-stc_error_e stc_plugin_procfs_status_changed(stc_cmd_type_e cmd,
-                               pid_t pid, const gchar *app_id, const gchar *pkg_id, stc_app_type_e app_type)
+stc_error_e stc_plugin_procfs_load(void)
+{
+       __STC_LOG_FUNC_ENTER__;
+
+       proc_foreach_pid(__process_pid_cb, NULL);
+
+       __STC_LOG_FUNC_EXIT__;
+       return STC_ERROR_NONE;
+}
+
+stc_error_e stc_plugin_procfs_status_changed(stc_cmd_type_e cmd, pid_t pid,
+                                            const gchar *app_id,
+                                            const gchar *pkg_id,
+                                            stc_app_type_e app_type)
 {
        stc_error_e ret = STC_ERROR_NONE;
 
@@ -670,6 +723,8 @@ API stc_plugin_procfs_s stc_plugin_procfs = {
                stc_plugin_procfs_initialize,
        .deinitialize_plugin =
                stc_plugin_procfs_deinitialize,
+       .procfs_load =
+               stc_plugin_procfs_load,
        .procfs_status_changed =
                stc_plugin_procfs_status_changed
 };