]> git.proxmox.com Git - qemu.git/commitdiff
hmp: make memchar-read escape ASCII control chars except \n and \t
authorMarkus Armbruster <armbru@redhat.com>
Wed, 6 Feb 2013 20:27:26 +0000 (21:27 +0100)
committerAnthony Liguori <aliguori@us.ibm.com>
Wed, 6 Feb 2013 22:35:20 +0000 (16:35 -0600)
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
hmp-commands.hx
hmp.c

index 66ec716e03a08a59d090d4aef1353407f2d509ca..4c100d73695ccae9ab6cab86ff93725f9e8bc0eb 100644 (file)
@@ -869,6 +869,8 @@ STEXI
 @findex ringbuf_read
 Read and print up to @var{size} bytes from ring buffer character
 device @var{device}.
+Certain non-printable characters are printed \uXXXX, where XXXX is the
+character code in hexadecimal.  Character \ is printed \\.
 Bug: can screw up when the buffer contains invalid UTF-8 sequences,
 NUL characters, after the ring buffer lost data, and when reading
 stops because the size limit is reached.
diff --git a/hmp.c b/hmp.c
index cbd572753b6920530e4de948ef289182f90bc5df..420d48bea61a24112fbb9ece2c1fe0862567ade4 100644 (file)
--- a/hmp.c
+++ b/hmp.c
@@ -679,6 +679,7 @@ void hmp_ringbuf_read(Monitor *mon, const QDict *qdict)
     const char *chardev = qdict_get_str(qdict, "device");
     char *data;
     Error *errp = NULL;
+    int i;
 
     data = qmp_ringbuf_read(chardev, size, false, 0, &errp);
     if (errp) {
@@ -687,7 +688,19 @@ void hmp_ringbuf_read(Monitor *mon, const QDict *qdict)
         return;
     }
 
-    monitor_printf(mon, "%s\n", data);
+    for (i = 0; data[i]; i++) {
+        unsigned char ch = data[i];
+
+        if (ch == '\\') {
+            monitor_printf(mon, "\\\\");
+        } else if ((ch < 0x20 && ch != '\n' && ch != '\t') || ch == 0x7F) {
+            monitor_printf(mon, "\\u%04X", ch);
+        } else {
+            monitor_printf(mon, "%c", ch);
+        }
+
+    }
+    monitor_printf(mon, "\n");
     g_free(data);
 }