Revision 6e4f984c qemu-error.c
b/qemu-error.c | ||
---|---|---|
2 | 2 |
#include "monitor.h" |
3 | 3 |
#include "sysemu.h" |
4 | 4 |
|
5 |
typedef struct QemuErrorSink QemuErrorSink; |
|
6 |
struct QemuErrorSink { |
|
7 |
enum { |
|
8 |
ERR_SINK_FILE, |
|
9 |
ERR_SINK_MONITOR, |
|
10 |
} dest; |
|
11 |
union { |
|
12 |
FILE *fp; |
|
13 |
Monitor *mon; |
|
14 |
}; |
|
15 |
QemuErrorSink *previous; |
|
16 |
}; |
|
17 |
|
|
18 |
static QemuErrorSink *qemu_error_sink; |
|
19 |
|
|
20 |
void qemu_errors_to_file(FILE *fp) |
|
21 |
{ |
|
22 |
QemuErrorSink *sink; |
|
23 |
|
|
24 |
sink = qemu_mallocz(sizeof(*sink)); |
|
25 |
sink->dest = ERR_SINK_FILE; |
|
26 |
sink->fp = fp; |
|
27 |
sink->previous = qemu_error_sink; |
|
28 |
qemu_error_sink = sink; |
|
29 |
} |
|
30 |
|
|
31 |
void qemu_errors_to_mon(Monitor *mon) |
|
32 |
{ |
|
33 |
QemuErrorSink *sink; |
|
34 |
|
|
35 |
sink = qemu_mallocz(sizeof(*sink)); |
|
36 |
sink->dest = ERR_SINK_MONITOR; |
|
37 |
sink->mon = mon; |
|
38 |
sink->previous = qemu_error_sink; |
|
39 |
qemu_error_sink = sink; |
|
40 |
} |
|
41 |
|
|
42 |
void qemu_errors_to_previous(void) |
|
43 |
{ |
|
44 |
QemuErrorSink *sink; |
|
45 |
|
|
46 |
assert(qemu_error_sink != NULL); |
|
47 |
sink = qemu_error_sink; |
|
48 |
qemu_error_sink = sink->previous; |
|
49 |
qemu_free(sink); |
|
50 |
} |
|
51 |
|
|
52 | 5 |
void qemu_error(const char *fmt, ...) |
53 | 6 |
{ |
54 | 7 |
va_list args; |
55 | 8 |
|
56 |
assert(qemu_error_sink != NULL); |
|
57 |
switch (qemu_error_sink->dest) { |
|
58 |
case ERR_SINK_FILE: |
|
59 |
va_start(args, fmt); |
|
60 |
vfprintf(qemu_error_sink->fp, fmt, args); |
|
61 |
va_end(args); |
|
62 |
break; |
|
63 |
case ERR_SINK_MONITOR: |
|
64 |
va_start(args, fmt); |
|
65 |
monitor_vprintf(qemu_error_sink->mon, fmt, args); |
|
66 |
va_end(args); |
|
67 |
break; |
|
9 |
va_start(args, fmt); |
|
10 |
if (cur_mon) { |
|
11 |
monitor_vprintf(cur_mon, fmt, args); |
|
12 |
} else { |
|
13 |
vfprintf(stderr, fmt, args); |
|
68 | 14 |
} |
15 |
va_end(args); |
|
69 | 16 |
} |
70 | 17 |
|
71 | 18 |
void qemu_error_internal(const char *file, int linenr, const char *func, |
... | ... | |
74 | 21 |
va_list va; |
75 | 22 |
QError *qerror; |
76 | 23 |
|
77 |
assert(qemu_error_sink != NULL); |
|
78 |
|
|
79 | 24 |
va_start(va, fmt); |
80 | 25 |
qerror = qerror_from_info(file, linenr, func, fmt, &va); |
81 | 26 |
va_end(va); |
82 | 27 |
|
83 |
switch (qemu_error_sink->dest) { |
|
84 |
case ERR_SINK_FILE: |
|
28 |
if (cur_mon) { |
|
29 |
monitor_set_error(cur_mon, qerror); |
|
30 |
} else { |
|
85 | 31 |
qerror_print(qerror); |
86 | 32 |
QDECREF(qerror); |
87 |
break; |
|
88 |
case ERR_SINK_MONITOR: |
|
89 |
monitor_set_error(qemu_error_sink->mon, qerror); |
|
90 |
break; |
|
91 | 33 |
} |
92 | 34 |
} |
Also available in: Unified diff