diff options
author | Markus Armbruster <armbru@redhat.com> | 2020-12-11 18:11:37 +0100 |
---|---|---|
committer | Markus Armbruster <armbru@redhat.com> | 2020-12-19 10:38:43 +0100 |
commit | eab3a4678b07267c39e7290a6e9e7690b1d2a521 (patch) | |
tree | 223d43bbde1e59f4f6867a36e2dfdf0ca36603f3 /qga | |
parent | f1cc129df8341ebb6176363d24b57035bb5dabe4 (diff) |
qobject: Change qobject_to_json()'s value to GString
qobject_to_json() and qobject_to_json_pretty() build a GString, then
covert it to QString. Just one of the callers actually needs a
QString: qemu_rbd_parse_filename(). A few others need a string they
can modify: qmp_send_response(), qga's send_response(), to_json_str(),
and qmp_fd_vsend_fds(). The remainder just need a string.
Change qobject_to_json() and qobject_to_json_pretty() to return the
GString.
qemu_rbd_parse_filename() now has to convert to QString. All others
save a QString temporary. to_json_str() actually becomes a bit
simpler, because GString provides more convenient modification
functions.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20201211171152.146877-6-armbru@redhat.com>
Diffstat (limited to 'qga')
-rw-r--r-- | qga/main.c | 22 |
1 files changed, 7 insertions, 15 deletions
diff --git a/qga/main.c b/qga/main.c index dea6a3aa64..e7f8f3b161 100644 --- a/qga/main.c +++ b/qga/main.c @@ -22,7 +22,6 @@ #include "qapi/qmp/json-parser.h" #include "qapi/qmp/qdict.h" #include "qapi/qmp/qjson.h" -#include "qapi/qmp/qstring.h" #include "guest-agent-core.h" #include "qga-qapi-init-commands.h" #include "qapi/qmp/qerror.h" @@ -528,8 +527,7 @@ fail: static int send_response(GAState *s, const QDict *rsp) { - const char *buf; - QString *payload_qstr, *response_qstr; + GString *response; GIOStatus status; g_assert(s->channel); @@ -538,25 +536,19 @@ static int send_response(GAState *s, const QDict *rsp) return 0; } - payload_qstr = qobject_to_json(QOBJECT(rsp)); - if (!payload_qstr) { + response = qobject_to_json(QOBJECT(rsp)); + if (!response) { return -EINVAL; } if (s->delimit_response) { s->delimit_response = false; - response_qstr = qstring_new(); - qstring_append_chr(response_qstr, QGA_SENTINEL_BYTE); - qstring_append(response_qstr, qstring_get_str(payload_qstr)); - qobject_unref(payload_qstr); - } else { - response_qstr = payload_qstr; + g_string_prepend_c(response, QGA_SENTINEL_BYTE); } - qstring_append_chr(response_qstr, '\n'); - buf = qstring_get_str(response_qstr); - status = ga_channel_write_all(s->channel, buf, strlen(buf)); - qobject_unref(response_qstr); + g_string_append_c(response, '\n'); + status = ga_channel_write_all(s->channel, response->str, response->len); + g_string_free(response, true); if (status != G_IO_STATUS_NORMAL) { return -EIO; } |