diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2012-03-26 21:39:29 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2012-03-27 11:26:33 +0200 |
commit | 9d5d2b85c2f37b0f734d6a1a4b3ea2e36ead6519 (patch) | |
tree | f5c46ac8e3b68a65f8e754a665ca03354fe92687 | |
parent | ad96d6dd747cfc45116e4e600a3d22079e18a657 (diff) |
nfacct: change prototype of nfacct_snprintf() to support output in XML
This patch adds supports for XML output for nfacct_snprintf().
This also bumps the library current version number and it adds
a new version in the symbol map. I decided to do so because,
although no official release has happened so far. Many distributors
have already decided to provide packages for this.
We don't provide the old symbol version for nfacct_snprintf,
I think that's too much (given the lifetime of it). But we make
sure that we break the binary gracefully in case of version
mismatches (not silently, with unexpectable side effects).
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r-- | Make_global.am | 2 | ||||
-rw-r--r-- | include/libnetfilter_acct/libnetfilter_acct.h | 5 | ||||
-rw-r--r-- | src/libnetfilter_acct.c | 43 | ||||
-rw-r--r-- | src/libnetfilter_acct.map | 10 |
4 files changed, 42 insertions, 18 deletions
diff --git a/Make_global.am b/Make_global.am index 1654f10..986b0fb 100644 --- a/Make_global.am +++ b/Make_global.am @@ -18,7 +18,7 @@ # set age to 0. # </snippet> # -LIBVERSION=0:0:0 +LIBVERSION=1:0:0 AM_CPPFLAGS = ${regular_CPPFLAGS} -I${top_srcdir}/include ${LIBMNL_CFLAGS} AM_CFLAGS = ${regular_CFLAGS} ${GCC_FVISIBILITY_HIDDEN} diff --git a/include/libnetfilter_acct/libnetfilter_acct.h b/include/libnetfilter_acct/libnetfilter_acct.h index d877407..a57b571 100644 --- a/include/libnetfilter_acct/libnetfilter_acct.h +++ b/include/libnetfilter_acct/libnetfilter_acct.h @@ -32,6 +32,9 @@ int nfacct_nlmsg_parse_payload(const struct nlmsghdr *nlh, struct nfacct *nfacct #define NFACCT_SNPRINTF_F_FULL (1 << 0) -int nfacct_snprintf(char *buf, size_t size, struct nfacct *nfacct, unsigned int flags); +#define NFACCT_SNPRINTF_T_PLAIN 0 +#define NFACCT_SNPRINTF_T_XML 1 + +int nfacct_snprintf(char *buf, size_t size, struct nfacct *nfacct, uint16_t type, uint16_t flags); #endif diff --git a/src/libnetfilter_acct.c b/src/libnetfilter_acct.c index 26e5dfa..a9b8721 100644 --- a/src/libnetfilter_acct.c +++ b/src/libnetfilter_acct.c @@ -232,27 +232,46 @@ EXPORT_SYMBOL(nfacct_attr_get_u64); * \param buf: pointer to buffer that is used to print the object * \param size: size of the buffer (or remaining room in it). * \param nfacct: pointer to a valid accounting object. + * \param type: format output type, NFACCT_SNPRINTF_T_[PLAIN|XML] * \param flags: output flags (NFACCT_SNPRINTF_F_FULL). * * This function returns -1 in case that some mandatory attributes are * missing. On sucess, it returns 0. */ int nfacct_snprintf(char *buf, size_t size, struct nfacct *nfacct, - unsigned int flags) + uint16_t type, uint16_t flags) { - int ret; + int ret = 0; - if (flags & NFACCT_SNPRINTF_F_FULL) { + switch(type) { + case NFACCT_SNPRINTF_T_PLAIN: + if (flags & NFACCT_SNPRINTF_F_FULL) { + ret = snprintf(buf, size, + "{ pkts = %.20llu, bytes = %.20llu } = %s;", + (unsigned long long) + nfacct_attr_get_u64(nfacct, NFACCT_ATTR_BYTES), + (unsigned long long) + nfacct_attr_get_u64(nfacct, NFACCT_ATTR_PKTS), + nfacct_attr_get_str(nfacct, NFACCT_ATTR_NAME)); + } else { + ret = snprintf(buf, size, "%s\n", + nfacct_attr_get_str(nfacct, NFACCT_ATTR_NAME)); + } + break; + case NFACCT_SNPRINTF_T_XML: ret = snprintf(buf, size, - "{ pkts = %.20llu, bytes = %.20llu } = %s;", - (unsigned long long) - nfacct_attr_get_u64(nfacct, NFACCT_ATTR_BYTES), - (unsigned long long) - nfacct_attr_get_u64(nfacct, NFACCT_ATTR_PKTS), - nfacct_attr_get_str(nfacct, NFACCT_ATTR_NAME)); - } else { - ret = snprintf(buf, size, "%s\n", - nfacct_attr_get_str(nfacct, NFACCT_ATTR_NAME)); + "<obj><name>%s</name>" + "<pkts>%.20llu</pkts>" + "<bytes>%.20llu</bytes></obj>", + nfacct_attr_get_str(nfacct, NFACCT_ATTR_NAME), + (unsigned long long) + nfacct_attr_get_u64(nfacct, NFACCT_ATTR_BYTES), + (unsigned long long) + nfacct_attr_get_u64(nfacct, NFACCT_ATTR_PKTS)); + break; + default: + ret = -1; + break; } return ret; } diff --git a/src/libnetfilter_acct.map b/src/libnetfilter_acct.map index 2a56eba..e71a6b3 100644 --- a/src/libnetfilter_acct.map +++ b/src/libnetfilter_acct.map @@ -12,11 +12,13 @@ global: nfacct_nlmsg_build_hdr; nfacct_nlmsg_build_payload; nfacct_nlmsg_parse_payload; - nfacct_snprintf; + /* nfacct_snprintf prototype was modified, new version in 1.1. + I decided not to keep the old symbol compatibility. See git log + for more information. */ local: *; }; -#LIBNETFILTER_ACCT_1.1 { -# _my_new_func; -#} LIBNETFILTER_ACCT_1.0; +LIBNETFILTER_ACCT_1.1 { + nfacct_snprintf; +} LIBNETFILTER_ACCT_1.0; |