From 9064374e7758bc4fa167d1c30ccc751ea588f5db Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Sun, 22 Jan 2012 19:41:07 +0100 Subject: expect: add XML support for nfexp_snprintf() Example of the XML output: 192.168.0.2 192.168.1.2 255.255.255.255 255.255.255.255 192.168.0.2 192.168.1.2 0 41739 0 65535 36390 21 ftp 300 0 Signed-off-by: Pablo Neira Ayuso --- src/expect/snprintf_xml.c | 269 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 src/expect/snprintf_xml.c (limited to 'src/expect/snprintf_xml.c') diff --git a/src/expect/snprintf_xml.c b/src/expect/snprintf_xml.c new file mode 100644 index 0000000..9f11c59 --- /dev/null +++ b/src/expect/snprintf_xml.c @@ -0,0 +1,269 @@ +/* + * (C) 2005-2011 by Pablo Neira Ayuso + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include "internal/internal.h" + +/* + * XML output sample: + * + * + * + * + * 192.168.0.2 + * 192.168.1.2 + * + * + * 255.255.255.255 + * 255.255.255.255 + * + * + * 192.168.0.2 + * 192.168.1.2 + * + * + * + * + * 0 + * 41739 + * + * + * 0 + * 65535 + * + * + * 36390 + * 21 + * + * + * + * ftp + * 300 + * 0 + * + * + */ + +static int +snprintf_expect_meta_xml(char *buf, size_t len, + const struct nf_expect *exp, unsigned int flags) +{ + int ret; + unsigned int size = 0, offset = 0; + + ret = snprintf(buf, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + if (test_bit(ATTR_EXP_HELPER_NAME, exp->set)) { + ret = snprintf(buf+offset, len, + "%s", + exp->helper_name); + BUFFER_SIZE(ret, size, len, offset); + } + if (test_bit(ATTR_EXP_TIMEOUT, exp->set)) { + ret = snprintf(buf+offset, len, "%u", + exp->timeout); + BUFFER_SIZE(ret, size, len, offset); + } + if (test_bit(ATTR_EXP_ZONE, exp->set)) { + ret = snprintf(buf+offset, len, "%u", exp->zone); + BUFFER_SIZE(ret, size, len, offset); + } + if (flags & NFCT_OF_TIME) { + time_t t; + struct tm tm; + + t = time(NULL); + if (localtime_r(&t, &tm) == NULL) + goto err_out; + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + ret = __snprintf_localtime_xml(buf+offset, len, &tm); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + } +err_out: + if (exp->flags & NF_CT_EXPECT_PERMANENT) { + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + } + if (exp->flags & NF_CT_EXPECT_INACTIVE) { + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + } + if (exp->flags & NF_CT_EXPECT_USERSPACE) { + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + } + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + return size; +} + +static int +snprintf_expect_layer3_xml(char *buf, size_t len, const struct nf_expect *exp) +{ + int ret; + unsigned int size = 0, offset = 0; + + ret = snprintf(buf+offset, len, + "", + exp->expected.orig.l3protonum, + __l3proto2str(exp->expected.orig.l3protonum)); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + ret = __snprintf_addr_xml(buf+offset, len, &exp->expected.orig, + __ADDR_SRC); + BUFFER_SIZE(ret, size, len, offset); + + ret = __snprintf_addr_xml(buf+offset, len, &exp->expected.orig, + __ADDR_DST); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + ret = __snprintf_addr_xml(buf+offset, len, &exp->mask.orig, + __ADDR_SRC); + BUFFER_SIZE(ret, size, len, offset); + + ret = __snprintf_addr_xml(buf+offset, len, &exp->mask.orig, + __ADDR_DST); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + ret = __snprintf_addr_xml(buf+offset, len, &exp->master.orig, + __ADDR_SRC); + BUFFER_SIZE(ret, size, len, offset); + + ret = __snprintf_addr_xml(buf+offset, len, &exp->master.orig, + __ADDR_DST); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + return size; +} + +static int +snprintf_expect_layer4_xml(char *buf, size_t len, const struct nf_expect *exp) +{ + int ret; + unsigned int size = 0, offset = 0; + + ret = snprintf(buf+offset, len, + "", + exp->expected.orig.protonum, + __proto2str(exp->expected.orig.protonum)); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + ret = __snprintf_proto_xml(buf+offset, len, &exp->expected.orig, + __ADDR_SRC); + BUFFER_SIZE(ret, size, len, offset); + + ret = __snprintf_proto_xml(buf+offset, len, &exp->expected.orig, + __ADDR_DST); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + ret = __snprintf_proto_xml(buf+offset, len, &exp->mask.orig, + __ADDR_SRC); + BUFFER_SIZE(ret, size, len, offset); + + ret = __snprintf_proto_xml(buf+offset, len, &exp->mask.orig, + __ADDR_DST); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + ret = __snprintf_proto_xml(buf+offset, len, &exp->master.orig, + __ADDR_SRC); + BUFFER_SIZE(ret, size, len, offset); + + ret = __snprintf_proto_xml(buf+offset, len, &exp->master.orig, + __ADDR_DST); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset) + + return size; +} + +int __snprintf_expect_xml(char *buf, unsigned int len, + const struct nf_expect *exp, + unsigned int msg_type, unsigned int flags) +{ + int ret = 0, size = 0, offset = 0; + + switch(msg_type) { + case NFCT_T_NEW: + ret = snprintf(buf, len, ""); + break; + case NFCT_T_UPDATE: + ret = snprintf(buf, len, ""); + break; + case NFCT_T_DESTROY: + ret = snprintf(buf, len, ""); + break; + default: + ret = snprintf(buf, len, ""); + break; + } + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf_expect_layer3_xml(buf+offset, len, exp); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf_expect_layer4_xml(buf+offset, len, exp); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf_expect_meta_xml(buf+offset, len, exp, flags); + BUFFER_SIZE(ret, size, len, offset); + + ret = snprintf(buf+offset, len, ""); + BUFFER_SIZE(ret, size, len, offset); + + return size; +} -- cgit v1.2.3