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
|
@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
15
hmp.c
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user