summaryrefslogtreecommitdiffstats
path: root/src/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.c')
-rw-r--r--src/utils.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/utils.c b/src/utils.c
index 9a0bcfe..2415917 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -174,3 +174,30 @@ void xfree(const void *ptr)
{
free((void *)ptr);
}
+
+int nft_fprintf(FILE *fp, void *obj, uint32_t type, uint32_t flags,
+ int (*snprintf_cb)(char *buf, size_t bufsiz, void *obj,
+ uint32_t type, uint32_t flags))
+{
+ char _buf[NFT_SNPRINTF_BUFSIZ];
+ char *buf = _buf;
+ size_t bufsiz = sizeof(_buf);
+ int ret;
+
+ ret = snprintf_cb(buf, bufsiz, obj, type, flags);
+ if (ret > NFT_SNPRINTF_BUFSIZ) {
+ buf = calloc(1, ret);
+ if (buf == NULL)
+ return -1;
+
+ bufsiz = ret;
+ ret = snprintf_cb(buf, bufsiz, obj, type, flags);
+ }
+
+ ret = fprintf(fp, "%s", buf);
+
+ if (buf != _buf)
+ xfree(buf);
+
+ return ret;
+}