diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2012-06-22 17:50:26 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2012-06-22 17:50:26 +0200 |
commit | 83dd08af4d760962c90f58c5bbfb7e0a08d92d2b (patch) | |
tree | 90445a7c8560188fb3c409f4f0d519300ba7a167 | |
parent | 2204eb2d6eecd06acae471eb6bd682eab904db90 (diff) |
src: NFACCT_SNPRINTF_T_XML flag for nfacct_snprintf to output time
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r-- | include/libnetfilter_acct/libnetfilter_acct.h | 3 | ||||
-rw-r--r-- | src/libnetfilter_acct.c | 120 |
2 files changed, 101 insertions, 22 deletions
diff --git a/include/libnetfilter_acct/libnetfilter_acct.h b/include/libnetfilter_acct/libnetfilter_acct.h index a57b571..a326c3c 100644 --- a/include/libnetfilter_acct/libnetfilter_acct.h +++ b/include/libnetfilter_acct/libnetfilter_acct.h @@ -30,7 +30,8 @@ struct nlmsghdr *nfacct_nlmsg_build_hdr(char *buf, uint8_t cmd, uint16_t flags, void nfacct_nlmsg_build_payload(struct nlmsghdr *nlh, struct nfacct *nfacct); int nfacct_nlmsg_parse_payload(const struct nlmsghdr *nlh, struct nfacct *nfacct); -#define NFACCT_SNPRINTF_F_FULL (1 << 0) +#define NFACCT_SNPRINTF_F_FULL (1 << 0) +#define NFACCT_SNPRINTF_F_TIME (1 << 1) #define NFACCT_SNPRINTF_T_PLAIN 0 #define NFACCT_SNPRINTF_T_XML 1 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, "<hour>%d</hour>", tm->tm_hour); + BUFFER_SIZE(ret, size, rem, offset); + + ret = snprintf(buf+offset, rem, "<min>%02d</min>", tm->tm_min); + BUFFER_SIZE(ret, size, rem, offset); + + ret = snprintf(buf+offset, rem, "<sec>%02d</sec>", tm->tm_sec); + BUFFER_SIZE(ret, size, rem, offset); + + ret = snprintf(buf+offset, rem, "<wday>%d</wday>", tm->tm_wday + 1); + BUFFER_SIZE(ret, size, rem, offset); + + ret = snprintf(buf+offset, rem, "<day>%d</day>", tm->tm_mday); + BUFFER_SIZE(ret, size, rem, offset); + + ret = snprintf(buf+offset, rem, "<month>%d</month>", tm->tm_mon + 1); + BUFFER_SIZE(ret, size, rem, offset); + + ret = snprintf(buf+offset, rem, "<year>%d</year>", 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, + "<obj><name>%s</name>" + "<pkts>%.20llu</pkts>" + "<bytes>%.20llu</bytes>", + 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, "</obj>"); + 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, - "<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)); + ret = nfacct_snprintf_xml(buf, size, nfacct, flags); break; default: ret = -1; |