summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
c8a07f8)
We simply truncate the output if it's larger than our static
buffer. Make it dynamically allocated instead, and ensure that
we loop correctly to handle the full amount asked for.
This fixes a problem with truncated output. One example is
json output, with file names (for multiple files) that are
larger than 1024 bytes. With the truncated output, we would
truncate the file name and hence also miss the terminating
'"'. The latter means the json was no longer valid, either.
Signed-off-by: Jens Axboe <axboe@fb.com>
+#define LOG_START_SZ 512
+
size_t log_info_buf(const char *buf, size_t len)
{
/*
size_t log_info_buf(const char *buf, size_t len)
{
/*
size_t log_valist(const char *str, va_list args)
{
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, ...)
{
}
size_t log_info(const char *format, ...)
{
+ size_t len, cur = LOG_START_SZ;
+ char *buffer;
- 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, ...)
{
}
size_t __log_buf(struct buf_output *buf, const char *format, ...)
{
+ size_t len, cur = LOG_START_SZ;
+ char *buffer;
- 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)
}
int log_info_flush(void)
size_t log_err(const char *format, ...)
{
size_t log_err(const char *format, ...)
{
+ size_t ret, len, cur = LOG_START_SZ;
+ char *buffer;
- 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);
+
- size_t ret = fio_server_text_output(FIO_LOG_ERR, buffer, len);
+ ret = fio_server_text_output(FIO_LOG_ERR, buffer, len);
}
if (log_syslog) {
syslog(LOG_INFO, "%s", buffer);
}
if (log_syslog) {
syslog(LOG_INFO, "%s", buffer);
- if (f_err != stderr) {
- int fio_unused ret;
-
ret = fwrite(buffer, len, 1, 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)
}
const char *log_get_level(int level)