condition: use unique symbol names and rewrite init function

Use an array of xt_match for the match vtable.
This commit is contained in:
Jan Engelhardt
2008-04-02 04:45:36 +02:00
parent 24dad368dd
commit 317a944fec

View File

@@ -73,8 +73,7 @@ static DECLARE_MUTEX(proc_lock);
static LIST_HEAD(conditions_list); static LIST_HEAD(conditions_list);
static struct proc_dir_entry *proc_net_condition = NULL; static struct proc_dir_entry *proc_net_condition = NULL;
static int static int condition_proc_read(char __user *buffer, char **start, off_t offset,
xt_condition_read_info(char __user *buffer, char **start, off_t offset,
int length, int *eof, void *data) int length, int *eof, void *data)
{ {
const struct condition_variable *var = data; const struct condition_variable *var = data;
@@ -87,9 +86,7 @@ xt_condition_read_info(char __user *buffer, char **start, off_t offset,
return 2; return 2;
} }
static int condition_proc_write(struct file *file, const char __user *buffer,
static int
xt_condition_write_info(struct file *file, const char __user *buffer,
unsigned long length, void *data) unsigned long length, void *data)
{ {
struct condition_variable *var = data; struct condition_variable *var = data;
@@ -196,8 +193,8 @@ condition_mt_check(const char *tablename, const void *entry,
newvar->status_proc->owner = THIS_MODULE; newvar->status_proc->owner = THIS_MODULE;
newvar->status_proc->data = newvar; newvar->status_proc->data = newvar;
wmb(); wmb();
newvar->status_proc->read_proc = xt_condition_read_info; newvar->status_proc->read_proc = condition_proc_read;
newvar->status_proc->write_proc = xt_condition_write_info; newvar->status_proc->write_proc = condition_proc_write;
list_add_rcu(&newvar->list, &conditions_list); list_add_rcu(&newvar->list, &conditions_list);
@@ -238,64 +235,53 @@ static void condition_mt_destroy(const struct xt_match *match, void *matchinfo)
up(&proc_lock); up(&proc_lock);
} }
static struct xt_match condition_match = { static struct xt_match condition_mt_reg[] __read_mostly = {
{
.name = "condition", .name = "condition",
.revision = 0,
.family = PF_INET, .family = PF_INET,
.matchsize = XT_ALIGN(sizeof(struct xt_condition_mtinfo)), .matchsize = XT_ALIGN(sizeof(struct xt_condition_mtinfo)),
.match = condition_mt, .match = condition_mt,
.checkentry = condition_mt_check, .checkentry = condition_mt_check,
.destroy = condition_mt_destroy, .destroy = condition_mt_destroy,
.me = THIS_MODULE .me = THIS_MODULE,
}; },
{
static struct xt_match condition6_match = {
.name = "condition", .name = "condition",
.revision = 0,
.family = PF_INET6, .family = PF_INET6,
.matchsize = XT_ALIGN(sizeof(struct xt_condition_mtinfo)), .matchsize = XT_ALIGN(sizeof(struct xt_condition_mtinfo)),
.match = condition_mt, .match = condition_mt,
.checkentry = condition_mt_check, .checkentry = condition_mt_check,
.destroy = condition_mt_destroy, .destroy = condition_mt_destroy,
.me = THIS_MODULE .me = THIS_MODULE,
},
}; };
static const char *const dir_name = "nf_condition"; static const char *const dir_name = "nf_condition";
static int __init static int __init condition_mt_init(void)
init(void)
{ {
int errorcode; int ret;
proc_net_condition = proc_mkdir(dir_name, proc_net); proc_net_condition = proc_mkdir(dir_name, proc_net);
if (proc_net_condition == NULL) { if (proc_net_condition == NULL)
remove_proc_entry(dir_name, proc_net);
return -EACCES; return -EACCES;
}
errorcode = xt_register_match(&condition_match); ret = xt_register_matches(condition_mt_reg, ARRAY_SIZE(condition_mt_reg));
if (errorcode) { if (ret < 0) {
xt_unregister_match(&condition_match);
remove_proc_entry(dir_name, proc_net); remove_proc_entry(dir_name, proc_net);
return errorcode; return ret;
}
errorcode = xt_register_match(&condition6_match);
if (errorcode) {
xt_unregister_match(&condition6_match);
xt_unregister_match(&condition_match);
remove_proc_entry(dir_name, proc_net);
return errorcode;
} }
return 0; return 0;
} }
static void __exit static void __exit condition_mt_exit(void)
fini(void)
{ {
xt_unregister_match(&condition6_match); xt_unregister_matches(condition_mt_reg, ARRAY_SIZE(condition_mt_reg));
xt_unregister_match(&condition_match);
remove_proc_entry(dir_name, proc_net); remove_proc_entry(dir_name, proc_net);
} }
module_init(init); module_init(condition_mt_init);
module_exit(fini); module_exit(condition_mt_exit);