1514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher/* Shared library add-on to iptables to add comment match support.
2514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher *
3514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher * ChangeLog
4514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher *     2003-05-13: Brad Fisher <brad@info-link.net>
5514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher *         Initial comment match
6514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher *     2004-05-12: Brad Fisher <brad@info-link.net>
7514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher *         Port to patch-o-matic-ng
8514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher */
9514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher#include <stdio.h>
109ea637d5a7ebfb04e97db4cb114117474bbda9cfYasuyuki KOZAKAI#include <xtables.h>
119ea637d5a7ebfb04e97db4cb114117474bbda9cfYasuyuki KOZAKAI#include <linux/netfilter/xt_comment.h>
12514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher
13cc2511ee64df98e45d0b42a93a9b789b9726d4b9Jan Engelhardtenum {
14cc2511ee64df98e45d0b42a93a9b789b9726d4b9Jan Engelhardt	O_COMMENT = 0,
15cc2511ee64df98e45d0b42a93a9b789b9726d4b9Jan Engelhardt};
16cc2511ee64df98e45d0b42a93a9b789b9726d4b9Jan Engelhardt
17181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic void comment_help(void)
18514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher{
19514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher	printf(
208b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt		"comment match options:\n"
218b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt		"--comment COMMENT             Attach a comment to a rule\n");
22514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher}
23514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher
24cc2511ee64df98e45d0b42a93a9b789b9726d4b9Jan Engelhardtstatic const struct xt_option_entry comment_opts[] = {
25cc2511ee64df98e45d0b42a93a9b789b9726d4b9Jan Engelhardt	{.name = "comment", .id = O_COMMENT, .type = XTTYPE_STRING,
26cc2511ee64df98e45d0b42a93a9b789b9726d4b9Jan Engelhardt	 .flags = XTOPT_MAND | XTOPT_PUT,
27cc2511ee64df98e45d0b42a93a9b789b9726d4b9Jan Engelhardt	 XTOPT_POINTER(struct xt_comment_info, comment)},
28cc2511ee64df98e45d0b42a93a9b789b9726d4b9Jan Engelhardt	XTOPT_TABLEEND,
29514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher};
30514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher
31514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisherstatic void
32181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtcomment_print(const void *ip, const struct xt_entry_match *match, int numeric)
33514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher{
3469f564e3890976461de0016cd81171ff8bfa8353Jan Engelhardt	struct xt_comment_info *commentinfo = (void *)match->data;
35514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher
369ea637d5a7ebfb04e97db4cb114117474bbda9cfYasuyuki KOZAKAI	commentinfo->comment[XT_MAX_COMMENT_LEN-1] = '\0';
3773866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" /* %s */", commentinfo->comment);
38514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher}
39514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher
40514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher/* Saves the union ipt_matchinfo in parsable form to stdout. */
41514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisherstatic void
42181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtcomment_save(const void *ip, const struct xt_entry_match *match)
43514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher{
4469f564e3890976461de0016cd81171ff8bfa8353Jan Engelhardt	struct xt_comment_info *commentinfo = (void *)match->data;
45514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher
469ea637d5a7ebfb04e97db4cb114117474bbda9cfYasuyuki KOZAKAI	commentinfo->comment[XT_MAX_COMMENT_LEN-1] = '\0';
4773866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" --comment");
484a1d810bb52aa5d5c450f7adcde5145d40261b54Jan Engelhardt	xtables_save_string(commentinfo->comment);
49514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher}
50514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher
51181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic struct xtables_match comment_match = {
52c5e85736c207f211d82d2878a5781f512327dfceJan Engelhardt	.family		= NFPROTO_UNSPEC,
539ea637d5a7ebfb04e97db4cb114117474bbda9cfYasuyuki KOZAKAI	.name		= "comment",
548b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt	.version	= XTABLES_VERSION,
559ea637d5a7ebfb04e97db4cb114117474bbda9cfYasuyuki KOZAKAI	.size		= XT_ALIGN(sizeof(struct xt_comment_info)),
569ea637d5a7ebfb04e97db4cb114117474bbda9cfYasuyuki KOZAKAI	.userspacesize	= XT_ALIGN(sizeof(struct xt_comment_info)),
57181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.help		= comment_help,
58181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.print 		= comment_print,
59181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.save 		= comment_save,
60cc2511ee64df98e45d0b42a93a9b789b9726d4b9Jan Engelhardt	.x6_parse	= xtables_option_parse,
61cc2511ee64df98e45d0b42a93a9b789b9726d4b9Jan Engelhardt	.x6_options	= comment_opts,
62514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher};
63514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher
64514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fishervoid _init(void)
65514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher{
66181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	xtables_register_match(&comment_match);
67514b1b488eaf07d66e209681f4f34246d7db2f60Brad Fisher}
68