From 9d5d2b85c2f37b0f734d6a1a4b3ea2e36ead6519 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Mon, 26 Mar 2012 21:39:29 +0200 Subject: 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 --- src/libnetfilter_acct.c | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) (limited to 'src/libnetfilter_acct.c') 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)); + "%s" + "%.20llu" + "%.20llu", + 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; } -- cgit v1.2.3