diff options
| author | Peter Maydell <peter.maydell@linaro.org> | 2016-05-24 12:21:07 +0100 |
|---|---|---|
| committer | Peter Maydell <peter.maydell@linaro.org> | 2016-05-24 12:21:07 +0100 |
| commit | 99694362ee563c5bbfad92bcc6bd578c0d4f7ce7 (patch) | |
| tree | bf6e256235405492bab498e558fe34118abba429 /migration/qjson.c | |
| parent | b0f6ef8915247f3230ffd9b71af9c3dadb6082c7 (diff) | |
| parent | fe904ea8242cbae2d7e69c052c754b8f5f1ba1d6 (diff) | |
| download | focaccia-qemu-99694362ee563c5bbfad92bcc6bd578c0d4f7ce7.tar.gz focaccia-qemu-99694362ee563c5bbfad92bcc6bd578c0d4f7ce7.zip | |
Merge remote-tracking branch 'remotes/amit-migration/tags/migration-2.7-1' into staging
migration fixes: - ensure src block devices continue fine after a failed migration - fail on migration blockers; helps 9p savevm/loadvm - move autoconverge commands out of experimental state - move the migration-specific qjson in migration/ # gpg: Signature made Mon 23 May 2016 18:15:09 BST using RSA key ID 657EF670 # gpg: Good signature from "Amit Shah <amit@amitshah.net>" # gpg: aka "Amit Shah <amit@kernel.org>" # gpg: aka "Amit Shah <amitshah@gmx.net>" * remotes/amit-migration/tags/migration-2.7-1: migration: regain control of images when migration fails to complete savevm: fail if migration blockers are present migration: Promote improved autoconverge commands out of experimental state migration/qjson: Drop gratuitous use of QOM migration: Move qjson.[ch] to migration/ Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'migration/qjson.c')
| -rw-r--r-- | migration/qjson.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/migration/qjson.c b/migration/qjson.c new file mode 100644 index 0000000000..5cae55af07 --- /dev/null +++ b/migration/qjson.c @@ -0,0 +1,113 @@ +/* + * A simple JSON writer + * + * Copyright Alexander Graf + * + * Authors: + * Alexander Graf <agraf@suse.de> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +/* + * Type QJSON lets you build JSON text. Its interface mirrors (a + * subset of) abstract JSON syntax. + * + * It does *not* detect incorrect use. It happily produces invalid + * JSON then. This is what migration wants. + * + * QAPI output visitors also produce JSON text. However, they do + * assert their preconditions and invariants, and therefore abort on + * incorrect use. + */ + +#include "qemu/osdep.h" +#include "qapi/qmp/qstring.h" +#include "migration/qjson.h" + +struct QJSON { + QString *str; + bool omit_comma; +}; + +static void json_emit_element(QJSON *json, const char *name) +{ + /* Check whether we need to print a , before an element */ + if (json->omit_comma) { + json->omit_comma = false; + } else { + qstring_append(json->str, ", "); + } + + if (name) { + qstring_append(json->str, "\""); + qstring_append(json->str, name); + qstring_append(json->str, "\" : "); + } +} + +void json_start_object(QJSON *json, const char *name) +{ + json_emit_element(json, name); + qstring_append(json->str, "{ "); + json->omit_comma = true; +} + +void json_end_object(QJSON *json) +{ + qstring_append(json->str, " }"); + json->omit_comma = false; +} + +void json_start_array(QJSON *json, const char *name) +{ + json_emit_element(json, name); + qstring_append(json->str, "[ "); + json->omit_comma = true; +} + +void json_end_array(QJSON *json) +{ + qstring_append(json->str, " ]"); + json->omit_comma = false; +} + +void json_prop_int(QJSON *json, const char *name, int64_t val) +{ + json_emit_element(json, name); + qstring_append_int(json->str, val); +} + +void json_prop_str(QJSON *json, const char *name, const char *str) +{ + json_emit_element(json, name); + qstring_append_chr(json->str, '"'); + qstring_append(json->str, str); + qstring_append_chr(json->str, '"'); +} + +const char *qjson_get_str(QJSON *json) +{ + return qstring_get_str(json->str); +} + +QJSON *qjson_new(void) +{ + QJSON *json = g_new0(QJSON, 1); + + json->str = qstring_from_str("{ "); + json->omit_comma = true; + return json; +} + +void qjson_finish(QJSON *json) +{ + json_end_object(json); +} + +void qjson_destroy(QJSON *json) +{ + g_free(json); +} |