log: Modify the implementation such that it uses asprintf()
[fio.git] / log.c
CommitLineData
ac9b9101
JA
1#include <unistd.h>
2#include <fcntl.h>
3#include <string.h>
4#include <stdarg.h>
e46d8091 5#include <syslog.h>
3c39a379 6
ac9b9101 7#include "fio.h"
9274160e 8#include "oslib/asprintf.h"
7d64aa48 9
830814d4
JA
10size_t log_info_buf(const char *buf, size_t len)
11{
3dc3aa41
TK
12 /*
13 * buf could be NULL (not just "").
14 */
15 if (!buf)
16 return 0;
17
408e0b90
JA
18 if (is_backend) {
19 size_t ret = fio_server_text_output(FIO_LOG_INFO, buf, len);
20 if (ret != -1)
21 return ret;
22 }
23
24 if (log_syslog) {
830814d4
JA
25 syslog(LOG_INFO, "%s", buf);
26 return len;
27 } else
28 return fwrite(buf, len, 1, f_out);
29}
30
fc97d6ae 31size_t log_valist(const char *fmt, va_list args)
3c39a379 32{
7d64aa48 33 char *buffer;
9274160e 34 int len;
7d64aa48 35
9274160e
BVA
36 len = vasprintf(&buffer, fmt, args);
37 if (len < 0)
38 return 0;
fc97d6ae
JA
39 len = log_info_buf(buffer, len);
40 free(buffer);
f29b25a3 41
fc97d6ae
JA
42 return len;
43}
7d64aa48 44
e5f9a813
RE
45/* add prefix for the specified type in front of the valist */
46void log_prevalist(int type, const char *fmt, va_list args)
47{
9274160e
BVA
48 char *buf1, *buf2;
49 int len;
e5f9a813
RE
50 pid_t pid;
51
52 pid = gettid();
53 if (fio_debug_jobp && *fio_debug_jobp != -1U
54 && pid != *fio_debug_jobp)
55 return;
56
9274160e
BVA
57 len = vasprintf(&buf1, fmt, args);
58 if (len < 0)
59 return;
60 len = asprintf(&buf2, "%-8s %-5u %s", debug_levels[type].name,
61 (int) pid, buf1);
62 free(buf1);
63 if (len < 0)
64 return;
65 len = log_info_buf(buf2, len);
66 free(buf2);
e5f9a813
RE
67}
68
fc97d6ae
JA
69size_t log_info(const char *format, ...)
70{
71 va_list args;
72 size_t ret;
7d64aa48 73
fc97d6ae
JA
74 va_start(args, format);
75 ret = log_valist(format, args);
76 va_end(args);
7d64aa48 77
fc97d6ae 78 return ret;
f29b25a3
JA
79}
80
5768cc2b 81size_t __log_buf(struct buf_output *buf, const char *format, ...)
a666cab8 82{
7d64aa48 83 char *buffer;
a666cab8 84 va_list args;
9274160e 85 int len;
a666cab8 86
fc97d6ae 87 va_start(args, format);
9274160e 88 len = vasprintf(&buffer, format, args);
fc97d6ae 89 va_end(args);
9274160e
BVA
90 if (len < 0)
91 return 0;
fc97d6ae 92 len = buf_output_add(buf, buffer, len);
7d64aa48
JA
93 free(buffer);
94
fc97d6ae 95 return len;
a666cab8
JA
96}
97
fdd5f15f
VKF
98int log_info_flush(void)
99{
100 if (is_backend || log_syslog)
101 return 0;
102
103 return fflush(f_out);
104}
105
5768cc2b 106size_t log_err(const char *format, ...)
fb71fbd7 107{
9274160e
BVA
108 size_t ret;
109 int len;
7d64aa48 110 char *buffer;
ac9b9101 111 va_list args;
f29b25a3 112
fc97d6ae 113 va_start(args, format);
9274160e 114 len = vasprintf(&buffer, format, args);
fc97d6ae 115 va_end(args);
9274160e
BVA
116 if (len < 0)
117 return len;
fb71fbd7 118
408e0b90 119 if (is_backend) {
7d64aa48 120 ret = fio_server_text_output(FIO_LOG_ERR, buffer, len);
408e0b90 121 if (ret != -1)
7d64aa48 122 goto done;
408e0b90
JA
123 }
124
125 if (log_syslog) {
13755d94 126 syslog(LOG_INFO, "%s", buffer);
7d64aa48 127 ret = len;
13755d94 128 } else {
7d64aa48 129 if (f_err != stderr)
1f39e555 130 ret = fwrite(buffer, len, 1, stderr);
fb71fbd7 131
7d64aa48 132 ret = fwrite(buffer, len, 1, f_err);
f29b25a3 133 }
7d64aa48
JA
134
135done:
136 free(buffer);
137 return ret;
e3cedca7 138}
3ad04399
JA
139
140const char *log_get_level(int level)
141{
142 static const char *levels[] = { "Unknown", "Debug", "Info", "Error",
143 "Unknown" };
144
145 if (level >= FIO_LOG_NR)
146 level = FIO_LOG_NR;
147
148 return levels[level];
149}