virJSONValuePtr virNetServerClientPreExecRestart(virNetServerClientPtr client) { virJSONValuePtr object = virJSONValueNewObject(); virJSONValuePtr child; if (!object) return NULL; virObjectLock(client); if (virJSONValueObjectAppendNumberUlong(object, "id", client->id) < 0) goto error; if (virJSONValueObjectAppendNumberInt(object, "auth", client->auth) < 0) goto error; if (virJSONValueObjectAppendBoolean(object, "readonly", client->readonly) < 0) goto error; if (virJSONValueObjectAppendNumberUint(object, "nrequests_max", client->nrequests_max) < 0) goto error; if (client->conn_time && virJSONValueObjectAppendNumberLong(object, "conn_time", client->conn_time) < 0) goto error; if (!(child = virNetSocketPreExecRestart(client->sock))) goto error; if (virJSONValueObjectAppend(object, "sock", child) < 0) { virJSONValueFree(child); goto error; } if (client->privateData && client->privateDataPreExecRestart) { if (!(child = client->privateDataPreExecRestart(client, client->privateData))) goto error; if (virJSONValueObjectAppend(object, "privateData", child) < 0) { virJSONValueFree(child); goto error; } } virObjectUnlock(client); return object; error: virObjectUnlock(client); virJSONValueFree(object); return NULL; }
int virJSONValueObjectAppendNull(virJSONValuePtr object, const char *key) { virJSONValuePtr jvalue = virJSONValueNewNull(); if (!jvalue) return -1; if (virJSONValueObjectAppend(object, key, jvalue) < 0) { virJSONValueFree(jvalue); return -1; } return 0; }
int virJSONValueObjectAppendBoolean(virJSONValuePtr object, const char *key, int boolean_) { virJSONValuePtr jvalue = virJSONValueNewBoolean(boolean_); if (!jvalue) return -1; if (virJSONValueObjectAppend(object, key, jvalue) < 0) { virJSONValueFree(jvalue); return -1; } return 0; }
int virJSONValueObjectAppendNumberDouble(virJSONValuePtr object, const char *key, double number) { virJSONValuePtr jvalue = virJSONValueNewNumberDouble(number); if (!jvalue) return -1; if (virJSONValueObjectAppend(object, key, jvalue) < 0) { virJSONValueFree(jvalue); return -1; } return 0; }
int virJSONValueObjectAppendNumberUlong(virJSONValuePtr object, const char *key, unsigned long long number) { virJSONValuePtr jvalue = virJSONValueNewNumberUlong(number); if (!jvalue) return -1; if (virJSONValueObjectAppend(object, key, jvalue) < 0) { virJSONValueFree(jvalue); return -1; } return 0; }
int virJSONValueObjectAppendString(virJSONValuePtr object, const char *key, const char *value) { virJSONValuePtr jvalue = virJSONValueNewString(value); if (!jvalue) return -1; if (virJSONValueObjectAppend(object, key, jvalue) < 0) { virJSONValueFree(jvalue); return -1; } return 0; }
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; }
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; }
static virJSONValuePtr ATTRIBUTE_SENTINEL qemuAgentMakeCommand(const char *cmdname, ...) { virJSONValuePtr obj; virJSONValuePtr jargs = NULL; va_list args; char *key; va_start(args, cmdname); if (!(obj = virJSONValueNewObject())) goto no_memory; if (virJSONValueObjectAppendString(obj, "execute", cmdname) < 0) goto no_memory; while ((key = va_arg(args, char *)) != NULL) { int ret; char type; if (strlen(key) < 3) { virReportError(VIR_ERR_INTERNAL_ERROR, _("argument key '%s' is too short, missing type prefix"), key); goto error; } /* Keys look like s:name the first letter is a type code */ type = key[0]; key += 2; if (!jargs && !(jargs = virJSONValueNewObject())) goto no_memory; /* This doesn't support maps/arrays. This hasn't * proved to be a problem..... yet :-) */ switch (type) { case 's': { char *val = va_arg(args, char *); ret = virJSONValueObjectAppendString(jargs, key, val); } break; case 'i': { int val = va_arg(args, int); ret = virJSONValueObjectAppendNumberInt(jargs, key, val); } break; case 'u': { unsigned int val = va_arg(args, unsigned int); ret = virJSONValueObjectAppendNumberUint(jargs, key, val); } break; case 'I': { long long val = va_arg(args, long long); ret = virJSONValueObjectAppendNumberLong(jargs, key, val); } break; case 'U': { /* qemu silently truncates numbers larger than LLONG_MAX, * so passing the full range of unsigned 64 bit integers * is not safe here. Pass them as signed 64 bit integers * instead. */ long long val = va_arg(args, long long); ret = virJSONValueObjectAppendNumberLong(jargs, key, val); } break; case 'd': { double val = va_arg(args, double); ret = virJSONValueObjectAppendNumberDouble(jargs, key, val); } break; case 'b': { int val = va_arg(args, int); ret = virJSONValueObjectAppendBoolean(jargs, key, val); } break; case 'n': { ret = virJSONValueObjectAppendNull(jargs, key); } break; case 'a': { virJSONValuePtr val = va_arg(args, virJSONValuePtr); ret = virJSONValueObjectAppend(jargs, key, val); } break; default: virReportError(VIR_ERR_INTERNAL_ERROR, _("unsupported data type '%c' for arg '%s'"), type, key - 2); goto error; } if (ret < 0) goto no_memory; } if (jargs && virJSONValueObjectAppend(obj, "arguments", jargs) < 0) goto no_memory; va_end(args); return obj; no_memory: virReportOOMError(); error: virJSONValueFree(obj); virJSONValueFree(jargs); va_end(args); return NULL; }