log: Modify the implementation such that it uses asprintf()
authorBart Van Assche <bart.vanassche@wdc.com>
Tue, 13 Mar 2018 22:28:17 +0000 (15:28 -0700)
committerBart Van Assche <bart.vanassche@wdc.com>
Mon, 19 Mar 2018 17:39:28 +0000 (10:39 -0700)
This makes the logging implementation simpler and easier to read.

Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
log.c

diff --git a/log.c b/log.c
index a327f6a..7e8b13b 100644 (file)
--- a/log.c
+++ b/log.c
@@ -5,8 +5,7 @@
 #include <syslog.h>
 
 #include "fio.h"
-
-#define LOG_START_SZ           512
+#include "oslib/asprintf.h"
 
 size_t log_info_buf(const char *buf, size_t len)
 {
@@ -29,63 +28,14 @@ size_t log_info_buf(const char *buf, size_t len)
                return fwrite(buf, len, 1, f_out);
 }
 
-static size_t valist_to_buf(char **buffer, const char *fmt, va_list src_args)
-{
-       size_t len, cur = LOG_START_SZ;
-       va_list args;
-
-       do {
-               *buffer = calloc(1, cur);
-               if (!*buffer)
-                       return 0;
-
-               va_copy(args, src_args);
-               len = vsnprintf(*buffer, cur, fmt, args);
-               va_end(args);
-
-               if (len < cur)
-                       break;
-
-               cur = len + 1;
-               free(*buffer);
-       } while (1);
-
-       return len;
-}
-
-/* allocate buffer, fill with prefix string followed by vararg string */
-static size_t prevalist_to_buf(char **buffer, const char *pre, int prelen,
-               const char *fmt, va_list src_args)
-{
-       size_t len, cur = LOG_START_SZ;
-       va_list args;
-
-       do {
-               *buffer = calloc(1, cur);
-               if (!*buffer)
-                       return 0;
-
-               va_copy(args, src_args);
-               memcpy(*buffer, pre, prelen);
-               len = prelen + vsnprintf(*buffer + prelen, cur - prelen, fmt, args);
-               va_end(args);
-
-               if (len < cur)
-                       break;
-
-               cur = len + 1;
-               free(*buffer);
-       } while (1);
-
-       return len;
-}
-
 size_t log_valist(const char *fmt, va_list args)
 {
        char *buffer;
-       size_t len;
+       int len;
 
-       len = valist_to_buf(&buffer, fmt, args);
+       len = vasprintf(&buffer, fmt, args);
+       if (len < 0)
+               return 0;
        len = log_info_buf(buffer, len);
        free(buffer);
 
@@ -95,10 +45,8 @@ size_t log_valist(const char *fmt, va_list args)
 /* add prefix for the specified type in front of the valist */
 void log_prevalist(int type, const char *fmt, va_list args)
 {
-       char pre[32];
-       char *buffer;
-       size_t len;
-       int prelen;
+       char *buf1, *buf2;
+       int len;
        pid_t pid;
 
        pid = gettid();
@@ -106,12 +54,16 @@ void log_prevalist(int type, const char *fmt, va_list args)
            && pid != *fio_debug_jobp)
                return;
 
-       prelen = snprintf(pre, sizeof pre, "%-8s %-5u ", debug_levels[type].name, (int) pid);
-       if (prelen > 0) {
-               len = prevalist_to_buf(&buffer, pre, prelen, fmt, args);
-               len = log_info_buf(buffer, len);
-               free(buffer);
-       }
+       len = vasprintf(&buf1, fmt, args);
+       if (len < 0)
+               return;
+       len = asprintf(&buf2, "%-8s %-5u %s", debug_levels[type].name,
+                      (int) pid, buf1);
+       free(buf1);
+       if (len < 0)
+               return;
+       len = log_info_buf(buf2, len);
+       free(buf2);
 }
 
 size_t log_info(const char *format, ...)
@@ -130,12 +82,13 @@ size_t __log_buf(struct buf_output *buf, const char *format, ...)
 {
        char *buffer;
        va_list args;
-       size_t len;
+       int len;
 
        va_start(args, format);
-       len = valist_to_buf(&buffer, format, args);
+       len = vasprintf(&buffer, format, args);
        va_end(args);
-
+       if (len < 0)
+               return 0;
        len = buf_output_add(buf, buffer, len);
        free(buffer);
 
@@ -152,13 +105,16 @@ int log_info_flush(void)
 
 size_t log_err(const char *format, ...)
 {
-       size_t ret, len;
+       size_t ret;
+       int len;
        char *buffer;
        va_list args;
 
        va_start(args, format);
-       len = valist_to_buf(&buffer, format, args);
+       len = vasprintf(&buffer, format, args);
        va_end(args);
+       if (len < 0)
+               return len;
 
        if (is_backend) {
                ret = fio_server_text_output(FIO_LOG_ERR, buffer, len);