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>
This commit is contained in:
parent
de1cc36e10
commit
543f34126b
@ -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.
|
||||
|
15
hmp.c
15
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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user