From 872fcd6219bb2d01685e4a3c5828c6f8789681c9 Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Tue, 21 Mar 2017 16:47:22 -0700 Subject: libvmon: use local buffers for constructing paths The vmon->buf[_bis] buffers are nice to shrink to absurdly small sizes for testing changes, but we can't do that when they're reused for path construction. Just use local on-stack buffers for constructing paths, and now things continue to function just slower with vmon->buf[8]. --- src/libvmon/vmon.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/libvmon/vmon.c b/src/libvmon/vmon.c index 3cee869..942d3cd 100644 --- a/src/libvmon/vmon.c +++ b/src/libvmon/vmon.c @@ -172,12 +172,13 @@ static int openf(vmon_t *vmon, int flags, DIR *dir, char *fmt, ...) { int fd; va_list va_arg; + char buf[4096]; va_start(va_arg, fmt); - vsnprintf(vmon->buf, sizeof(vmon->buf), fmt, va_arg); /* XXX accepting the possibility of truncating the path */ + vsnprintf(buf, sizeof(buf), fmt, va_arg); /* XXX accepting the possibility of truncating the path */ va_end(va_arg); - fd = openat(dirfd(dir), vmon->buf, flags); + fd = openat(dirfd(dir), buf, flags); return fd; } @@ -188,12 +189,13 @@ static DIR * opendirf(vmon_t *vmon, DIR *dir, char *fmt, ...) { int fd; va_list va_arg; + char buf[4096]; va_start(va_arg, fmt); - vsnprintf(vmon->buf, sizeof(vmon->buf), fmt, va_arg); /* XXX accepting the possibility of truncating the path */ + vsnprintf(buf, sizeof(buf), fmt, va_arg); /* XXX accepting the possibility of truncating the path */ va_end(va_arg); - fd = openat(dirfd(dir), vmon->buf, O_RDONLY); + fd = openat(dirfd(dir), buf, O_RDONLY); if (fd == -1) return NULL; @@ -222,18 +224,19 @@ static int grow_array(vmon_char_array_t *array, int amount) #define READLINKF_GROWBY 2 static char * readlinkf(vmon_t *vmon, vmon_char_array_t *array, DIR *dir, char *fmt, ...) { - va_list va_arg; - int len; + va_list va_arg; + int len; + char buf[4096]; va_start(va_arg, fmt); - vsnprintf(vmon->buf, sizeof(vmon->buf), fmt, va_arg); + vsnprintf(buf, sizeof(buf), fmt, va_arg); va_end(va_arg); if (!array->array && !grow_array(array, READLINKF_GROWINIT)) goto _fail; do { - len = readlinkat(dirfd(dir), vmon->buf, array->array, (array->alloc_len - 1)); + len = readlinkat(dirfd(dir), buf, array->array, (array->alloc_len - 1)); } while (len != -1 && len == (array->alloc_len - 1) && (len = grow_array(array, READLINKF_GROWBY))); if (len <= 0) -- cgit v1.2.3