Revision eeacee4d qemu-log.c
b/qemu-log.c | ||
---|---|---|
25 | 25 |
#else |
26 | 26 |
static const char *logfilename = "/tmp/qemu.log"; |
27 | 27 |
#endif |
28 |
FILE *logfile; |
|
29 |
int loglevel; |
|
28 |
FILE *qemu_logfile;
|
|
29 |
int qemu_loglevel;
|
|
30 | 30 |
static int log_append = 0; |
31 | 31 |
|
32 |
void qemu_log(const char *fmt, ...) |
|
33 |
{ |
|
34 |
va_list ap; |
|
35 |
|
|
36 |
va_start(ap, fmt); |
|
37 |
if (qemu_logfile) { |
|
38 |
vfprintf(qemu_logfile, fmt, ap); |
|
39 |
} |
|
40 |
va_end(ap); |
|
41 |
} |
|
42 |
|
|
43 |
void qemu_log_mask(int mask, const char *fmt, ...) |
|
44 |
{ |
|
45 |
va_list ap; |
|
46 |
|
|
47 |
va_start(ap, fmt); |
|
48 |
if ((qemu_loglevel & mask) && qemu_logfile) { |
|
49 |
vfprintf(qemu_logfile, fmt, ap); |
|
50 |
} |
|
51 |
va_end(ap); |
|
52 |
} |
|
53 |
|
|
32 | 54 |
/* enable or disable low levels log */ |
33 | 55 |
void cpu_set_log(int log_flags) |
34 | 56 |
{ |
35 |
loglevel = log_flags; |
|
36 |
if (loglevel && !logfile) {
|
|
37 |
logfile = fopen(logfilename, log_append ? "a" : "w"); |
|
38 |
if (!logfile) { |
|
57 |
qemu_loglevel = log_flags;
|
|
58 |
if (qemu_loglevel && !qemu_logfile) {
|
|
59 |
qemu_logfile = fopen(logfilename, log_append ? "a" : "w");
|
|
60 |
if (!qemu_logfile) {
|
|
39 | 61 |
perror(logfilename); |
40 | 62 |
_exit(1); |
41 | 63 |
} |
... | ... | |
43 | 65 |
/* must avoid mmap() usage of glibc by setting a buffer "by hand" */ |
44 | 66 |
{ |
45 | 67 |
static char logfile_buf[4096]; |
46 |
setvbuf(logfile, logfile_buf, _IOLBF, sizeof(logfile_buf)); |
|
68 |
setvbuf(qemu_logfile, logfile_buf, _IOLBF, sizeof(logfile_buf));
|
|
47 | 69 |
} |
48 | 70 |
#elif defined(_WIN32) |
49 | 71 |
/* Win32 doesn't support line-buffering, so use unbuffered output. */ |
50 |
setvbuf(logfile, NULL, _IONBF, 0); |
|
72 |
setvbuf(qemu_logfile, NULL, _IONBF, 0);
|
|
51 | 73 |
#else |
52 |
setvbuf(logfile, NULL, _IOLBF, 0); |
|
74 |
setvbuf(qemu_logfile, NULL, _IOLBF, 0);
|
|
53 | 75 |
#endif |
54 | 76 |
log_append = 1; |
55 | 77 |
} |
56 |
if (!loglevel && logfile) {
|
|
57 |
fclose(logfile); |
|
58 |
logfile = NULL; |
|
78 |
if (!qemu_loglevel && qemu_logfile) {
|
|
79 |
fclose(qemu_logfile);
|
|
80 |
qemu_logfile = NULL;
|
|
59 | 81 |
} |
60 | 82 |
} |
61 | 83 |
|
62 | 84 |
void cpu_set_log_filename(const char *filename) |
63 | 85 |
{ |
64 | 86 |
logfilename = strdup(filename); |
65 |
if (logfile) { |
|
66 |
fclose(logfile); |
|
67 |
logfile = NULL; |
|
87 |
if (qemu_logfile) {
|
|
88 |
fclose(qemu_logfile);
|
|
89 |
qemu_logfile = NULL;
|
|
68 | 90 |
} |
69 |
cpu_set_log(loglevel); |
|
91 |
cpu_set_log(qemu_loglevel);
|
|
70 | 92 |
} |
71 | 93 |
|
72 | 94 |
const CPULogItem cpu_log_items[] = { |
Also available in: Unified diff