#include "stc-plugin-procfs.h"
#include "stc-monitor.h"
+#include "helper-net-cls.h"
#include "helper-procfs.h"
//LCOV_EXCL_START
static guint nl_connector_gsource_id = 0;
static GTree *proc_tree;
-
static gboolean __process_nl_connector_message(GIOChannel *source,
GIOCondition condition,
gpointer user_data);
return lookup;
}
+/*
static gboolean __proc_tree_foreach_print(gpointer key, gpointer value,
gpointer data)
{
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);
{
g_tree_foreach(proc_tree, __proc_tree_foreach_print, NULL);
}
+*/
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]);
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;
return;
}
- lookup = g_tree_lookup(proc_tree, key);
- if (lookup) {
+ if (key == NULL || value == NULL) {
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]);
+ STC_LOGE("invalid parameters");
return;
}
- if (STC_DEBUG_LOG)
- STC_LOGD("cmdline [%s] pid[%s] ppid[%s]", value->cmdline,
- value->status[PROC_STATUS_PID], value->status[PROC_STATUS_PPID]);
+ lookup = g_tree_lookup(proc_tree, key);
+ if (lookup)
+ return;
- g_tree_insert(proc_tree, key, value);
+ proc_key_s *proc_key = MALLOC0(proc_key_s, 1);
+ if (proc_key == NULL) {
+ STC_LOGE("memory allocation failed");
+ return;
+ }
- if (STC_DEBUG_LOG)
- __proc_tree_printall();
+ proc_value_s *proc_value = MALLOC0(proc_value_s, 1);
+ if (proc_value == NULL) {
+ STC_LOGE("memory allocation failed");
+ FREE(proc_key);
+ return;
+ }
- parent = __proc_tree_find_parent(value);
+ memcpy(proc_key, key, sizeof(proc_key_s));
+ memcpy(proc_value, value, sizeof(proc_value_s));
+
+ g_tree_insert(proc_tree, proc_key, proc_value);
+
+ /*
+ __proc_tree_printall();
+ */
+
+ 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)
+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);
- if (STC_DEBUG_LOG)
- __proc_tree_printall();
+ /*
+ __proc_tree_printall();
+ */
}
static gboolean __check_excn(char *cmdline)
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) &&
STC_ERROR_NONE == proc_get_status(pid, status)) {
- if (__check_excn(cmdline)) {
- if (STC_DEBUG_LOG)
- STC_LOGD("[%s] monitoring is excepted", cmdline);
+ if (__check_excn(cmdline))
return;
- }
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));
-
- 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("STATUS: tgid[%s] pid[%s] ppid[%s] name[%s] state[%s] tracerpid[%s]",
- status[PROC_STATUS_TGID], status[PROC_STATUS_PID], status[PROC_STATUS_PPID],
- status[PROC_STATUS_NAME], status[PROC_STATUS_STATE], status[PROC_STATUS_TRACERPID]);
- }
+ 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;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);
+ __proc_tree_add(&key, &value);
}
}
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) &&
STC_ERROR_NONE == proc_get_status(pid, status)) {
- if (__check_excn(cmdline)) {
- if (STC_DEBUG_LOG)
- STC_LOGD("[%s] monitoring is excepted", cmdline);
+ if (__check_excn(cmdline))
return;
- }
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));
-
- 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("STATUS: tgid[%s] pid[%s] ppid[%s] name[%s] state[%s] tracerpid[%s]",
- status[PROC_STATUS_TGID], status[PROC_STATUS_PID], status[PROC_STATUS_PPID],
- status[PROC_STATUS_NAME], status[PROC_STATUS_STATE], status[PROC_STATUS_TRACERPID]);
- }
+ g_strlcpy(value.status[i], status[i],
+ sizeof(value.status[i]));
+ g_strlcpy(value.cmdline, cmdline, sizeof(value.cmdline));
- __proc_tree_add(key, value);
+ if (STC_DEBUG_LOG)
+ 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);
}
}
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,
/* 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();
msg.proc_ev.event_data.exit.exit_code);
break;
default:
- ; /* Do nothing */
+ break;
}
return TRUE;
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__;
return STC_ERROR_NONE;
}
+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)
+ 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 fg_classid;
+ uint32_t bg_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.state = STC_APP_STATE_FOREGROUND;
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);
+ bg_classid = get_classid_by_app_id(bg_app_id, FALSE);
+ fg_classid = get_classid_by_app_id(app_id, TRUE);
+
+ stc_monitor_app_add(fg_classid, app_id, pkg_id, app_value);
- FREE(app_key.pkg_id);
- FREE(app_key.app_id);
+ stc_monitor_proc_move(bg_classid, fg_classid);
+
+ stc_monitor_proc_add(fg_classid, app_id, proc_value);
+ stc_monitor_proc_update_ground(fg_classid, app_id, proc_value);
+
+ FREE(bg_app_id);
break;
}
case STC_CMD_SET_BACKGRD:
{
- stc_app_key_s app_key;
+ uint32_t bg_classid;
+ uint32_t fg_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.state = STC_APP_STATE_BACKGROUND;
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);
+ fg_classid = get_classid_by_app_id(app_id, FALSE);
+ bg_classid = get_classid_by_app_id(bg_app_id, TRUE);
+
+ stc_monitor_app_add(bg_classid, bg_app_id, pkg_id, app_value);
+
+ stc_monitor_proc_move(fg_classid, bg_classid);
- FREE(app_key.pkg_id);
- FREE(app_key.app_id);
+ stc_monitor_proc_add(bg_classid, bg_app_id, proc_value);
+ stc_monitor_proc_update_ground(bg_classid, bg_app_id, proc_value);
+
+ 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;
+ gboolean is_exist;
- 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);
+ classid = get_classid_by_app_id(app_id, FALSE);
+ is_exist = stc_monitor_app_lookup(classid);
+ if (is_exist) {
+ app_value.type = app_type;
+ app_value.state = STC_APP_STATE_FOREGROUND;
+ app_value.processes = NULL;
- app_value.type = app_type;
- app_value.processes = NULL;
+ proc_value.pid = pid;
+ proc_value.ground = STC_APP_STATE_FOREGROUND;
- proc_key.pid = pid;
+ stc_monitor_app_add(classid, app_id, pkg_id, app_value);
+ stc_monitor_proc_add(classid, app_id, proc_value);
+ } else {
+ bg_app_id = g_strconcat(app_id, STC_BACKGROUND_APP_SUFFIX, NULL);
+ classid = get_classid_by_app_id(bg_app_id, TRUE);
- /* services will run always in background. */
- proc_value.ground = STC_APP_STATE_BACKGROUND;
+ app_value.type = app_type;
+ app_value.state = STC_APP_STATE_BACKGROUND;
+ app_value.processes = NULL;
+
+ 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_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:
stc_plugin_procfs_initialize,
.deinitialize_plugin =
stc_plugin_procfs_deinitialize,
+ .procfs_load =
+ stc_plugin_procfs_load,
.procfs_status_changed =
stc_plugin_procfs_status_changed
};