提交 98b9acf5 编写于 作者: J Jiri Denemark

remote: Auto-allocate params in remoteDeserializeTypedParameters

remoteDeserializeTypedParameters can now be called with either
preallocated params array (size of which is announced by nparams) or it
can allocate params array according to the number of parameters received
from the server.
上级 8eb7ab95
...@@ -1543,67 +1543,78 @@ static int ...@@ -1543,67 +1543,78 @@ static int
remoteDeserializeTypedParameters(remote_typed_param *ret_params_val, remoteDeserializeTypedParameters(remote_typed_param *ret_params_val,
u_int ret_params_len, u_int ret_params_len,
int limit, int limit,
virTypedParameterPtr params, virTypedParameterPtr *params,
int *nparams) int *nparams)
{ {
int i = 0; int i = 0;
int rv = -1; int rv = -1;
bool userAllocated = *params != NULL;
/* Check the length of the returned list carefully. */ if (userAllocated) {
if (ret_params_len > limit || ret_params_len > *nparams) { /* Check the length of the returned list carefully. */
virReportError(VIR_ERR_RPC, "%s", if (ret_params_len > limit || ret_params_len > *nparams) {
_("returned number of parameters exceeds limit")); virReportError(VIR_ERR_RPC, "%s",
goto cleanup; _("returned number of parameters exceeds limit"));
goto cleanup;
}
} else {
if (VIR_ALLOC_N(*params, ret_params_len) < 0) {
virReportOOMError();
goto cleanup;
}
} }
*nparams = ret_params_len; *nparams = ret_params_len;
/* Deserialise the result. */ /* Deserialise the result. */
for (i = 0; i < ret_params_len; ++i) { for (i = 0; i < ret_params_len; ++i) {
if (virStrcpyStatic(params[i].field, virTypedParameterPtr param = *params + i;
ret_params_val[i].field) == NULL) { remote_typed_param *ret_param = ret_params_val + i;
if (virStrcpyStatic(param->field,
ret_param->field) == NULL) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Parameter %s too big for destination"), _("Parameter %s too big for destination"),
ret_params_val[i].field); ret_param->field);
goto cleanup; goto cleanup;
} }
params[i].type = ret_params_val[i].value.type;
switch (params[i].type) { param->type = ret_param->value.type;
switch (param->type) {
case VIR_TYPED_PARAM_INT: case VIR_TYPED_PARAM_INT:
params[i].value.i = param->value.i =
ret_params_val[i].value.remote_typed_param_value_u.i; ret_param->value.remote_typed_param_value_u.i;
break; break;
case VIR_TYPED_PARAM_UINT: case VIR_TYPED_PARAM_UINT:
params[i].value.ui = param->value.ui =
ret_params_val[i].value.remote_typed_param_value_u.ui; ret_param->value.remote_typed_param_value_u.ui;
break; break;
case VIR_TYPED_PARAM_LLONG: case VIR_TYPED_PARAM_LLONG:
params[i].value.l = param->value.l =
ret_params_val[i].value.remote_typed_param_value_u.l; ret_param->value.remote_typed_param_value_u.l;
break; break;
case VIR_TYPED_PARAM_ULLONG: case VIR_TYPED_PARAM_ULLONG:
params[i].value.ul = param->value.ul =
ret_params_val[i].value.remote_typed_param_value_u.ul; ret_param->value.remote_typed_param_value_u.ul;
break; break;
case VIR_TYPED_PARAM_DOUBLE: case VIR_TYPED_PARAM_DOUBLE:
params[i].value.d = param->value.d =
ret_params_val[i].value.remote_typed_param_value_u.d; ret_param->value.remote_typed_param_value_u.d;
break; break;
case VIR_TYPED_PARAM_BOOLEAN: case VIR_TYPED_PARAM_BOOLEAN:
params[i].value.b = param->value.b =
ret_params_val[i].value.remote_typed_param_value_u.b; ret_param->value.remote_typed_param_value_u.b;
break; break;
case VIR_TYPED_PARAM_STRING: case VIR_TYPED_PARAM_STRING:
params[i].value.s = param->value.s =
strdup(ret_params_val[i].value.remote_typed_param_value_u.s); strdup(ret_param->value.remote_typed_param_value_u.s);
if (params[i].value.s == NULL) { if (!param->value.s) {
virReportOOMError(); virReportOOMError();
goto cleanup; goto cleanup;
} }
break; break;
default: default:
virReportError(VIR_ERR_RPC, _("unknown parameter type: %d"), virReportError(VIR_ERR_RPC, _("unknown parameter type: %d"),
params[i].type); param->type);
goto cleanup; goto cleanup;
} }
} }
...@@ -1611,8 +1622,14 @@ remoteDeserializeTypedParameters(remote_typed_param *ret_params_val, ...@@ -1611,8 +1622,14 @@ remoteDeserializeTypedParameters(remote_typed_param *ret_params_val,
rv = 0; rv = 0;
cleanup: cleanup:
if (rv < 0) if (rv < 0) {
virTypedParamsClear(params, i); if (userAllocated) {
virTypedParamsClear(*params, i);
} else {
virTypedParamsFree(*params, i);
*params = NULL;
}
}
return rv; return rv;
} }
...@@ -1698,7 +1715,7 @@ remoteDomainBlockStatsFlags(virDomainPtr domain, ...@@ -1698,7 +1715,7 @@ remoteDomainBlockStatsFlags(virDomainPtr domain,
if (remoteDeserializeTypedParameters(ret.params.params_val, if (remoteDeserializeTypedParameters(ret.params.params_val,
ret.params.params_len, ret.params.params_len,
REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX, REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX,
params, &params,
nparams) < 0) nparams) < 0)
goto cleanup; goto cleanup;
...@@ -1746,7 +1763,7 @@ remoteDomainGetMemoryParameters(virDomainPtr domain, ...@@ -1746,7 +1763,7 @@ remoteDomainGetMemoryParameters(virDomainPtr domain,
if (remoteDeserializeTypedParameters(ret.params.params_val, if (remoteDeserializeTypedParameters(ret.params.params_val,
ret.params.params_len, ret.params.params_len,
REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX, REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX,
params, &params,
nparams) < 0) nparams) < 0)
goto cleanup; goto cleanup;
...@@ -1794,7 +1811,7 @@ remoteDomainGetNumaParameters(virDomainPtr domain, ...@@ -1794,7 +1811,7 @@ remoteDomainGetNumaParameters(virDomainPtr domain,
if (remoteDeserializeTypedParameters(ret.params.params_val, if (remoteDeserializeTypedParameters(ret.params.params_val,
ret.params.params_len, ret.params.params_len,
REMOTE_DOMAIN_NUMA_PARAMETERS_MAX, REMOTE_DOMAIN_NUMA_PARAMETERS_MAX,
params, &params,
nparams) < 0) nparams) < 0)
goto cleanup; goto cleanup;
...@@ -1842,7 +1859,7 @@ remoteDomainGetBlkioParameters(virDomainPtr domain, ...@@ -1842,7 +1859,7 @@ remoteDomainGetBlkioParameters(virDomainPtr domain,
if (remoteDeserializeTypedParameters(ret.params.params_val, if (remoteDeserializeTypedParameters(ret.params.params_val,
ret.params.params_len, ret.params.params_len,
REMOTE_DOMAIN_BLKIO_PARAMETERS_MAX, REMOTE_DOMAIN_BLKIO_PARAMETERS_MAX,
params, &params,
nparams) < 0) nparams) < 0)
goto cleanup; goto cleanup;
...@@ -2658,7 +2675,7 @@ static int remoteDomainGetBlockIoTune(virDomainPtr domain, ...@@ -2658,7 +2675,7 @@ static int remoteDomainGetBlockIoTune(virDomainPtr domain,
if (remoteDeserializeTypedParameters(ret.params.params_val, if (remoteDeserializeTypedParameters(ret.params.params_val,
ret.params.params_len, ret.params.params_len,
REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX, REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX,
params, &params,
nparams) < 0) nparams) < 0)
goto cleanup; goto cleanup;
...@@ -2742,12 +2759,12 @@ static int remoteDomainGetCPUStats(virDomainPtr domain, ...@@ -2742,12 +2759,12 @@ static int remoteDomainGetCPUStats(virDomainPtr domain,
ncpus = ret.params.params_len / ret.nparams; ncpus = ret.params.params_len / ret.nparams;
for (cpu = 0; cpu < ncpus; cpu++) { for (cpu = 0; cpu < ncpus; cpu++) {
int tmp = nparams; int tmp = nparams;
virTypedParameterPtr cpu_params = &params[cpu * nparams];
remote_typed_param *stride = &ret.params.params_val[cpu * ret.nparams]; remote_typed_param *stride = &ret.params.params_val[cpu * ret.nparams];
if (remoteDeserializeTypedParameters(stride, ret.nparams, if (remoteDeserializeTypedParameters(stride, ret.nparams,
REMOTE_NODE_CPU_STATS_MAX, REMOTE_NODE_CPU_STATS_MAX,
&params[cpu * nparams], &cpu_params, &tmp) < 0)
&tmp) < 0)
goto cleanup; goto cleanup;
} }
...@@ -5648,7 +5665,7 @@ remoteDomainGetInterfaceParameters(virDomainPtr domain, ...@@ -5648,7 +5665,7 @@ remoteDomainGetInterfaceParameters(virDomainPtr domain,
if (remoteDeserializeTypedParameters(ret.params.params_val, if (remoteDeserializeTypedParameters(ret.params.params_val,
ret.params.params_len, ret.params.params_len,
REMOTE_DOMAIN_INTERFACE_PARAMETERS_MAX, REMOTE_DOMAIN_INTERFACE_PARAMETERS_MAX,
params, &params,
nparams) < 0) nparams) < 0)
goto cleanup; goto cleanup;
...@@ -5822,7 +5839,7 @@ remoteNodeGetMemoryParameters(virConnectPtr conn, ...@@ -5822,7 +5839,7 @@ remoteNodeGetMemoryParameters(virConnectPtr conn,
if (remoteDeserializeTypedParameters(ret.params.params_val, if (remoteDeserializeTypedParameters(ret.params.params_val,
ret.params.params_len, ret.params.params_len,
REMOTE_NODE_MEMORY_PARAMETERS_MAX, REMOTE_NODE_MEMORY_PARAMETERS_MAX,
params, &params,
nparams) < 0) nparams) < 0)
goto cleanup; goto cleanup;
......
...@@ -1343,7 +1343,7 @@ elsif ($opt_k) { ...@@ -1343,7 +1343,7 @@ elsif ($opt_k) {
push(@ret_list2, "if (remoteDeserializeTypedParameters(ret.$1.$1_val,\n" . push(@ret_list2, "if (remoteDeserializeTypedParameters(ret.$1.$1_val,\n" .
" ret.$1.$1_len,\n" . " ret.$1.$1_len,\n" .
" $2,\n" . " $2,\n" .
" $1,\n" . " &$1,\n" .
" n$1) < 0)\n" . " n$1) < 0)\n" .
" goto cleanup;\n"); " goto cleanup;\n");
$single_ret_cleanup = 1; $single_ret_cleanup = 1;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册