X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=log.c;h=f34892dc46971b233d43db7307a4dc135e521388;hp=172f1538c6e7366f784c374db0dcc1b3ea7b4cd6;hb=7d64aa48fcfc03a93ea1623338a760e66406b132;hpb=c8a07f8778322dda82ca1d87f357be4a41bc0296 diff --git a/log.c b/log.c index 172f1538..f34892dc 100644 --- a/log.c +++ b/log.c @@ -6,6 +6,8 @@ #include "fio.h" +#define LOG_START_SZ 512 + size_t log_info_buf(const char *buf, size_t len) { /* @@ -29,38 +31,76 @@ size_t log_info_buf(const char *buf, size_t len) size_t log_valist(const char *str, va_list args) { - char buffer[1024]; - size_t len; + size_t len, cur = LOG_START_SZ; + char *buffer; + + do { + buffer = calloc(1, cur); + + len = vsnprintf(buffer, cur, str, args); + if (len <= cur) + break; - len = vsnprintf(buffer, sizeof(buffer), str, args); + cur = len; + free(buffer); + } while (1); - return log_info_buf(buffer, min(len, sizeof(buffer) - 1)); + cur = log_info_buf(buffer, len); + free(buffer); + + return cur; } size_t log_info(const char *format, ...) { - char buffer[1024]; + size_t len, cur = LOG_START_SZ; + char *buffer; va_list args; - size_t len; - va_start(args, format); - len = vsnprintf(buffer, sizeof(buffer), format, args); - va_end(args); + do { + buffer = calloc(1, cur); + + va_start(args, format); + len = vsnprintf(buffer, cur, format, args); + va_end(args); - return log_info_buf(buffer, min(len, sizeof(buffer) - 1)); + if (len <= cur) + break; + + cur = len; + free(buffer); + } while (1); + + cur = log_info_buf(buffer, len); + free(buffer); + + return cur; } size_t __log_buf(struct buf_output *buf, const char *format, ...) { - char buffer[1024]; + size_t len, cur = LOG_START_SZ; + char *buffer; va_list args; - size_t len; - va_start(args, format); - len = vsnprintf(buffer, sizeof(buffer), format, args); - va_end(args); + do { + buffer = calloc(1, cur); + + va_start(args, format); + len = vsnprintf(buffer, cur, format, args); + va_end(args); + + if (len <= cur) + break; - return buf_output_add(buf, buffer, min(len, sizeof(buffer) - 1)); + cur = len; + free(buffer); + } while (1); + + cur = buf_output_add(buf, buffer, len); + free(buffer); + + return cur; } int log_info_flush(void) @@ -73,33 +113,44 @@ int log_info_flush(void) size_t log_err(const char *format, ...) { - char buffer[1024]; + size_t ret, len, cur = LOG_START_SZ; + char *buffer; va_list args; - size_t len; - va_start(args, format); - len = vsnprintf(buffer, sizeof(buffer), format, args); - va_end(args); - len = min(len, sizeof(buffer) - 1); + do { + buffer = calloc(1, cur); + + va_start(args, format); + len = vsnprintf(buffer, cur, format, args); + va_end(args); + + if (len <= cur) + break; + + cur = len; + free(buffer); + } while (1); + if (is_backend) { - size_t ret = fio_server_text_output(FIO_LOG_ERR, buffer, len); + ret = fio_server_text_output(FIO_LOG_ERR, buffer, len); if (ret != -1) - return ret; + goto done; } if (log_syslog) { syslog(LOG_INFO, "%s", buffer); - return len; + ret = len; } else { - if (f_err != stderr) { - int fio_unused ret; - + if (f_err != stderr) ret = fwrite(buffer, len, 1, stderr); - } - return fwrite(buffer, len, 1, f_err); + ret = fwrite(buffer, len, 1, f_err); } + +done: + free(buffer); + return ret; } const char *log_get_level(int level)