On 02/23/2017 03:44 PM, Markus Armbruster wrote: > The next commit is going to add a test that calls qmp("null"). > Curiously, this hangs. Here's why. > > qmp_fd_sendv() doesn't send newlines. Not even when @fmt contains > some. At first glance, the QMP parser seems to be fine with that. > However, it turns out that it fails to react to input until it sees > either a newline, an object or an array. To reproduce, feed to a QMP > monitor like this: >
> > Work around this QMP bug by having qmp_fd_sendv() append a newline. > > Signed-off-by: Markus Armbruster <arm...@redhat.com> > --- > tests/libqtest.c | 12 +++++++++--- > 1 file changed, 9 insertions(+), 3 deletions(-) > > +++ b/tests/libqtest.c > @@ -442,14 +442,20 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap) > if (qobj) { > int log = getenv("QTEST_LOG") != NULL; > QString *qstr = qobject_to_json(qobj); > - const char *str = qstring_get_str(qstr); > - size_t size = qstring_get_length(qstr); > + const char *str; > + > + /* > + * BUG: QMP doesn't react to input until it sees a newline, an > + * object, or an array. Work-around: give it a newline. > + */ > + qstring_append_chr(qstr, '\n'); > + str = qstring_get_str(qstr); > > if (log) { > fprintf(stderr, "%s", str); Bonus - the log now has newlines, too :) > } > /* Send QMP request */ > - socket_send(fd, str, size); > + socket_send(fd, str, qstring_get_length(qstr)); Reviewed-by: Eric Blake <ebl...@redhat.com> -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature