2 * writer/event_filter.c
3 * @author Vyacheslav Cherkashin <v.cherkashin@samsung.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 * Copyright (C) Samsung Electronics, 2013
25 * @section DESCRIPTION
31 #include <linux/module.h>
32 #include <linux/list.h>
33 #include "event_filter.h"
36 static LIST_HEAD(filter_list);
38 static int func_none(struct task_struct *task)
43 static struct ev_filter filter_none = {
48 static struct ev_filter *filter_current = &filter_none;
50 int check_event(struct task_struct *task)
52 return filter_current->filter(task);
54 EXPORT_SYMBOL_GPL(check_event);
56 static struct ev_filter *event_filter_find(const char *name)
58 struct ev_filter *f, *tmp;
60 list_for_each_entry_safe(f, tmp, &filter_list, list) {
61 if (strcmp(f->name, name) == 0)
69 * @brief Registers event filter.
71 * @param f Pointer to the event filter.
72 * @return 0 on success, error code on error.
74 int event_filter_register(struct ev_filter *f)
76 if (event_filter_find(f->name))
79 INIT_LIST_HEAD(&f->list);
80 list_add(&f->list, &filter_list);
84 EXPORT_SYMBOL_GPL(event_filter_register);
87 * @brief Unregisters event filter.
89 * @param f Pointer to the event filter.
92 void event_filter_unregister(struct ev_filter *f)
94 struct ev_filter *filter, *tmp;
96 if (filter_current == f)
97 filter_current = &filter_none;
99 list_for_each_entry_safe(filter, tmp, &filter_list, list) {
101 list_del(&filter->list);
106 EXPORT_SYMBOL_GPL(event_filter_unregister);
109 * @brief Sets event filter by its name.
111 * @param name Filter name.
112 * @return 0 on success, error code on error.
114 int event_filter_set(const char *name)
118 f = event_filter_find(name);
126 EXPORT_SYMBOL_GPL(event_filter_set);
129 * @brief Gets filter name.
131 * @return Pointer to the filter name string.
133 const char *event_filter_get(void)
135 return filter_current->name;
139 * @brief Runs specified callback for each filter in list.
141 * @param func Specified callback.
142 * @param data Pointer to the data passed to the callback.
145 void event_filter_on_each(void (*func)(struct ev_filter *, void *),
148 struct ev_filter *f, *tmp;
150 list_for_each_entry_safe(f, tmp, &filter_list, list)
155 * @brief Initializes event filter.
157 * @return Initialization result.
159 int event_filter_init(void)
161 return event_filter_register(&filter_none);
165 * @brief Uninitializes event filter.
169 void event_filter_exit(void)
171 event_filter_unregister(&filter_none);