3 * modules/parser/us_inst.c
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 * Copyright (C) Samsung Electronics, 2013
21 * 2013 Vyacheslav Cherkashin: SWAP Parser implement
26 #include <linux/module.h>
27 #include <linux/version.h>
28 #include <linux/errno.h>
29 #include <linux/namei.h>
30 #include <us_manager/pf/pf_group.h>
31 #include "msg_parser.h"
34 /* FIXME: create get_dentry() and put_dentry() */
35 static struct dentry *dentry_by_path(const char *path)
37 struct dentry *dentry;
38 #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38)
40 if (kern_path(path, LOOKUP_FOLLOW, &st_path) != 0) {
41 #else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
43 if (path_lookup(path, LOOKUP_FOLLOW, &nd) != 0) {
44 #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
45 printk("failed to lookup dentry for path %s!\n", path);
49 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 25)
52 #elif LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 38)
53 dentry = nd.path.dentry;
55 #else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
56 dentry = st_path.dentry;
58 #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 25) */
63 static int mod_func_inst(struct func_inst_data *func, struct pf_group *pfg,
64 struct dentry *dentry, enum MOD_TYPE mt)
70 ret = pf_register_probe(pfg, dentry, func->addr, func->args,
74 ret = pf_unregister_probe(pfg, dentry, func->addr);
77 printk("ERROR: mod_type=0x%x\n", mt);
84 static int mod_lib_inst(struct lib_inst_data *lib, struct pf_group *pfg,
88 struct dentry *dentry;
90 dentry = dentry_by_path(lib->path);
92 printk("Cannot get dentry by path %s\n", lib->path);
96 for (i = 0; i < lib->cnt_func; ++i) {
97 ret = mod_func_inst(lib->func[i], pfg, dentry, mt);
99 printk("Cannot mod func inst, ret = %d\n", ret);
107 static int get_pfg_by_app_info(struct app_info_data *app_info, struct pf_group **pfg)
109 struct dentry *dentry;
111 dentry = dentry_by_path(app_info->exec_path);
115 switch (app_info->app_type) {
117 if (app_info->tgid == 0) {
118 if (app_info->exec_path[0] == '\0')
119 *pfg = get_pf_group_dumb(dentry);
123 *pfg = get_pf_group_by_tgid(app_info->tgid, dentry);
125 case AT_TIZEN_NATIVE_APP:
126 case AT_TIZEN_WEB_APP:
129 *pfg = get_pf_group_by_dentry(dentry, dentry);
132 printk("ERROR: app_type=0x%x\n", app_info->app_type);
139 static int mod_us_app_inst(struct app_inst_data *app_inst, enum MOD_TYPE mt)
142 struct pf_group *pfg;
143 struct dentry *dentry;
145 ret = get_pfg_by_app_info(app_inst->app_info, &pfg);
147 printk("Cannot get pfg by app info, ret = %d\n", ret);
151 for (i = 0; i < app_inst->cnt_func; ++i) {
153 dentry = dentry_by_path(app_inst->app_info->exec_path);
154 if (dentry == NULL) {
155 printk("Cannot find dentry by path %s\n",
156 app_inst->app_info->exec_path);
160 ret = mod_func_inst(app_inst->func[i], pfg, dentry, mt);
162 printk("Cannot mod func inst, ret = %d\n", ret);
167 for (i = 0; i < app_inst->cnt_lib; ++i) {
168 ret = mod_lib_inst(app_inst->lib[i], pfg, mt);
170 printk("Cannot mod lib inst, ret = %d\n", ret);
178 int mod_us_inst(struct us_inst_data *us_inst, enum MOD_TYPE mt)
183 for (i = 0; i < us_inst->cnt; ++i) {
184 ret = mod_us_app_inst(us_inst->app_inst[i], mt);
186 printk("Cannot mod us app inst, ret = %d\n", ret);