static virJSONValuePtr qemuAgentMakeStringsArray(const char **strings, unsigned int len) { size_t i; virJSONValuePtr ret = virJSONValueNewArray(), str; if (!ret) return NULL; for (i = 0; i < len; i++) { str = virJSONValueNewString(strings[i]); if (!str) goto error; if (virJSONValueArrayAppend(ret, str) < 0) { virJSONValueFree(str); goto error; } } return ret; error: virJSONValueFree(ret); return NULL; }
/** * Set the VCPU state using guest agent. * * Returns -1 on error, ninfo in case everything was successful and less than * ninfo on a partial failure. */ int qemuAgentSetVCPUs(qemuAgentPtr mon, qemuAgentCPUInfoPtr info, size_t ninfo) { int ret = -1; virJSONValuePtr cmd = NULL; virJSONValuePtr reply = NULL; virJSONValuePtr cpus = NULL; virJSONValuePtr cpu = NULL; size_t i; /* create the key data array */ if (!(cpus = virJSONValueNewArray())) goto cleanup; for (i = 0; i < ninfo; i++) { qemuAgentCPUInfoPtr in = &info[i]; /* create single cpu object */ if (!(cpu = virJSONValueNewObject())) goto cleanup; if (virJSONValueObjectAppendNumberInt(cpu, "logical-id", in->id) < 0) goto cleanup; if (virJSONValueObjectAppendBoolean(cpu, "online", in->online) < 0) goto cleanup; if (virJSONValueArrayAppend(cpus, cpu) < 0) goto cleanup; cpu = NULL; } if (!(cmd = qemuAgentMakeCommand("guest-set-vcpus", "a:vcpus", cpus, NULL))) goto cleanup; cpus = NULL; if (qemuAgentCommand(mon, cmd, &reply, true, VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) goto cleanup; if (virJSONValueObjectGetNumberInt(reply, "return", &ret) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("malformed return value")); } cleanup: virJSONValueFree(cmd); virJSONValueFree(reply); virJSONValueFree(cpu); virJSONValueFree(cpus); return ret; }
static int virJSONParserInsertValue(virJSONParserPtr parser, virJSONValuePtr value) { if (!parser->head) { parser->head = value; } else { virJSONParserStatePtr state; if (!parser->nstate) { VIR_DEBUG("got a value to insert without a container"); return -1; } state = &parser->state[parser->nstate-1]; switch (state->value->type) { case VIR_JSON_TYPE_OBJECT: { if (!state->key) { VIR_DEBUG("missing key when inserting object value"); return -1; } if (virJSONValueObjectAppend(state->value, state->key, value) < 0) return -1; VIR_FREE(state->key); } break; case VIR_JSON_TYPE_ARRAY: { if (state->key) { VIR_DEBUG("unexpected key when inserting array value"); return -1; } if (virJSONValueArrayAppend(state->value, value) < 0) return -1; } break; default: VIR_DEBUG("unexpected value type, not a container"); return -1; } } return 0; }
static int testQEMUSchemaValidateObjectMergeVariantMember(size_t pos ATTRIBUTE_UNUSED, virJSONValuePtr item, void *opaque) { virJSONValuePtr array = opaque; virJSONValuePtr copy; if (!(copy = virJSONValueCopy(item))) return -1; if (virJSONValueArrayAppend(array, copy) < 0) return -1; return 1; }
virJSONValuePtr virNetDaemonPreExecRestart(virNetDaemonPtr dmn) { virJSONValuePtr object, srvArray = NULL; size_t i; virObjectLock(dmn); if (!(object = virJSONValueNewObject())) goto error; if (!(srvArray = virJSONValueNewArray()) || virJSONValueObjectAppend(object, "servers", srvArray) < 0) goto error; for (i = 0; i < dmn->nservers; i++) { virJSONValuePtr srvJSON = NULL; srvJSON = virNetServerPreExecRestart(dmn->servers[i]); if (!srvJSON) goto error; if (virJSONValueArrayAppend(srvArray, srvJSON) < 0) { virJSONValueFree(srvJSON); goto error; } } virObjectUnlock(dmn); return object; error: virJSONValueFree(object); virJSONValueFree(srvArray); virObjectUnlock(dmn); return NULL; }
virJSONValuePtr virNetServerPreExecRestart(virNetServerPtr srv) { virJSONValuePtr object; virJSONValuePtr clients; virJSONValuePtr services; size_t i; virObjectLock(srv); if (!(object = virJSONValueNewObject())) goto error; if (virJSONValueObjectAppendNumberUint(object, "min_workers", virThreadPoolGetMinWorkers(srv->workers)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot set min_workers data in JSON document")); goto error; } if (virJSONValueObjectAppendNumberUint(object, "max_workers", virThreadPoolGetMaxWorkers(srv->workers)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot set max_workers data in JSON document")); goto error; } if (virJSONValueObjectAppendNumberUint(object, "priority_workers", virThreadPoolGetPriorityWorkers(srv->workers)) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot set priority_workers data in JSON document")); goto error; } if (virJSONValueObjectAppendNumberUint(object, "max_clients", srv->nclients_max) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot set max_clients data in JSON document")); goto error; } if (virJSONValueObjectAppendNumberUint(object, "max_anonymous_clients", srv->nclients_unauth_max) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot set max_anonymous_clients data in JSON document")); goto error; } if (virJSONValueObjectAppendNumberUint(object, "keepaliveInterval", srv->keepaliveInterval) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot set keepaliveInterval data in JSON document")); goto error; } if (virJSONValueObjectAppendNumberUint(object, "keepaliveCount", srv->keepaliveCount) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot set keepaliveCount data in JSON document")); goto error; } if (virJSONValueObjectAppendBoolean(object, "keepaliveRequired", srv->keepaliveRequired) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot set keepaliveRequired data in JSON document")); goto error; } if (srv->mdnsGroupName && virJSONValueObjectAppendString(object, "mdnsGroupName", srv->mdnsGroupName) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot set mdnsGroupName data in JSON document")); goto error; } services = virJSONValueNewArray(); if (virJSONValueObjectAppend(object, "services", services) < 0) { virJSONValueFree(services); goto error; } for (i = 0; i < srv->nservices; i++) { virJSONValuePtr child; if (!(child = virNetServerServicePreExecRestart(srv->services[i]))) goto error; if (virJSONValueArrayAppend(services, child) < 0) { virJSONValueFree(child); goto error; } } clients = virJSONValueNewArray(); if (virJSONValueObjectAppend(object, "clients", clients) < 0) { virJSONValueFree(clients); goto error; } for (i = 0; i < srv->nclients; i++) { virJSONValuePtr child; if (!(child = virNetServerClientPreExecRestart(srv->clients[i]))) goto error; if (virJSONValueArrayAppend(clients, child) < 0) { virJSONValueFree(child); goto error; } } virObjectUnlock(srv); return object; error: virJSONValueFree(object); virObjectUnlock(srv); return NULL; }