[STYLE] Code style
[kernel/swap-modules.git] / parser / us_inst.c
1 /*
2  *  SWAP Parser
3  *  modules/parser/us_inst.c
4  *
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.
9  *
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.
14  *
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.
18  *
19  * Copyright (C) Samsung Electronics, 2013
20  *
21  * 2013  Vyacheslav Cherkashin: SWAP Parser implement
22  *
23  */
24
25
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"
32 #include "us_inst.h"
33
34 /* FIXME: create get_dentry() and put_dentry() */
35 static struct dentry *dentry_by_path(const char *path)
36 {
37         struct dentry *dentry;
38 #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38)
39         struct path st_path;
40         if (kern_path(path, LOOKUP_FOLLOW, &st_path) != 0) {
41 #else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
42         struct nameidata nd;
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);
46                 return NULL;
47         }
48
49 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 25)
50         dentry = nd.dentry;
51         path_release(&nd);
52 #elif LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 38)
53         dentry = nd.path.dentry;
54         path_put(&nd.path);
55 #else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */
56         dentry = st_path.dentry;
57         path_put(&st_path);
58 #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 25) */
59         return dentry;
60 }
61
62
63 static int mod_func_inst(struct func_inst_data *func, struct pf_group *pfg,
64                          struct dentry *dentry, enum MOD_TYPE mt)
65 {
66         int ret;
67
68         switch (mt) {
69         case MT_ADD:
70                 ret = pf_register_probe(pfg, dentry, func->addr, func->args);
71                 break;
72         case MT_DEL:
73                 ret = pf_unregister_probe(pfg, dentry, func->addr);
74                 break;
75         default:
76                 printk("ERROR: mod_type=0x%x\n", mt);
77                 ret = -EINVAL;
78         }
79
80         return ret;
81 }
82
83 static int mod_lib_inst(struct lib_inst_data *lib, struct pf_group *pfg,
84                         enum MOD_TYPE mt)
85 {
86         int ret = 0, i;
87         struct dentry *dentry;
88
89         dentry = dentry_by_path(lib->path);
90         if (dentry == NULL) {
91                 printk("Cannot get dentry by path %s\n", lib->path);
92                 return -EINVAL;
93         }
94
95         for (i = 0; i < lib->cnt_func; ++i) {
96                 ret = mod_func_inst(lib->func[i], pfg, dentry, mt);
97                 if (ret) {
98                         printk("Cannot mod func inst, ret = %d\n", ret);
99                         return ret;
100                 }
101         }
102
103         return ret;
104 }
105
106 static int get_pfg_by_app_info(struct app_info_data *app_info, struct pf_group **pfg)
107 {
108         struct dentry *dentry;
109
110         dentry = dentry_by_path(app_info->exec_path);
111         if (dentry == NULL)
112                 return -EINVAL;
113
114         switch (app_info->app_type) {
115         case AT_PID:
116                 *pfg = get_pf_group_by_tgid(app_info->tgid, dentry);
117                 break;
118         case AT_TIZEN_NATIVE_APP:
119         case AT_COMMON_EXEC:
120                 *pfg = get_pf_group_by_dentry(dentry, dentry);
121                 break;
122         default:
123                 printk("ERROR: app_type=%0x%x\n", app_info->app_type);
124                 return -EINVAL;
125         }
126
127         return 0;
128 }
129
130 static int mod_us_app_inst(struct app_inst_data *app_inst, enum MOD_TYPE mt)
131 {
132         int ret, i;
133         struct pf_group *pfg;
134         struct dentry *dentry;
135
136         ret = get_pfg_by_app_info(app_inst->app_info, &pfg);
137         if (ret) {
138                 printk("Cannot get pfg by app info, ret = %d\n", ret);
139                 return ret;
140         }
141
142         for (i = 0; i < app_inst->cnt_func; ++i) {
143                 /* TODO: */
144                 dentry = dentry_by_path(app_inst->app_info->exec_path);
145                 if (dentry == NULL) {
146                         printk("Cannot find dentry by path %s\n",
147                                app_inst->app_info->exec_path);
148                         return -EINVAL;
149                 }
150
151                 ret = mod_func_inst(app_inst->func[i], pfg, dentry, mt);
152                 if (ret) {
153                         printk("Cannot mod func inst, ret = \n", ret);
154                         return ret;
155                 }
156         }
157
158         for (i = 0; i < app_inst->cnt_lib; ++i) {
159                 ret = mod_lib_inst(app_inst->lib[i], pfg, mt);
160                 if (ret) {
161                         printk("Cannot mod lib inst, ret = %d\n", ret);
162                         return ret;
163                 }
164         }
165
166         return 0;
167 }
168
169 int mod_us_inst(struct us_inst_data *us_inst, enum MOD_TYPE mt)
170 {
171         u32 i;
172         int ret;
173
174         for (i = 0; i < us_inst->cnt; ++i) {
175                 ret = mod_us_app_inst(us_inst->app_inst[i], mt);
176                 if (ret) {
177                         printk("Cannot mod us app inst, ret = %d\n", ret);
178                         return ret;
179                 }
180         }
181
182         return 0;
183 }