Revision b4a51f7f

b/Makefile.target
169 169
ifdef CONFIG_SOFTMMU
170 170

  
171 171
obj-y = vl.o async.o monitor.o pci.o pci_host.o pcie_host.o machine.o gdbstub.o
172
obj-y += qemu-error.o
172 173
# virtio has to be here due to weird dependency between PCI and virtio-net.
173 174
# need to fix this properly
174 175
obj-y += virtio-blk.o virtio-balloon.o virtio-net.o virtio-pci.o virtio-serial-bus.o
b/monitor.c
4686 4686

  
4687 4687
    return err;
4688 4688
}
4689

  
4690
typedef struct QemuErrorSink QemuErrorSink;
4691
struct QemuErrorSink {
4692
    enum {
4693
        ERR_SINK_FILE,
4694
        ERR_SINK_MONITOR,
4695
    } dest;
4696
    union {
4697
        FILE    *fp;
4698
        Monitor *mon;
4699
    };
4700
    QemuErrorSink *previous;
4701
};
4702

  
4703
static QemuErrorSink *qemu_error_sink;
4704

  
4705
void qemu_errors_to_file(FILE *fp)
4706
{
4707
    QemuErrorSink *sink;
4708

  
4709
    sink = qemu_mallocz(sizeof(*sink));
4710
    sink->dest = ERR_SINK_FILE;
4711
    sink->fp = fp;
4712
    sink->previous = qemu_error_sink;
4713
    qemu_error_sink = sink;
4714
}
4715

  
4716
void qemu_errors_to_mon(Monitor *mon)
4717
{
4718
    QemuErrorSink *sink;
4719

  
4720
    sink = qemu_mallocz(sizeof(*sink));
4721
    sink->dest = ERR_SINK_MONITOR;
4722
    sink->mon = mon;
4723
    sink->previous = qemu_error_sink;
4724
    qemu_error_sink = sink;
4725
}
4726

  
4727
void qemu_errors_to_previous(void)
4728
{
4729
    QemuErrorSink *sink;
4730

  
4731
    assert(qemu_error_sink != NULL);
4732
    sink = qemu_error_sink;
4733
    qemu_error_sink = sink->previous;
4734
    qemu_free(sink);
4735
}
4736

  
4737
void qemu_error(const char *fmt, ...)
4738
{
4739
    va_list args;
4740

  
4741
    assert(qemu_error_sink != NULL);
4742
    switch (qemu_error_sink->dest) {
4743
    case ERR_SINK_FILE:
4744
        va_start(args, fmt);
4745
        vfprintf(qemu_error_sink->fp, fmt, args);
4746
        va_end(args);
4747
        break;
4748
    case ERR_SINK_MONITOR:
4749
        va_start(args, fmt);
4750
        monitor_vprintf(qemu_error_sink->mon, fmt, args);
4751
        va_end(args);
4752
        break;
4753
    }
4754
}
4755

  
4756
void qemu_error_internal(const char *file, int linenr, const char *func,
4757
                         const char *fmt, ...)
4758
{
4759
    va_list va;
4760
    QError *qerror;
4761

  
4762
    assert(qemu_error_sink != NULL);
4763

  
4764
    va_start(va, fmt);
4765
    qerror = qerror_from_info(file, linenr, func, fmt, &va);
4766
    va_end(va);
4767

  
4768
    switch (qemu_error_sink->dest) {
4769
    case ERR_SINK_FILE:
4770
        qerror_print(qerror);
4771
        QDECREF(qerror);
4772
        break;
4773
    case ERR_SINK_MONITOR:
4774
        monitor_set_error(qemu_error_sink->mon, qerror);
4775
        break;
4776
    }
4777
}
b/qemu-error.c
1
#include <stdio.h>
2
#include "monitor.h"
3
#include "sysemu.h"
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
void qemu_error(const char *fmt, ...)
53
{
54
    va_list args;
55

  
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;
68
    }
69
}
70

  
71
void qemu_error_internal(const char *file, int linenr, const char *func,
72
                         const char *fmt, ...)
73
{
74
    va_list va;
75
    QError *qerror;
76

  
77
    assert(qemu_error_sink != NULL);
78

  
79
    va_start(va, fmt);
80
    qerror = qerror_from_info(file, linenr, func, fmt, &va);
81
    va_end(va);
82

  
83
    switch (qemu_error_sink->dest) {
84
    case ERR_SINK_FILE:
85
        qerror_print(qerror);
86
        QDECREF(qerror);
87
        break;
88
    case ERR_SINK_MONITOR:
89
        monitor_set_error(qemu_error_sink->mon, qerror);
90
        break;
91
    }
92
}

Also available in: Unified diff