int virTypedParamsCopy(virTypedParameterPtr *dst, virTypedParameterPtr src, int nparams) { size_t i; *dst = NULL; if (!src || nparams <= 0) return 0; if (VIR_ALLOC_N(*dst, nparams) < 0) return -1; for (i = 0; i < nparams; i++) { ignore_value(virStrcpyStatic((*dst)[i].field, src[i].field)); (*dst)[i].type = src[i].type; if (src[i].type == VIR_TYPED_PARAM_STRING) { if (VIR_STRDUP((*dst)[i].value.s, src[i].value.s) < 0) { virTypedParamsFree(*dst, i - 1); *dst = NULL; return -1; } } else { (*dst)[i].value = src[i].value; } } return 0; }
static int adminDispatchClientGetInfo(virNetServerPtr server ATTRIBUTE_UNUSED, virNetServerClientPtr client, virNetMessagePtr msg ATTRIBUTE_UNUSED, virNetMessageErrorPtr rerr, struct admin_client_get_info_args *args, struct admin_client_get_info_ret *ret) { int rv = -1; virNetServerPtr srv = NULL; virNetServerClientPtr clnt = NULL; virTypedParameterPtr params = NULL; int nparams = 0; struct daemonAdmClientPrivate *priv = virNetServerClientGetPrivateData(client); if (!(srv = virNetDaemonGetServer(priv->dmn, args->clnt.srv.name))) { virReportError(VIR_ERR_NO_SERVER, _("no server with matching name '%s' found"), args->clnt.srv.name); goto cleanup; } if (!(clnt = virNetServerGetClient(srv, args->clnt.id))) { virReportError(VIR_ERR_NO_CLIENT, _("no client with matching id '%llu' found"), (unsigned long long) args->clnt.id); goto cleanup; } if (adminClientGetInfo(clnt, ¶ms, &nparams, args->flags) < 0) goto cleanup; if (nparams > ADMIN_CLIENT_INFO_PARAMETERS_MAX) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Number of client info parameters %d exceeds max " "allowed limit: %d"), nparams, ADMIN_CLIENT_INFO_PARAMETERS_MAX); goto cleanup; } if (virTypedParamsSerialize(params, nparams, (virTypedParameterRemotePtr *) &ret->params.params_val, &ret->params.params_len, VIR_TYPED_PARAM_STRING_OKAY) < 0) goto cleanup; rv = 0; cleanup: if (rv < 0) virNetMessageSaveError(rerr); virTypedParamsFree(params, nparams); virObjectUnref(clnt); virObjectUnref(srv); return rv; }
static int adminDispatchServerGetThreadpoolParameters(virNetServerPtr server ATTRIBUTE_UNUSED, virNetServerClientPtr client, virNetMessagePtr msg ATTRIBUTE_UNUSED, virNetMessageErrorPtr rerr, struct admin_server_get_threadpool_parameters_args *args, struct admin_server_get_threadpool_parameters_ret *ret) { int rv = -1; virNetServerPtr srv = NULL; virTypedParameterPtr params = NULL; int nparams = 0; struct daemonAdmClientPrivate *priv = virNetServerClientGetPrivateData(client); if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name))) goto cleanup; if (adminServerGetThreadPoolParameters(srv, ¶ms, &nparams, args->flags) < 0) goto cleanup; if (nparams > ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Number of threadpool parameters %d exceeds max " "allowed limit: %d"), nparams, ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX); goto cleanup; } if (virTypedParamsSerialize(params, nparams, (virTypedParameterRemotePtr *) &ret->params.params_val, &ret->params.params_len, 0) < 0) goto cleanup; rv = 0; cleanup: if (rv < 0) virNetMessageSaveError(rerr); virTypedParamsFree(params, nparams); virObjectUnref(srv); return rv; }
static int adminDispatchServerSetThreadpoolParameters(virNetServerPtr server ATTRIBUTE_UNUSED, virNetServerClientPtr client, virNetMessagePtr msg ATTRIBUTE_UNUSED, virNetMessageErrorPtr rerr, struct admin_server_set_threadpool_parameters_args *args) { int rv = -1; virNetServerPtr srv = NULL; virTypedParameterPtr params = NULL; int nparams = 0; struct daemonAdmClientPrivate *priv = virNetServerClientGetPrivateData(client); if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name))) { virReportError(VIR_ERR_NO_SERVER, _("no server with matching name '%s' found"), args->srv.name); goto cleanup; } if (virTypedParamsDeserialize((virTypedParameterRemotePtr) args->params.params_val, args->params.params_len, ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX, ¶ms, &nparams) < 0) goto cleanup; if (adminServerSetThreadPoolParameters(srv, params, nparams, args->flags) < 0) goto cleanup; rv = 0; cleanup: if (rv < 0) virNetMessageSaveError(rerr); virTypedParamsFree(params, nparams); virObjectUnref(srv); return rv; }
int adminServerGetClientLimits(virNetServerPtr srv, virTypedParameterPtr *params, int *nparams, unsigned int flags) { int ret = -1; int maxparams = 0; virTypedParameterPtr tmpparams = NULL; virCheckFlags(0, -1); if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams, VIR_SERVER_CLIENTS_MAX, virNetServerGetMaxClients(srv)) < 0) goto cleanup; if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams, VIR_SERVER_CLIENTS_CURRENT, virNetServerGetCurrentClients(srv)) < 0) goto cleanup; if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams, VIR_SERVER_CLIENTS_UNAUTH_MAX, virNetServerGetMaxUnauthClients(srv)) < 0) goto cleanup; if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams, VIR_SERVER_CLIENTS_UNAUTH_CURRENT, virNetServerGetCurrentUnauthClients(srv)) < 0) goto cleanup; *params = tmpparams; tmpparams = NULL; ret = 0; cleanup: virTypedParamsFree(tmpparams, *nparams); return ret; }
static int do_top(virConnectPtr conn, const char *dom_name, unsigned int milliseconds) { int ret = -1; virDomainPtr dom; int max_id = 0; int nparams = 0, then_nparams = 0, now_nparams = 0; virTypedParameterPtr then_params = NULL, now_params = NULL; /* Lookup the domain */ if (!(dom = virDomainLookupByName(conn, dom_name))) { ERROR("Unable to find domain '%s'", dom_name); goto cleanup; } /* and see how many vCPUs can we fetch stats for */ if ((max_id = virDomainGetCPUStats(dom, NULL, 0, 0, 0, 0)) < 0) { ERROR("Unable to get cpu stats"); goto cleanup; } /* how many stats can we get for a vCPU? */ if ((nparams = virDomainGetCPUStats(dom, NULL, 0, 0, 1, 0)) < 0) { ERROR("Unable to get cpu stats"); goto cleanup; } if (!(now_params = calloc(nparams * max_id, sizeof(*now_params))) || !(then_params = calloc(nparams * max_id, sizeof(*then_params)))) { ERROR("Unable to allocate memory"); goto cleanup; } /* The ideal program would use sigaction to set this handler, but * this way is portable to mingw. */ signal(SIGTERM, stop); signal(SIGINT, stop); run_top = true; while (run_top) { struct timeval then, now; /* Get current time */ if (gettimeofday(&then, NULL) < 0) { ERROR("unable to get time"); goto cleanup; } /* And current stats */ if ((then_nparams = virDomainGetCPUStats(dom, then_params, nparams, 0, max_id, 0)) < 0) { ERROR("Unable to get cpu stats"); goto cleanup; } /* Now sleep some time */ usleep(milliseconds * 1000); /* usleep expects microseconds */ /* And get current time */ if (gettimeofday(&now, NULL) < 0) { ERROR("unable to get time"); goto cleanup; } /* And current stats */ if ((now_nparams = virDomainGetCPUStats(dom, now_params, nparams, 0, max_id, 0)) < 0) { ERROR("Unable to get cpu stats"); goto cleanup; } print_cpu_usage(0, max_id, then.tv_sec * 1000000 + then.tv_usec, then_params, then_nparams, now.tv_sec * 1000000 + now.tv_usec, now_params, now_nparams); virTypedParamsClear(now_params, now_nparams * max_id); virTypedParamsClear(then_params, then_nparams * max_id); } ret = 0; cleanup: virTypedParamsFree(now_params, nparams * max_id); virTypedParamsFree(then_params, nparams * max_id); if (dom) virDomainFree(dom); return ret; }
int adminServerGetThreadPoolParameters(virNetServerPtr srv, virTypedParameterPtr *params, int *nparams, unsigned int flags) { int ret = -1; int maxparams = 0; size_t minWorkers; size_t maxWorkers; size_t nWorkers; size_t freeWorkers; size_t nPrioWorkers; size_t jobQueueDepth; virTypedParameterPtr tmpparams = NULL; virCheckFlags(0, -1); if (virNetServerGetThreadPoolParameters(srv, &minWorkers, &maxWorkers, &nWorkers, &freeWorkers, &nPrioWorkers, &jobQueueDepth) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to retrieve threadpool parameters")); goto cleanup; } if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams, VIR_THREADPOOL_WORKERS_MIN, minWorkers) < 0) goto cleanup; if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams, VIR_THREADPOOL_WORKERS_MAX, maxWorkers) < 0) goto cleanup; if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams, VIR_THREADPOOL_WORKERS_CURRENT, nWorkers) < 0) goto cleanup; if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams, VIR_THREADPOOL_WORKERS_FREE, freeWorkers) < 0) goto cleanup; if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams, VIR_THREADPOOL_WORKERS_PRIORITY, nPrioWorkers) < 0) goto cleanup; if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams, VIR_THREADPOOL_JOB_QUEUE_DEPTH, jobQueueDepth) < 0) goto cleanup; *params = tmpparams; tmpparams = NULL; ret = 0; cleanup: virTypedParamsFree(tmpparams, *nparams); return ret; }