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-monitor.h"
18 #include "stc-monitor-proc.h"
19 #include "stc-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_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_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_monitor_proc_remove(uint32_t classid,
175 stc_error_e ret = STC_ERROR_NONE;
176 stc_app_value_s *app_lookup = NULL;
178 GHashTable *apps = stc_monitor_get_system_apps();
179 GSList *conn_list = stc_get_connection_list();
180 remove_pid_context_s context = {
183 .entry_removed = FALSE,
187 return STC_ERROR_NO_DATA;
189 if (classid == STC_UNKNOWN_CLASSID) {
190 g_hash_table_foreach(apps, __proc_remove_pid, &context);
192 if (context.entry_removed)
193 app_lookup = context.app_value;
197 STC_LOGD("Process not found [\033[1;33m%d\033[0;m]", pid);
198 return STC_ERROR_NO_DATA;
201 app_lookup = g_hash_table_lookup(apps, GUINT_TO_POINTER(classid));
204 STC_LOGD("Application not found [\033[1;36m%d\033[0;m]",
206 return STC_ERROR_NO_DATA;
209 if (g_hash_table_remove(app_lookup->processes, GUINT_TO_POINTER(pid))) {
211 __print_proc_all(app_lookup->processes);
212 STC_LOGD("\033[1;31mProcess removed\033[0;m "
213 "[\033[1;33m%d\033[0;m]", pid);
216 STC_LOGD("Process not found [\033[1;33m%d\033[0;m]", pid);
220 pid_count = g_hash_table_size(app_lookup->processes);
223 for (; conn_list != NULL; conn_list = conn_list->next) {
224 stc_connection_s *conn = conn_list->data;
225 /* remove nfacct rule for this classid */
226 stc_monitor_app_remove_monitor(GUINT_TO_POINTER(classid),
229 if (app_lookup->state == STC_APP_STATE_FOREGROUND)
230 stc_monitor_app_remove_accept(GUINT_TO_POINTER(classid),
234 stc_monitor_rstn_remove_for_app(classid);
236 g_hash_table_remove(apps, GUINT_TO_POINTER(classid));
239 STC_LOGD("\033[1;31mApplication removed\033[0;m "
240 "[\033[1;36m%d\033[0;m]", classid);
246 API stc_error_e stc_monitor_proc_move(uint32_t from,
249 stc_error_e ret = STC_ERROR_NONE;
250 stc_app_value_s *from_lookup = NULL;
251 stc_app_value_s *to_lookup = NULL;
252 GSList *conn_list = stc_get_connection_list();
253 GHashTable *apps = stc_monitor_get_system_apps();
256 return STC_ERROR_NO_DATA;
258 if (from != STC_UNKNOWN_CLASSID &&
259 to != STC_UNKNOWN_CLASSID) {
260 from_lookup = g_hash_table_lookup(apps, GUINT_TO_POINTER(from));
263 STC_LOGD("Application not found [\033[1;36m%d\033[0;m]", from);
264 return STC_ERROR_NO_DATA;
267 to_lookup = g_hash_table_lookup(apps, GUINT_TO_POINTER(to));
270 STC_LOGD("Application not found [\033[1;36m%d\033[0;m]", to);
271 return STC_ERROR_NO_DATA;
274 g_hash_table_foreach(from_lookup->processes,
275 __proc_move_pid, to_lookup);
278 __print_proc_all(to_lookup->processes);
279 STC_LOGD("\033[1;34mProcesses moved\033[0;m "
280 "[\033[1;36m%d\033[0;m] -> [\033[1;36m%d\033[0;m]",
284 g_hash_table_remove_all(from_lookup->processes);
287 __print_proc_all(from_lookup->processes);
288 STC_LOGD("\033[1;31mProcesses removed\033[0;m "
289 "[\033[1;36m%d\033[0;m]", from);
292 for (; conn_list != NULL; conn_list = conn_list->next) {
293 stc_connection_s *conn = conn_list->data;
294 stc_monitor_app_remove_monitor(GUINT_TO_POINTER(from),
297 if (from_lookup->state == STC_APP_STATE_FOREGROUND)
298 stc_monitor_app_remove_accept(GUINT_TO_POINTER(from),
302 stc_monitor_rstn_remove_for_app(from);
304 g_hash_table_remove(apps, GUINT_TO_POINTER(from));
307 STC_LOGD("\033[1;31mApplication removed\033[0;m "
308 "[\033[1;36m%d\033[0;m]", from);