diff options
-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; |