hmp: make memchar-read escape ASCII control chars except \n and \t

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
master
Markus Armbruster 2013-02-06 21:27:26 +01:00 committed by Anthony Liguori
parent de1cc36e10
commit 543f34126b
2 changed files with 16 additions and 1 deletions

View File

@ -869,6 +869,8 @@ STEXI
@findex ringbuf_read @findex ringbuf_read
Read and print up to @var{size} bytes from ring buffer character Read and print up to @var{size} bytes from ring buffer character
device @var{device}. 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, Bug: can screw up when the buffer contains invalid UTF-8 sequences,
NUL characters, after the ring buffer lost data, and when reading NUL characters, after the ring buffer lost data, and when reading
stops because the size limit is reached. stops because the size limit is reached.

15
hmp.c
View File

@ -679,6 +679,7 @@ void hmp_ringbuf_read(Monitor *mon, const QDict *qdict)
const char *chardev = qdict_get_str(qdict, "device"); const char *chardev = qdict_get_str(qdict, "device");
char *data; char *data;
Error *errp = NULL; Error *errp = NULL;
int i;
data = qmp_ringbuf_read(chardev, size, false, 0, &errp); data = qmp_ringbuf_read(chardev, size, false, 0, &errp);
if (errp) { if (errp) {
@ -687,7 +688,19 @@ void hmp_ringbuf_read(Monitor *mon, const QDict *qdict)
return; 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); g_free(data);
} }