[10/15] QMP: Disable monitor print functions

Submitted by Luiz Capitulino on Nov. 19, 2009, 3:13 p.m.

Details

Message ID 1258643623-8636-11-git-send-email-lcapitulino@redhat.com
State New
Headers show

Commit Message

Luiz Capitulino Nov. 19, 2009, 3:13 p.m.
We still have handlers which will call monitor print functions
in several places.

If they do this when we are in control mode, we will be emitting
garbage to our clients.

To avoid this situation, this commit adds a way to disable
those functions. If any of them is called when in control mode,
we will emit a generic error.

Although this is far from the perfect solution, it guarantees
that only JSON is printed.

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 monitor.c |   14 +++++++++++---
 1 files changed, 11 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/monitor.c b/monitor.c
index dc4583f..e85f990 100644
--- a/monitor.c
+++ b/monitor.c
@@ -97,6 +97,7 @@  typedef struct MonitorControl {
     uint8_t buf[1024];
     int size;
     QObject *id;
+    int print_enabled;
 } MonitorControl;
 
 struct Monitor {
@@ -184,9 +185,13 @@  static void monitor_puts(Monitor *mon, const char *str)
 
 void monitor_vprintf(Monitor *mon, const char *fmt, va_list ap)
 {
-    char buf[4096];
-    vsnprintf(buf, sizeof(buf), fmt, ap);
-    monitor_puts(mon, buf);
+    if (mon->mc && !mon->mc->print_enabled) {
+        qemu_error_new(QERR_UNDEFINED_ERROR, "monitor print");
+    } else {
+        char buf[4096];
+        vsnprintf(buf, sizeof(buf), fmt, ap);
+        monitor_puts(mon, buf);
+    }
 }
 
 void monitor_printf(Monitor *mon, const char *fmt, ...)
@@ -270,7 +275,10 @@  static void monitor_json_emitter(Monitor *mon, const QObject *data)
     json = qobject_to_json(data);
     assert(json != NULL);
 
+    mon->mc->print_enabled = 1;
     monitor_printf(mon, "%s\n", qstring_get_str(json));
+    mon->mc->print_enabled = 0;
+
     QDECREF(json);
 }