2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "stc-plugin-monitor.h"
18 #include "stc-plugin-monitor-proc.h"
19 #include "stc-plugin-monitor-connection.h"
20 #include "helper-net-cls.h"
22 static void __print_proc(gpointer key, gpointer value,
25 stc_proc_value_s *proc_value = (stc_proc_value_s *)value;
27 STC_LOGD("pid[\033[1;33m%d\033[0;m] ground[%d]",
28 proc_value->pid, proc_value->ground);
31 static void __print_proc_all(GHashTable *procs)
33 g_hash_table_foreach(procs, __print_proc, NULL);
36 static void __proc_remove_pid(gpointer key, gpointer value,
39 stc_app_value_s *app_value = (stc_app_value_s *)value;
40 remove_pid_context_s *context = (remove_pid_context_s *)data;
42 if (!g_hash_table_remove(app_value->processes, GUINT_TO_POINTER(context->pid)))
46 __print_proc_all(app_value->processes);
47 STC_LOGD("\033[1;31mProcess removed\033[0;m "
48 "[\033[1;33m%d\033[0;m]", context->pid);
51 context->entry_removed = TRUE;
52 context->app_value = app_value;
55 static void __proc_move_pid(gpointer key, gpointer value,
58 stc_proc_value_s *from_value = (stc_proc_value_s *)value;
59 stc_app_value_s *to_app_value = (stc_app_value_s *)data;
60 stc_proc_value_s *to_value;
62 to_value = MALLOC0(stc_proc_value_s, 1);
66 to_value->pid = from_value->pid;
67 to_value->ground = to_app_value->state;
69 g_hash_table_insert(to_app_value->processes,
70 GUINT_TO_POINTER(to_value->pid),
73 /* add pid to application cgroup */
74 place_pids_to_net_cgroup(to_value->pid, to_app_value->app_id);
77 API stc_error_e stc_plugin_monitor_proc_update_ground(uint32_t classid,
79 const stc_proc_value_s value)
81 stc_error_e ret = STC_ERROR_NONE;
82 stc_app_value_s *app_lookup;
83 stc_proc_value_s *proc_lookup;
84 GHashTable *apps = stc_monitor_get_system_apps();
87 return STC_ERROR_NO_DATA;
89 if (classid == STC_UNKNOWN_CLASSID)
90 classid = get_classid_by_app_id(app_id, TRUE);
92 app_lookup = g_hash_table_lookup(apps, GUINT_TO_POINTER(classid));
95 STC_LOGD("Application not found [\033[1;36m%d\033[0;m]", classid);
96 return STC_ERROR_NO_DATA;
99 proc_lookup = g_hash_table_lookup(app_lookup->processes,
100 GUINT_TO_POINTER(value.pid));
103 STC_LOGD("Process not found [\033[1;33m%d\033[0;m]", value.pid);
104 return STC_ERROR_NO_DATA;
107 if (proc_lookup->ground != value.ground)
108 proc_lookup->ground = value.ground;
110 place_pids_to_net_cgroup(value.pid, app_id);
115 API stc_error_e stc_plugin_monitor_proc_add(uint32_t classid,
117 const stc_proc_value_s value)
119 stc_error_e ret = STC_ERROR_NONE;
120 stc_app_value_s *app_lookup;
121 stc_proc_value_s *proc_lookup;
122 stc_proc_value_s *proc_value;
123 GHashTable *apps = stc_monitor_get_system_apps();
126 return STC_ERROR_NO_DATA;
128 if (classid == STC_UNKNOWN_CLASSID)
129 classid = get_classid_by_app_id(app_id, TRUE);
131 app_lookup = g_hash_table_lookup(apps, GUINT_TO_POINTER(classid));
134 STC_LOGD("Application not found [\033[1;36m%d\033[0;m]", classid);
135 return STC_ERROR_NO_DATA;
138 proc_lookup = g_hash_table_lookup(app_lookup->processes,
139 GUINT_TO_POINTER(value.pid));
142 STC_LOGE("Already exists [\033[1;36m%d\033[0;m]", value.pid);
143 return STC_ERROR_NONE;
146 proc_value = MALLOC0(stc_proc_value_s, 1);
149 STC_LOGE("Value allocation failed");
150 return STC_ERROR_OUT_OF_MEMORY;
153 proc_value->pid = value.pid;
154 proc_value->ground = value.ground;
156 g_hash_table_insert(app_lookup->processes,
157 GUINT_TO_POINTER(proc_value->pid),
160 /* add pid to application cgroup */
161 place_pids_to_net_cgroup(proc_value->pid, app_id);
164 __print_proc_all(app_lookup->processes);
165 STC_LOGD("\033[1;32mProcess added\033[0;m "
166 "[\033[1;33m%d\033[0;m]", proc_value->pid);
172 API stc_error_e stc_plugin_monitor_proc_remove(uint32_t classid, pid_t pid)
174 stc_error_e ret = STC_ERROR_NONE;
175 stc_app_value_s *app_lookup = NULL;
177 GHashTable *apps = stc_monitor_get_system_apps();
178 GSList *conn_list = stc_get_connection_list();
179 remove_pid_context_s context = {
182 .entry_removed = FALSE,
186 return STC_ERROR_NO_DATA;
188 if (classid == STC_UNKNOWN_CLASSID) {
189 g_hash_table_foreach(apps, __proc_remove_pid, &context);
191 if (context.entry_removed)
192 app_lookup = context.app_value;
196 STC_LOGD("Process not found [\033[1;33m%d\033[0;m]", pid);
197 return STC_ERROR_NO_DATA;
200 app_lookup = g_hash_table_lookup(apps, GUINT_TO_POINTER(classid));
203 STC_LOGD("Application not found [\033[1;36m%d\033[0;m]",
205 return STC_ERROR_NO_DATA;
208 if (g_hash_table_remove(app_lookup->processes, GUINT_TO_POINTER(pid))) {
210 __print_proc_all(app_lookup->processes);
211 STC_LOGD("\033[1;31mProcess removed\033[0;m "
212 "[\033[1;33m%d\033[0;m]", pid);
215 STC_LOGD("Process not found [\033[1;33m%d\033[0;m]", pid);
219 pid_count = g_hash_table_size(app_lookup->processes);
222 for (; conn_list != NULL; conn_list = conn_list->next) {
223 stc_connection_s *conn = conn_list->data;
224 /* remove nfacct rule for this classid */
225 stc_monitor_app_remove_monitor(GUINT_TO_POINTER(classid),
228 if (app_lookup->state == STC_APP_STATE_FOREGROUND)
229 stc_monitor_app_remove_accept(GUINT_TO_POINTER(classid),
233 stc_monitor_rstn_remove_for_app(classid);
235 g_hash_table_remove(apps, GUINT_TO_POINTER(classid));
238 STC_LOGD("\033[1;31mApplication removed\033[0;m "
239 "[\033[1;36m%d\033[0;m]", classid);
245 API stc_error_e stc_plugin_monitor_proc_move(uint32_t from, uint32_t to)
247 stc_error_e ret = STC_ERROR_NONE;
248 stc_app_value_s *from_lookup = NULL;
249 stc_app_value_s *to_lookup = NULL;
250 GSList *conn_list = stc_get_connection_list();
251 GHashTable *apps = stc_monitor_get_system_apps();
254 return STC_ERROR_NO_DATA;
256 if (from != STC_UNKNOWN_CLASSID &&
257 to != STC_UNKNOWN_CLASSID) {
258 from_lookup = g_hash_table_lookup(apps, GUINT_TO_POINTER(from));
261 STC_LOGD("Application not found [\033[1;36m%d\033[0;m]", from);
262 return STC_ERROR_NO_DATA;
265 to_lookup = g_hash_table_lookup(apps, GUINT_TO_POINTER(to));
268 STC_LOGD("Application not found [\033[1;36m%d\033[0;m]", to);
269 return STC_ERROR_NO_DATA;
272 g_hash_table_foreach(from_lookup->processes,
273 __proc_move_pid, to_lookup);
276 __print_proc_all(to_lookup->processes);
277 STC_LOGD("\033[1;34mProcesses moved\033[0;m "
278 "[\033[1;36m%d\033[0;m] -> [\033[1;36m%d\033[0;m]",
282 g_hash_table_remove_all(from_lookup->processes);
285 __print_proc_all(from_lookup->processes);
286 STC_LOGD("\033[1;31mProcesses removed\033[0;m "
287 "[\033[1;36m%d\033[0;m]", from);
290 for (; conn_list != NULL; conn_list = conn_list->next) {
291 stc_connection_s *conn = conn_list->data;
292 stc_monitor_app_remove_monitor(GUINT_TO_POINTER(from),
295 if (from_lookup->state == STC_APP_STATE_FOREGROUND)
296 stc_monitor_app_remove_accept(GUINT_TO_POINTER(from),
300 stc_monitor_rstn_remove_for_app(from);
302 g_hash_table_remove(apps, GUINT_TO_POINTER(from));
305 STC_LOGD("\033[1;31mApplication removed\033[0;m "
306 "[\033[1;36m%d\033[0;m]", from);