From 52eeaebf1daf663d79af2e379e2f83593adadc2f Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Tue, 13 Mar 2012 22:51:01 +0100 Subject: nfacct: add XML output support This patch allows you to make: nfacct get http-traffic xml to obtain the statistics in XML format. Signed-off-by: Pablo Neira Ayuso --- src/nfacct.c | 55 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/src/nfacct.c b/src/nfacct.c index 78569c7..a59366e 100644 --- a/src/nfacct.c +++ b/src/nfacct.c @@ -112,10 +112,13 @@ int main(int argc, char *argv[]) return ret < 0 ? EXIT_FAILURE : EXIT_SUCCESS; } +static bool xml_header = false; + static int nfacct_cb(const struct nlmsghdr *nlh, void *data) { struct nfacct *nfacct; char buf[4096]; + bool *xml = (bool *)data; nfacct = nfacct_alloc(); if (nfacct == NULL) { @@ -128,7 +131,16 @@ static int nfacct_cb(const struct nlmsghdr *nlh, void *data) goto err_free; } - nfacct_snprintf(buf, sizeof(buf), nfacct, NFACCT_SNPRINTF_F_FULL); + if (*xml && !xml_header) { + printf("\n" + "\n"); + xml_header = true; + } + + nfacct_snprintf(buf, sizeof(buf), nfacct, + *xml ? NFACCT_SNPRINTF_T_XML : + NFACCT_SNPRINTF_T_PLAIN, + NFACCT_SNPRINTF_F_FULL); printf("%s\n", buf); err_free: @@ -139,23 +151,22 @@ err: static int nfacct_cmd_list(int argc, char *argv[]) { - bool zeroctr = false; + bool zeroctr = false, xml = false; struct mnl_socket *nl; char buf[MNL_SOCKET_BUFFER_SIZE]; struct nlmsghdr *nlh; unsigned int seq, portid; - int ret; + int ret, i; - if (argc == 3) { - if (strncmp(argv[2], "reset", strlen(argv[2])) == 0) { + for (i=2; i 3) { - nfacct_perror("too many arguments"); - return -1; } seq = time(NULL); @@ -183,7 +194,7 @@ static int nfacct_cmd_list(int argc, char *argv[]) ret = mnl_socket_recvfrom(nl, buf, sizeof(buf)); while (ret > 0) { - ret = mnl_cb_run(buf, ret, seq, portid, nfacct_cb, NULL); + ret = mnl_cb_run(buf, ret, seq, portid, nfacct_cb, &xml); if (ret <= 0) break; ret = mnl_socket_recvfrom(nl, buf, sizeof(buf)); @@ -194,6 +205,9 @@ static int nfacct_cmd_list(int argc, char *argv[]) } mnl_socket_close(nl); + if (xml_header) + printf("\n"); + return 0; } @@ -330,27 +344,27 @@ static int nfacct_cmd_delete(int argc, char *argv[]) static int nfacct_cmd_get(int argc, char *argv[]) { - bool zeroctr = false; + bool zeroctr = false, xml = false; struct mnl_socket *nl; char buf[MNL_SOCKET_BUFFER_SIZE]; struct nlmsghdr *nlh; uint32_t portid, seq; struct nfacct *nfacct; - int ret; + int ret, i; if (argc < 3) { nfacct_perror("missing object name"); return -1; - } else if (argc == 4) { - if (strncmp(argv[3], "reset", strlen(argv[3])) == 0) { + } + for (i=3; i 4) { - nfacct_perror("too many arguments"); - return -1; } nfacct = nfacct_alloc(); @@ -389,7 +403,7 @@ static int nfacct_cmd_get(int argc, char *argv[]) ret = mnl_socket_recvfrom(nl, buf, sizeof(buf)); while (ret > 0) { - ret = mnl_cb_run(buf, ret, seq, portid, nfacct_cb, NULL); + ret = mnl_cb_run(buf, ret, seq, portid, nfacct_cb, &xml); if (ret <= 0) break; ret = mnl_socket_recvfrom(nl, buf, sizeof(buf)); @@ -400,6 +414,9 @@ static int nfacct_cmd_get(int argc, char *argv[]) } mnl_socket_close(nl); + if (xml_header) + printf("\n"); + return 0; } -- cgit v1.2.3