diff --git a/server/include/utils.h b/server/include/utils.h index 4e822af04..1f9eebdcd 100644 --- a/server/include/utils.h +++ b/server/include/utils.h @@ -68,6 +68,15 @@ void epoch_reset(); */ void print(enum log_level lvl, const char *fmt, ...); +/** Safely append a format string to an existing string. + * + * This function is similar to strlcat() from BSD. + */ +int strap(char *dest, size_t size, const char *fmt, ...); + +/** Variable arguments (stdarg) version of strap() */ +int vstrap(char *dest, size_t size, const char *fmt, va_list va); + /** Convert integer to cpu_set_t. * * @param set A cpu bitmask diff --git a/server/src/utils.c b/server/src/utils.c index c332e7799..1cd554765 100644 --- a/server/src/utils.c +++ b/server/src/utils.c @@ -35,6 +35,25 @@ void epoch_reset() clock_gettime(CLOCK_REALTIME, &epoch); } +int strap(char *dest, size_t size, const char *fmt, ...) +{ + int ret; + + va_list ap; + va_start(ap, fmt); + ret = vstrap(dest, size, fmt, ap); + va_end(ap); + + return ret; +} + +int vstrap(char *dest, size_t size, const char *fmt, va_list ap) +{ + int len = strlen(dest); + + return vsnprintf(dest + len, size - len, fmt, ap); +} + void print(enum log_level lvl, const char *fmt, ...) { struct timespec ts;