summaryrefslogtreecommitdiffstats
path: root/src/libnetfilter_acct.c
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2012-03-26 21:39:29 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2012-03-27 11:26:33 +0200
commit9d5d2b85c2f37b0f734d6a1a4b3ea2e36ead6519 (patch)
treef5c46ac8e3b68a65f8e754a665ca03354fe92687 /src/libnetfilter_acct.c
parentad96d6dd747cfc45116e4e600a3d22079e18a657 (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>
Diffstat (limited to 'src/libnetfilter_acct.c')
-rw-r--r--src/libnetfilter_acct.c43
1 files changed, 31 insertions, 12 deletions
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;
}