Refactoring structures for monitoring and restrictions
[platform/core/connectivity/stc-manager.git] / plugin / procfs / stc-plugin-procfs.c
old mode 100644 (file)
new mode 100755 (executable)
index 82b301c..f04446b
@@ -29,6 +29,7 @@
 
 #include "stc-plugin-procfs.h"
 #include "stc-monitor.h"
+#include "helper-net-cls.h"
 #include "helper-procfs.h"
 
 //LCOV_EXCL_START
@@ -109,7 +110,7 @@ static gboolean __proc_tree_foreach_print(gpointer key, gpointer value,
        proc_key_s *proc_key = (proc_key_s *)key;
        proc_value_s *proc_value = (proc_value_s *)value;
 
-       STC_LOGD("Proc pid [\033[1;33m%d\033[0;m] ppid [\033[1;35m%s\033[0;m] "
+       STC_LOGD("Proc pid [\033[1;33m%d\033[0;m] ppid [%s] "
                "cmdline [\033[0;34m%s\033[0;m]", proc_key->pid,
                proc_value->status[PROC_STATUS_PPID], proc_value->cmdline);
 
@@ -137,8 +138,8 @@ static proc_value_s * __proc_tree_find_parent(proc_value_s *value)
 
        if (STC_DEBUG_LOG) {
                if (parent != NULL)
-                       STC_LOGD("\033[0;35mPARENT\033[0;m: 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]",
+                       STC_LOGD("\033[0;35mPARENT\033[0;m: tgid[\033[1;33m%s\033[0;m] "
+                               "pid[%s] ppid[%s] cmdline[\033[0;34m%s\033[0;m] name[%s]",
                                parent->status[PROC_STATUS_TGID], parent->status[PROC_STATUS_PID],
                                parent->status[PROC_STATUS_PPID], parent->cmdline,
                                parent->status[PROC_STATUS_NAME]);
@@ -198,15 +199,16 @@ static void __proc_tree_add(proc_key_s *key, proc_value_s *value)
                        proc_value->cmdline, proc_value->cmdline, STC_APP_TYPE_SERVICE);
 }
 
-static void __proc_tree_remove(const proc_key_s *key)
+static void __proc_tree_remove(const proc_key_s *key,
+                                               const proc_value_s *value)
 {
        if (proc_tree == NULL) {
                STC_LOGE("tree is null");
                return;
        }
 
-       stc_plugin_procfs_status_changed(STC_CMD_SET_TERMINATED, key->pid, NULL,
-                                      NULL, STC_APP_TYPE_NONE);
+       stc_plugin_procfs_status_changed(STC_CMD_SET_TERMINATED, key->pid,
+                       value->cmdline, value->cmdline, STC_APP_TYPE_NONE);
 
        g_tree_remove(proc_tree, key);
 
@@ -321,8 +323,9 @@ static void __process_event_fork(int tgid, int pid)
                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] "
-                               "cmdline[\033[0;34m%s\033[0;m] pid[%d]", tgid, status[PROC_STATUS_PPID], cmdline, pid);
+                       STC_LOGD("\033[1;32mFORK\033[0;m: tgid[\033[1;33m%d\033[0;m] "
+                       "ppid=[%s] cmdline[\033[0;34m%s\033[0;m] pid[%d]",
+                       tgid, status[PROC_STATUS_PPID], cmdline, pid);
 
                __proc_tree_add(&key, &value);
        }
@@ -362,8 +365,9 @@ static void __process_event_exec(int tgid, int pid)
                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] "
-                               "cmdline[\033[0;34m%s\033[0;m] pid[%d]", tgid, status[PROC_STATUS_PPID], cmdline, pid);
+                       STC_LOGD("\033[1;32mEXEC\033[0;m: tgid[\033[1;33m%d\033[0;m] "
+                       "ppid[%s] cmdline[\033[0;34m%s\033[0;m] pid[%d]",
+                       tgid, status[PROC_STATUS_PPID], cmdline, pid);
 
                __proc_tree_add(&key, &value);
        }
@@ -384,9 +388,10 @@ static void __process_event_exit(int tgid, int pid, int exit_code)
 
        if (STC_DEBUG_LOG)
                STC_LOGD("\033[1;31mEXIT\033[0;m: tgid[\033[1;33m%d\033[0;m] "
-                       "pid[%d] exitcode[\033[0;31m%d\033[0;m]", tgid, pid, exit_code);
+                       "cmdline[\033[0;34m%s\033[0;m] pid[%d] exitcode[%d]",
+                       tgid, lookup->cmdline, pid, exit_code);
 
-       __proc_tree_remove(&key);
+       __proc_tree_remove(&key, lookup);
 }
 
 static gboolean __process_nl_connector_message(GIOChannel *source,
@@ -433,7 +438,7 @@ static gboolean __process_nl_connector_message(GIOChannel *source,
                                     msg.proc_ev.event_data.exit.exit_code);
                break;
        default:
-               ; /* Do nothing */
+               break;
        }
 
        return TRUE;
@@ -585,115 +590,119 @@ stc_error_e stc_plugin_procfs_load(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_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;
 
        if ((pkg_id && app_id) && STC_DEBUG_LOG)
-               STC_LOGD("cmd [%d] pkgid [%s] appid [%s] pid[%d] type [%d]",
+               STC_LOGD("cmd[%d] pkgid[%s] appid[%s] pid[%d] type[%d]",
                        cmd, pkg_id, app_id, pid, app_type);
 
        switch (cmd) {
        case STC_CMD_SET_FOREGRD:
        {
-               stc_app_key_s app_key;
+               uint32_t classid;
+               char *bg_app_id;
                stc_app_value_s app_value;
-               stc_process_key_s proc_key;
-               stc_process_value_s proc_value;
+               stc_proc_value_s proc_value;
 
-               memset(&app_key, 0, sizeof(stc_app_key_s));
                memset(&app_value, 0, sizeof(stc_app_value_s));
-               memset(&proc_key, 0, sizeof(stc_process_key_s));
-               memset(&proc_value, 0, sizeof(stc_process_value_s));
+               memset(&proc_value, 0, sizeof(stc_proc_value_s));
 
-               app_key.pkg_id = g_strdup(pkg_id);
-               app_key.app_id = g_strdup(app_id);
+               bg_app_id = g_strconcat(app_id, STC_BACKGROUND_APP_SUFFIX, NULL);
 
                app_value.type = app_type;
                app_value.processes = NULL;
 
-               proc_key.pid = pid;
-
+               proc_value.pid = pid;
                proc_value.ground = STC_APP_STATE_FOREGROUND;
 
-               stc_monitor_application_add(app_key, app_value);
-               stc_monitor_process_add(app_key, proc_key, proc_value);
-               stc_monitor_process_update_ground(app_key, proc_key,
-                                                 STC_APP_STATE_FOREGROUND);
+               classid = get_classid_by_app_id(bg_app_id, FALSE);
+               stc_monitor_proc_remove(classid, pid);
+
+               classid = get_classid_by_app_id(app_id, TRUE);
+
+               stc_monitor_app_add(classid, app_id, pkg_id, app_value);
+               stc_monitor_proc_add(classid, app_id, proc_value);
+               stc_monitor_proc_update_ground(classid, app_id, proc_value);
 
-               FREE(app_key.pkg_id);
-               FREE(app_key.app_id);
+               FREE(bg_app_id);
                break;
        }
        case STC_CMD_SET_BACKGRD:
        {
-               stc_app_key_s app_key;
+               uint32_t classid;
+               char *bg_app_id;
                stc_app_value_s app_value;
-               stc_process_key_s proc_key;
-               stc_process_value_s proc_value;
+               stc_proc_value_s proc_value;
 
-               memset(&app_key, 0, sizeof(stc_app_key_s));
                memset(&app_value, 0, sizeof(stc_app_value_s));
-               memset(&proc_key, 0, sizeof(stc_process_key_s));
-               memset(&proc_value, 0, sizeof(stc_process_value_s));
+               memset(&proc_value, 0, sizeof(stc_proc_value_s));
 
-               app_key.pkg_id = g_strdup(pkg_id);
-               app_key.app_id = g_strconcat(app_id, STC_BACKGROUND_APP_SUFFIX,
-                                            NULL);
+               bg_app_id = g_strconcat(app_id, STC_BACKGROUND_APP_SUFFIX, NULL);
 
                app_value.type = app_type;
                app_value.processes = NULL;
 
-               proc_key.pid = pid;
-
+               proc_value.pid = pid;
                proc_value.ground = STC_APP_STATE_BACKGROUND;
 
-               stc_monitor_application_add(app_key, app_value);
-               stc_monitor_process_add(app_key, proc_key, proc_value);
-               stc_monitor_process_update_ground(app_key, proc_key,
-                                                 STC_APP_STATE_BACKGROUND);
+               classid = get_classid_by_app_id(app_id, FALSE);
+               stc_monitor_proc_remove(classid, pid);
+
+               classid = get_classid_by_app_id(bg_app_id, TRUE);
+
+               stc_monitor_app_add(classid, bg_app_id, pkg_id, app_value);
+               stc_monitor_proc_add(classid, bg_app_id, proc_value);
+               stc_monitor_proc_update_ground(classid, bg_app_id, proc_value);
 
-               FREE(app_key.pkg_id);
-               FREE(app_key.app_id);
+               FREE(bg_app_id);
                break;
        }
        case STC_CMD_SET_SERVICE_LAUNCHED:
        {
-               stc_app_key_s app_key;
+               uint32_t classid;
+               char *bg_app_id;
                stc_app_value_s app_value;
-               stc_process_key_s proc_key;
-               stc_process_value_s proc_value;
+               stc_proc_value_s proc_value;
 
-               memset(&app_key, 0, sizeof(stc_app_key_s));
                memset(&app_value, 0, sizeof(stc_app_value_s));
-               memset(&proc_key, 0, sizeof(stc_process_key_s));
-               memset(&proc_value, 0, sizeof(stc_process_value_s));
+               memset(&proc_value, 0, sizeof(stc_proc_value_s));
 
-               app_key.pkg_id = g_strdup(pkg_id);
-               app_key.app_id = g_strconcat(app_id, STC_BACKGROUND_APP_SUFFIX,
-                                            NULL);
+               bg_app_id = g_strconcat(app_id, STC_BACKGROUND_APP_SUFFIX, NULL);
 
                app_value.type = app_type;
                app_value.processes = NULL;
 
-               proc_key.pid = pid;
-
-               /* services will run always in background. */
+               proc_value.pid = pid;
                proc_value.ground = STC_APP_STATE_BACKGROUND;
 
-               stc_monitor_application_add(app_key, app_value);
-               stc_monitor_process_add(app_key, proc_key, proc_value);
+               classid = get_classid_by_app_id(bg_app_id, TRUE);
+
+               stc_monitor_app_add(classid, bg_app_id, pkg_id, app_value);
+               stc_monitor_proc_add(classid, bg_app_id, proc_value);
 
-               FREE(app_key.pkg_id);
-               g_free(app_key.app_id);
+               FREE(bg_app_id);
                break;
        }
        case STC_CMD_SET_TERMINATED:
        {
-               stc_monitor_process_remove(pid);
+               uint32_t classid;
+               char *bg_app_id;
+
+               bg_app_id = g_strconcat(app_id, STC_BACKGROUND_APP_SUFFIX, NULL);
+               classid = get_classid_by_app_id(bg_app_id, FALSE);
+
+               if (classid == STC_UNKNOWN_CLASSID)
+                       classid = get_classid_by_app_id(app_id, FALSE);
+
+               stc_monitor_proc_remove(classid, pid);
+
+               FREE(bg_app_id);
                break;
        }
        default: