From 83dd08af4d760962c90f58c5bbfb7e0a08d92d2b Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Fri, 22 Jun 2012 17:50:26 +0200 Subject: src: NFACCT_SNPRINTF_T_XML flag for nfacct_snprintf to output time Signed-off-by: Pablo Neira Ayuso --- src/libnetfilter_acct.c | 120 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 99 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/libnetfilter_acct.c b/src/libnetfilter_acct.c index a9b8721..1e198b2 100644 --- a/src/libnetfilter_acct.c +++ b/src/libnetfilter_acct.c @@ -227,6 +227,103 @@ uint64_t nfacct_attr_get_u64(struct nfacct *nfacct, enum nfacct_attr_type type) } EXPORT_SYMBOL(nfacct_attr_get_u64); +static int +nfacct_snprintf_plain(char *buf, size_t rem, struct nfacct *nfacct, + uint16_t flags) +{ + int ret; + + if (flags & NFACCT_SNPRINTF_F_FULL) { + ret = snprintf(buf, rem, + "{ 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, rem, "%s\n", + nfacct_attr_get_str(nfacct, NFACCT_ATTR_NAME)); + } + + return ret; +} + +#define BUFFER_SIZE(ret, size, rem, offset) \ + size += ret; \ + if (ret > rem) \ + ret = rem; \ + offset += ret; \ + rem -= ret; + +static int +nfacct_snprintf_xml_localtime(char *buf, unsigned int rem, const struct tm *tm) +{ + int ret = 0; + unsigned int size = 0, offset = 0; + + ret = snprintf(buf+offset, rem, "%d", tm->tm_hour); + BUFFER_SIZE(ret, size, rem, offset); + + ret = snprintf(buf+offset, rem, "%02d", tm->tm_min); + BUFFER_SIZE(ret, size, rem, offset); + + ret = snprintf(buf+offset, rem, "%02d", tm->tm_sec); + BUFFER_SIZE(ret, size, rem, offset); + + ret = snprintf(buf+offset, rem, "%d", tm->tm_wday + 1); + BUFFER_SIZE(ret, size, rem, offset); + + ret = snprintf(buf+offset, rem, "%d", tm->tm_mday); + BUFFER_SIZE(ret, size, rem, offset); + + ret = snprintf(buf+offset, rem, "%d", tm->tm_mon + 1); + BUFFER_SIZE(ret, size, rem, offset); + + ret = snprintf(buf+offset, rem, "%d", 1900 + tm->tm_year); + BUFFER_SIZE(ret, size, rem, offset); + + return size; +} + + +static int +nfacct_snprintf_xml(char *buf, size_t rem, struct nfacct *nfacct, + uint16_t flags) +{ + int ret = 0; + unsigned int size = 0, offset = 0; + + ret = snprintf(buf, rem, + "%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)); + BUFFER_SIZE(ret, size, rem, offset); + + if (flags & NFACCT_SNPRINTF_F_TIME) { + time_t t; + struct tm tm; + + t = time(NULL); + if (localtime_r(&t, &tm) == NULL) + goto err; + + ret = nfacct_snprintf_xml_localtime(buf+offset, rem, &tm); + BUFFER_SIZE(ret, size, rem, offset); + } + + ret = snprintf(buf+offset, rem, ""); + BUFFER_SIZE(ret, size, rem, offset); + +err: + return ret; +} + /** * nfacct_snprintf - print accounting object into one buffer * \param buf: pointer to buffer that is used to print the object @@ -245,29 +342,10 @@ int nfacct_snprintf(char *buf, size_t size, struct nfacct *nfacct, 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)); - } + ret = nfacct_snprintf_plain(buf, size, nfacct, flags); break; case NFACCT_SNPRINTF_T_XML: - ret = snprintf(buf, size, - "%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)); + ret = nfacct_snprintf_xml(buf, size, nfacct, flags); break; default: ret = -1; -- cgit v1.2.3