summaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--Make_global.am2
-rw-r--r--include/libnetfilter_acct/libnetfilter_acct.h5
-rw-r--r--src/libnetfilter_acct.c43
-rw-r--r--src/libnetfilter_acct.map10
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;