summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;