Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 1 | #include <stdio.h> |
Yasuyuki KOZAKAI | f8137b1 | 2007-08-04 08:26:59 +0000 | [diff] [blame] | 2 | #include <xtables.h> |
| 3 | #include <linux/netfilter/xt_helper.h> |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 4 | |
Jan Engelhardt | 76e18ae | 2011-03-02 18:55:32 +0100 | [diff] [blame] | 5 | enum { |
| 6 | O_HELPER = 0, |
| 7 | }; |
| 8 | |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 9 | static void helper_help(void) |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 10 | { |
| 11 | printf( |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 12 | "helper match options:\n" |
| 13 | "[!] --helper string Match helper identified by string\n"); |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 14 | } |
| 15 | |
Jan Engelhardt | 76e18ae | 2011-03-02 18:55:32 +0100 | [diff] [blame] | 16 | static const struct xt_option_entry helper_opts[] = { |
| 17 | {.name = "helper", .id = O_HELPER, .type = XTTYPE_STRING, |
| 18 | .flags = XTOPT_MAND | XTOPT_INVERT | XTOPT_PUT, |
| 19 | XTOPT_POINTER(struct xt_helper_info, name)}, |
| 20 | XTOPT_TABLEEND, |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 21 | }; |
| 22 | |
Jan Engelhardt | 76e18ae | 2011-03-02 18:55:32 +0100 | [diff] [blame] | 23 | static void helper_parse(struct xt_option_call *cb) |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 24 | { |
Jan Engelhardt | 76e18ae | 2011-03-02 18:55:32 +0100 | [diff] [blame] | 25 | struct xt_helper_info *info = cb->data; |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 26 | |
Jan Engelhardt | 76e18ae | 2011-03-02 18:55:32 +0100 | [diff] [blame] | 27 | xtables_option_parse(cb); |
| 28 | if (cb->invert) |
| 29 | info->invert = 1; |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 30 | } |
| 31 | |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 32 | static void |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 33 | helper_print(const void *ip, const struct xt_entry_match *match, int numeric) |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 34 | { |
Jan Engelhardt | 69f564e | 2009-05-26 13:14:06 +0200 | [diff] [blame] | 35 | const struct xt_helper_info *info = (const void *)match->data; |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 36 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 37 | printf(" helper match %s\"%s\"", info->invert ? "! " : "", info->name); |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 38 | } |
| 39 | |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 40 | static void helper_save(const void *ip, const struct xt_entry_match *match) |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 41 | { |
Jan Engelhardt | 69f564e | 2009-05-26 13:14:06 +0200 | [diff] [blame] | 42 | const struct xt_helper_info *info = (const void *)match->data; |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 43 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 44 | printf("%s --helper", info->invert ? " !" : ""); |
Jan Engelhardt | a0baae8 | 2009-01-30 04:32:50 +0100 | [diff] [blame] | 45 | xtables_save_string(info->name); |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 46 | } |
| 47 | |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 48 | static struct xtables_match helper_match = { |
Jan Engelhardt | c5e8573 | 2009-06-12 20:55:44 +0200 | [diff] [blame] | 49 | .family = NFPROTO_UNSPEC, |
Yasuyuki KOZAKAI | f8137b1 | 2007-08-04 08:26:59 +0000 | [diff] [blame] | 50 | .name = "helper", |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 51 | .version = XTABLES_VERSION, |
Yasuyuki KOZAKAI | f8137b1 | 2007-08-04 08:26:59 +0000 | [diff] [blame] | 52 | .size = XT_ALIGN(sizeof(struct xt_helper_info)), |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 53 | .help = helper_help, |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 54 | .print = helper_print, |
| 55 | .save = helper_save, |
Jan Engelhardt | 76e18ae | 2011-03-02 18:55:32 +0100 | [diff] [blame] | 56 | .x6_parse = helper_parse, |
| 57 | .x6_options = helper_opts, |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 58 | }; |
| 59 | |
| 60 | void _init(void) |
| 61 | { |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 62 | xtables_register_match(&helper_match); |
Martin Josefsson | 110610b | 2002-01-11 18:41:02 +0000 | [diff] [blame] | 63 | } |