Annotation of qemu/qapi/qmp-dispatch.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Core Definitions for QAPI/QMP Dispatch
        !             3:  *
        !             4:  * Copyright IBM, Corp. 2011
        !             5:  *
        !             6:  * Authors:
        !             7:  *  Anthony Liguori   <[email protected]>
        !             8:  *
        !             9:  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
        !            10:  * See the COPYING.LIB file in the top-level directory.
        !            11:  *
        !            12:  */
        !            13: 
        !            14: #include "qemu-objects.h"
        !            15: #include "qapi/qmp-core.h"
        !            16: #include "json-parser.h"
        !            17: #include "error.h"
        !            18: #include "error_int.h"
        !            19: #include "qerror.h"
        !            20: 
        !            21: static QDict *qmp_dispatch_check_obj(const QObject *request, Error **errp)
        !            22: {
        !            23:     const QDictEntry *ent;
        !            24:     const char *arg_name;
        !            25:     const QObject *arg_obj;
        !            26:     bool has_exec_key = false;
        !            27:     QDict *dict = NULL;
        !            28: 
        !            29:     if (qobject_type(request) != QTYPE_QDICT) {
        !            30:         error_set(errp, QERR_QMP_BAD_INPUT_OBJECT,
        !            31:                   "request is not a dictionary");
        !            32:         return NULL;
        !            33:     }
        !            34: 
        !            35:     dict = qobject_to_qdict(request);
        !            36: 
        !            37:     for (ent = qdict_first(dict); ent;
        !            38:          ent = qdict_next(dict, ent)) {
        !            39:         arg_name = qdict_entry_key(ent);
        !            40:         arg_obj = qdict_entry_value(ent);
        !            41: 
        !            42:         if (!strcmp(arg_name, "execute")) {
        !            43:             if (qobject_type(arg_obj) != QTYPE_QSTRING) {
        !            44:                 error_set(errp, QERR_QMP_BAD_INPUT_OBJECT_MEMBER, "execute",
        !            45:                           "string");
        !            46:                 return NULL;
        !            47:             }
        !            48:             has_exec_key = true;
        !            49:         } else if (strcmp(arg_name, "arguments")) {
        !            50:             error_set(errp, QERR_QMP_EXTRA_MEMBER, arg_name);
        !            51:             return NULL;
        !            52:         }
        !            53:     }
        !            54: 
        !            55:     if (!has_exec_key) {
        !            56:         error_set(errp, QERR_QMP_BAD_INPUT_OBJECT, "execute");
        !            57:         return NULL;
        !            58:     }
        !            59: 
        !            60:     return dict;
        !            61: }
        !            62: 
        !            63: static QObject *do_qmp_dispatch(QObject *request, Error **errp)
        !            64: {
        !            65:     const char *command;
        !            66:     QDict *args, *dict;
        !            67:     QmpCommand *cmd;
        !            68:     QObject *ret = NULL;
        !            69: 
        !            70: 
        !            71:     dict = qmp_dispatch_check_obj(request, errp);
        !            72:     if (!dict || error_is_set(errp)) {
        !            73:         return NULL;
        !            74:     }
        !            75: 
        !            76:     command = qdict_get_str(dict, "execute");
        !            77:     cmd = qmp_find_command(command);
        !            78:     if (cmd == NULL) {
        !            79:         error_set(errp, QERR_COMMAND_NOT_FOUND, command);
        !            80:         return NULL;
        !            81:     }
        !            82: 
        !            83:     if (!qdict_haskey(dict, "arguments")) {
        !            84:         args = qdict_new();
        !            85:     } else {
        !            86:         args = qdict_get_qdict(dict, "arguments");
        !            87:         QINCREF(args);
        !            88:     }
        !            89: 
        !            90:     switch (cmd->type) {
        !            91:     case QCT_NORMAL:
        !            92:         cmd->fn(args, &ret, errp);
        !            93:         if (!error_is_set(errp) && ret == NULL) {
        !            94:             ret = QOBJECT(qdict_new());
        !            95:         }
        !            96:         break;
        !            97:     }
        !            98: 
        !            99:     QDECREF(args);
        !           100: 
        !           101:     return ret;
        !           102: }
        !           103: 
        !           104: QObject *qmp_dispatch(QObject *request)
        !           105: {
        !           106:     Error *err = NULL;
        !           107:     QObject *ret;
        !           108:     QDict *rsp;
        !           109: 
        !           110:     ret = do_qmp_dispatch(request, &err);
        !           111: 
        !           112:     rsp = qdict_new();
        !           113:     if (err) {
        !           114:         qdict_put_obj(rsp, "error", error_get_qobject(err));
        !           115:         error_free(err);
        !           116:     } else if (ret) {
        !           117:         qdict_put_obj(rsp, "return", ret);
        !           118:     } else {
        !           119:         QDECREF(rsp);
        !           120:         return NULL;
        !           121:     }
        !           122: 
        !           123:     return QOBJECT(rsp);
        !           124: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.