blob: 2e665b12ec2797ab5d3dc10822c393f4b1569773 [file] [log] [blame]
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +00001/* Shared library add-on to iptables to add comment match support.
2 *
3 * ChangeLog
4 * 2003-05-13: Brad Fisher <brad@info-link.net>
5 * Initial comment match
6 * 2004-05-12: Brad Fisher <brad@info-link.net>
7 * Port to patch-o-matic-ng
8 */
9#include <stdio.h>
10#include <string.h>
11#include <stdlib.h>
12#include <getopt.h>
13
14#include <xtables.h>
15#include <linux/netfilter/xt_comment.h>
16
Jan Engelhardt181dead2007-10-04 16:27:07 +000017static void comment_help(void)
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000018{
19 printf(
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020020 "comment match options:\n"
21 "--comment COMMENT Attach a comment to a rule\n");
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000022}
23
Jan Engelhardt181dead2007-10-04 16:27:07 +000024static const struct option comment_opts[] = {
Patrick McHardy500f4832007-09-08 15:59:04 +000025 { "comment", 1, NULL, '1' },
Max Kellermann9ee386a2008-01-29 13:48:05 +000026 { .name = NULL }
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000027};
28
29static void
30parse_comment(const char *s, struct xt_comment_info *info)
31{
32 int slen = strlen(s);
33
34 if (slen >= XT_MAX_COMMENT_LEN) {
Jan Engelhardt1829ed42009-02-21 03:29:44 +010035 xtables_error(PARAMETER_PROBLEM,
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000036 "COMMENT must be shorter than %i characters", XT_MAX_COMMENT_LEN);
37 }
38 strcpy((char *)info->comment, s);
39}
40
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000041static int
Jan Engelhardt181dead2007-10-04 16:27:07 +000042comment_parse(int c, char **argv, int invert, unsigned int *flags,
43 const void *entry, struct xt_entry_match **match)
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000044{
45 struct xt_comment_info *commentinfo = (struct xt_comment_info *)(*match)->data;
46
47 switch (c) {
48 case '1':
Jan Engelhardt0f16c722009-01-30 04:55:38 +010049 xtables_check_inverse(argv[optind-1], &invert, &optind, 0);
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000050 if (invert) {
Jan Engelhardt1829ed42009-02-21 03:29:44 +010051 xtables_error(PARAMETER_PROBLEM,
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000052 "Sorry, you can't have an inverted comment");
53 }
54 parse_comment(argv[optind-1], commentinfo);
55 *flags = 1;
56 break;
57
58 default:
59 return 0;
60 }
61 return 1;
62}
63
Jan Engelhardt181dead2007-10-04 16:27:07 +000064static void comment_check(unsigned int flags)
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000065{
66 if (!flags)
Jan Engelhardt1829ed42009-02-21 03:29:44 +010067 xtables_error(PARAMETER_PROBLEM,
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000068 "COMMENT match: You must specify `--comment'");
69}
70
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000071static void
Jan Engelhardt181dead2007-10-04 16:27:07 +000072comment_print(const void *ip, const struct xt_entry_match *match, int numeric)
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000073{
Jan Engelhardt69f564e2009-05-26 13:14:06 +020074 struct xt_comment_info *commentinfo = (void *)match->data;
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000075
76 commentinfo->comment[XT_MAX_COMMENT_LEN-1] = '\0';
77 printf("/* %s */ ", commentinfo->comment);
78}
79
80/* Saves the union ipt_matchinfo in parsable form to stdout. */
81static void
Jan Engelhardt181dead2007-10-04 16:27:07 +000082comment_save(const void *ip, const struct xt_entry_match *match)
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000083{
Jan Engelhardt69f564e2009-05-26 13:14:06 +020084 struct xt_comment_info *commentinfo = (void *)match->data;
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000085
86 commentinfo->comment[XT_MAX_COMMENT_LEN-1] = '\0';
Jan Engelhardt42115792009-03-19 11:57:10 +010087 printf("--comment ");
88 xtables_save_string((const char *)commentinfo->comment);
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000089}
90
Jan Engelhardt181dead2007-10-04 16:27:07 +000091static struct xtables_match comment_match = {
Jan Engelhardtc5e85732009-06-12 20:55:44 +020092 .family = NFPROTO_UNSPEC,
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000093 .name = "comment",
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020094 .version = XTABLES_VERSION,
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +000095 .size = XT_ALIGN(sizeof(struct xt_comment_info)),
96 .userspacesize = XT_ALIGN(sizeof(struct xt_comment_info)),
Jan Engelhardt181dead2007-10-04 16:27:07 +000097 .help = comment_help,
98 .parse = comment_parse,
99 .final_check = comment_check,
100 .print = comment_print,
101 .save = comment_save,
102 .extra_opts = comment_opts,
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +0000103};
104
105void _init(void)
106{
Jan Engelhardt181dead2007-10-04 16:27:07 +0000107 xtables_register_match(&comment_match);
Yasuyuki KOZAKAI9ea637d2007-07-24 07:21:17 +0000108}