return lookup;
}
+static proc_value_s * __proc_tree_find_parent(proc_value_s *value)
+{
+ proc_value_s *parent = NULL;
+ proc_value_s *lookup = value;
+
+ do {
+ proc_key_s key;
+ key.pid = atoi(lookup->status[PROC_STATUS_PPID]);
+ lookup = __proc_tree_lookup(&key);
+ if (lookup != NULL)
+ parent = lookup;
+ } while (lookup);
+
+ return parent;
+}
+
static void __proc_tree_add(proc_key_s *key,
proc_value_s *value)
{
+ proc_value_s *lookup;
+ proc_value_s *parent;
+
if (proc_tree == NULL) {
STC_LOGE("tree is null");
return;
}
+ lookup = g_tree_lookup(proc_tree, key);
+ if (lookup)
+ return;
+
g_tree_insert(proc_tree, key, value);
- stc_manager_app_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, key->pid,
- value->cmdline, value->cmdline,
- STC_APP_TYPE_SERVICE);
+ parent = __proc_tree_find_parent(value);
+ if (parent != NULL)
+ stc_manager_app_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, key->pid,
+ parent->cmdline, parent->cmdline, STC_APP_TYPE_SERVICE);
+ else
+ stc_manager_app_status_changed(STC_CMD_SET_SERVICE_LAUNCHED, key->pid,
+ value->cmdline, value->cmdline, STC_APP_TYPE_SERVICE);
}
static void __proc_tree_remove(const proc_key_s *key)
return ret;
}
-static void __process_event_exec(int tid, int pid)
+static void __process_event_fork(int tgid, int pid)
{
char cmdline[PROC_NAME_MAX] = {0, };
char status[PROC_STATUS_CNT][PROC_BUF_MAX];
if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) &&
STC_ERROR_NONE == proc_get_status(pid, status)) {
- if (__check_excn(cmdline)) {
- STC_LOGI("[%s] monitoring is excepted", cmdline);
+ if (__check_excn(cmdline))
return;
- }
unsigned int i;
proc_key_s *key;
return;
}
- key->pid = pid;
+ 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));
__proc_tree_add(key, value);
+ }
+}
- STC_LOGD("EXEC: pid[%d] tgid=[%d] cmdline[%s]", pid, tid, cmdline);
- STC_LOGD("STATUS: name[%s] state[%s] tgid[%s] pid[%s] ppid[%s] tracerpid[%s]",
- status[PROC_STATUS_NAME], status[PROC_STATUS_STATE], status[PROC_STATUS_TGID],
- status[PROC_STATUS_PID], status[PROC_STATUS_PPID], status[PROC_STATUS_TRACERPID]);
+static void __process_event_exec(int tgid, int pid)
+{
+ char cmdline[PROC_NAME_MAX] = {0, };
+ char status[PROC_STATUS_CNT][PROC_BUF_MAX];
+
+ if (STC_ERROR_NONE == proc_get_cmdline(pid, cmdline) &&
+ STC_ERROR_NONE == proc_get_status(pid, status)) {
+
+ 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;
+ }
+
+ value = MALLOC0(proc_value_s, 1);
+ if (value == NULL) {
+ STC_LOGE("memory allocation failed");
+ FREE(key);
+ return;
+ }
+
+ 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));
+
+ __proc_tree_add(key, value);
}
}
-static void __process_event_exit(int tid, int pid, int exit_code)
+static void __process_event_exit(int tgid, int pid, int exit_code)
{
proc_key_s key;
proc_value_s *lookup;
- key.pid = pid;
+ if (tgid != pid)
+ return;
+
+ key.pid = tgid;
lookup = __proc_tree_lookup(&key);
if (lookup == NULL) /* unmonitored process */
return;
__proc_tree_remove(&key);
-
- STC_LOGD("EXIT:pid=%d,%d ruid=%d,euid=%d", pid, tid, exit_code);
}
static gboolean __process_nl_connector_message(GIOChannel *source,
}
switch (msg.proc_ev.what) {
+ case PROC_EVENT_FORK:
+ __process_event_fork(msg.proc_ev.event_data.fork.child_tgid,
+ msg.proc_ev.event_data.fork.child_pid);
+ break;
case PROC_EVENT_EXEC:
- __process_event_exec(msg.proc_ev.event_data.exec.process_pid,
- msg.proc_ev.event_data.exec.process_tgid);
+ __process_event_exec(msg.proc_ev.event_data.exec.process_tgid,
+ msg.proc_ev.event_data.exec.process_pid);
break;
case PROC_EVENT_EXIT:
- __process_event_exit(msg.proc_ev.event_data.exit.process_pid,
- msg.proc_ev.event_data.exit.process_tgid,
+ __process_event_exit(msg.proc_ev.event_data.exit.process_tgid,
+ msg.proc_ev.event_data.exit.process_pid,
msg.proc_ev.event_data.exit.exit_code);
break;
default: