static void make_nonnull_nwfilter(remote_nonnull_nwfilter *net_dst, virNWFilterPtr nwfilter_src);
static void make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *snapshot_dst, virDomainSnapshotPtr snapshot_src);
-static int
-remoteSerializeTypedParameters(virTypedParameterPtr params,
- int nparams,
- remote_typed_param **ret_params_val,
- u_int *ret_params_len,
- unsigned int flags);
-
static int
remoteSerializeDomainDiskErrors(virDomainDiskErrorPtr errors,
int nerrors,
data.callbackID = callback->callbackID;
make_nonnull_domain(&data.dom, dom);
- if (remoteSerializeTypedParameters(params, nparams,
- &data.params.params_val,
- &data.params.params_len,
- VIR_TYPED_PARAM_STRING_OKAY) < 0)
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &data.params.params_val,
+ &data.params.params_len,
+ VIR_TYPED_PARAM_STRING_OKAY) < 0)
return -1;
remoteDispatchObjectEventSend(callback->client, remoteProgram,
return rv;
}
-/* Helper to serialize typed parameters. This also filters out any string
- * parameters that must not be returned to older clients. */
-static int
-remoteSerializeTypedParameters(virTypedParameterPtr params,
- int nparams,
- remote_typed_param **ret_params_val,
- u_int *ret_params_len,
- unsigned int flags)
-{
- size_t i;
- size_t j;
- int rv = -1;
- remote_typed_param *val;
-
- *ret_params_len = nparams;
- if (VIR_ALLOC_N(val, nparams) < 0)
- goto cleanup;
-
- for (i = 0, j = 0; i < nparams; ++i) {
- /* virDomainGetCPUStats can return a sparse array; also, we
- * can't pass back strings to older clients. */
- if (!params[i].type ||
- (!(flags & VIR_TYPED_PARAM_STRING_OKAY) &&
- params[i].type == VIR_TYPED_PARAM_STRING)) {
- --*ret_params_len;
- continue;
- }
-
- /* remoteDispatchClientRequest will free this: */
- if (VIR_STRDUP(val[j].field, params[i].field) < 0)
- goto cleanup;
- val[j].value.type = params[i].type;
- switch (params[i].type) {
- case VIR_TYPED_PARAM_INT:
- val[j].value.remote_typed_param_value_u.i = params[i].value.i;
- break;
- case VIR_TYPED_PARAM_UINT:
- val[j].value.remote_typed_param_value_u.ui = params[i].value.ui;
- break;
- case VIR_TYPED_PARAM_LLONG:
- val[j].value.remote_typed_param_value_u.l = params[i].value.l;
- break;
- case VIR_TYPED_PARAM_ULLONG:
- val[j].value.remote_typed_param_value_u.ul = params[i].value.ul;
- break;
- case VIR_TYPED_PARAM_DOUBLE:
- val[j].value.remote_typed_param_value_u.d = params[i].value.d;
- break;
- case VIR_TYPED_PARAM_BOOLEAN:
- val[j].value.remote_typed_param_value_u.b = params[i].value.b;
- break;
- case VIR_TYPED_PARAM_STRING:
- if (VIR_STRDUP(val[j].value.remote_typed_param_value_u.s, params[i].value.s) < 0)
- goto cleanup;
- break;
- default:
- virReportError(VIR_ERR_RPC, _("unknown parameter type: %d"),
- params[i].type);
- goto cleanup;
- }
- j++;
- }
-
- *ret_params_val = val;
- val = NULL;
- rv = 0;
-
- cleanup:
- if (val) {
- for (i = 0; i < nparams; i++) {
- VIR_FREE(val[i].field);
- if (val[i].value.type == VIR_TYPED_PARAM_STRING)
- VIR_FREE(val[i].value.remote_typed_param_value_u.s);
- }
- VIR_FREE(val);
- }
- return rv;
-}
-
static int
remoteDispatchDomainGetSchedulerParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
virNetServerClientPtr client ATTRIBUTE_UNUSED,
if (virDomainGetSchedulerParameters(dom, params, &nparams) < 0)
goto cleanup;
- if (remoteSerializeTypedParameters(params, nparams,
- &ret->params.params_val,
- &ret->params.params_len,
- 0) < 0)
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &ret->params.params_val,
+ &ret->params.params_len,
+ 0) < 0)
goto cleanup;
rv = 0;
args->flags) < 0)
goto cleanup;
- if (remoteSerializeTypedParameters(params, nparams,
- &ret->params.params_val,
- &ret->params.params_len,
- args->flags) < 0)
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &ret->params.params_val,
+ &ret->params.params_len,
+ args->flags) < 0)
goto cleanup;
rv = 0;
goto success;
}
- /* Serialise the block stats. */
- if (remoteSerializeTypedParameters(params, nparams,
- &ret->params.params_val,
- &ret->params.params_len,
- args->flags) < 0)
+ /* Serialize the block stats. */
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &ret->params.params_val,
+ &ret->params.params_len,
+ args->flags) < 0)
goto cleanup;
success:
goto success;
}
- if (remoteSerializeTypedParameters(params, nparams,
- &ret->params.params_val,
- &ret->params.params_len,
- args->flags) < 0)
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &ret->params.params_val,
+ &ret->params.params_len,
+ args->flags) < 0)
goto cleanup;
success:
goto success;
}
- if (remoteSerializeTypedParameters(params, nparams,
- &ret->params.params_val,
- &ret->params.params_len,
- flags) < 0)
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &ret->params.params_val,
+ &ret->params.params_len,
+ flags) < 0)
goto cleanup;
success:
goto success;
}
- if (remoteSerializeTypedParameters(params, nparams,
- &ret->params.params_val,
- &ret->params.params_len,
- args->flags) < 0)
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &ret->params.params_val,
+ &ret->params.params_len,
+ args->flags) < 0)
goto cleanup;
success:
goto success;
}
- /* Serialise the block I/O tuning parameters. */
- if (remoteSerializeTypedParameters(params, nparams,
- &ret->params.params_val,
- &ret->params.params_len,
- args->flags) < 0)
+ /* Serialize the block I/O tuning parameters. */
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &ret->params.params_val,
+ &ret->params.params_len,
+ args->flags) < 0)
goto cleanup;
success:
goto success;
}
- if (remoteSerializeTypedParameters(params, nparams,
- &ret->params.params_val,
- &ret->params.params_len,
- flags) < 0)
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &ret->params.params_val,
+ &ret->params.params_len,
+ flags) < 0)
goto cleanup;
success:
if (args->nparams == 0)
goto success;
- if (remoteSerializeTypedParameters(params, args->nparams * args->ncpus,
- &ret->params.params_val,
- &ret->params.params_len,
- args->flags) < 0)
+ if (virTypedParamsSerialize(params, args->nparams * args->ncpus,
+ (virTypedParameterRemotePtr *) &ret->params.params_val,
+ &ret->params.params_len,
+ args->flags) < 0)
goto cleanup;
success:
goto success;
}
- if (remoteSerializeTypedParameters(params, nparams,
- &ret->params.params_val,
- &ret->params.params_len,
- args->flags) < 0)
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &ret->params.params_val,
+ &ret->params.params_len,
+ args->flags) < 0)
goto cleanup;
success:
goto cleanup;
}
- if (remoteSerializeTypedParameters(params, nparams,
- &ret->params.params_val,
- &ret->params.params_len,
- 0) < 0)
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &ret->params.params_val,
+ &ret->params.params_len,
+ 0) < 0)
goto cleanup;
rv = 0;
make_nonnull_domain(&dst->dom, retStats[i]->dom);
- if (remoteSerializeTypedParameters(retStats[i]->params,
- retStats[i]->nparams,
- &dst->params.params_val,
- &dst->params.params_len,
- VIR_TYPED_PARAM_STRING_OKAY) < 0)
+ if (virTypedParamsSerialize(retStats[i]->params,
+ retStats[i]->nparams,
+ (virTypedParameterRemotePtr *) &dst->params.params_val,
+ &dst->params.params_len,
+ VIR_TYPED_PARAM_STRING_OKAY) < 0)
goto cleanup;
}
} else {
return rv;
}
-/* Helper to serialize typed parameters. */
-static int
-remoteSerializeTypedParameters(virTypedParameterPtr params,
- int nparams,
- remote_typed_param **args_params_val,
- u_int *args_params_len)
-{
- size_t i;
- int rv = -1;
- remote_typed_param *val;
-
- *args_params_len = nparams;
- if (VIR_ALLOC_N(val, nparams) < 0)
- goto cleanup;
-
- for (i = 0; i < nparams; ++i) {
- /* call() will free this: */
- if (VIR_STRDUP(val[i].field, params[i].field) < 0)
- goto cleanup;
- val[i].value.type = params[i].type;
- switch (params[i].type) {
- case VIR_TYPED_PARAM_INT:
- val[i].value.remote_typed_param_value_u.i = params[i].value.i;
- break;
- case VIR_TYPED_PARAM_UINT:
- val[i].value.remote_typed_param_value_u.ui = params[i].value.ui;
- break;
- case VIR_TYPED_PARAM_LLONG:
- val[i].value.remote_typed_param_value_u.l = params[i].value.l;
- break;
- case VIR_TYPED_PARAM_ULLONG:
- val[i].value.remote_typed_param_value_u.ul = params[i].value.ul;
- break;
- case VIR_TYPED_PARAM_DOUBLE:
- val[i].value.remote_typed_param_value_u.d = params[i].value.d;
- break;
- case VIR_TYPED_PARAM_BOOLEAN:
- val[i].value.remote_typed_param_value_u.b = params[i].value.b;
- break;
- case VIR_TYPED_PARAM_STRING:
- if (VIR_STRDUP(val[i].value.remote_typed_param_value_u.s,
- params[i].value.s) < 0)
- goto cleanup;
- break;
- default:
- virReportError(VIR_ERR_RPC, _("unknown parameter type: %d"),
- params[i].type);
- goto cleanup;
- }
- }
-
- *args_params_val = val;
- val = NULL;
- rv = 0;
-
- cleanup:
- virTypedParamsRemoteFree((virTypedParameterRemotePtr) val, nparams);
- return rv;
-}
-
static int
remoteDeserializeDomainDiskErrors(remote_domain_disk_error *ret_errors_val,
u_int ret_errors_len,
goto cleanup;
}
- if (remoteSerializeTypedParameters(params, nparams,
- &args.params.params_val,
- &args.params.params_len) < 0) {
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &args.params.params_val,
+ &args.params.params_len, 0) < 0) {
xdr_free((xdrproc_t) xdr_remote_domain_migrate_begin3_params_args,
(char *) &args);
goto cleanup;
goto cleanup;
}
- if (remoteSerializeTypedParameters(params, nparams,
- &args.params.params_val,
- &args.params.params_len) < 0) {
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &args.params.params_val,
+ &args.params.params_len, 0) < 0) {
xdr_free((xdrproc_t) xdr_remote_domain_migrate_prepare3_params_args,
(char *) &args);
goto cleanup;
args.cookie_in.cookie_in_len = cookieinlen;
args.flags = flags;
- if (remoteSerializeTypedParameters(params, nparams,
- &args.params.params_val,
- &args.params.params_len) < 0) {
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &args.params.params_val,
+ &args.params.params_len, 0) < 0) {
xdr_free((xdrproc_t) xdr_remote_domain_migrate_prepare_tunnel3_params_args,
(char *) &args);
goto cleanup;
args.cookie_in.cookie_in_len = cookieinlen;
args.flags = flags;
- if (remoteSerializeTypedParameters(params, nparams,
- &args.params.params_val,
- &args.params.params_len) < 0) {
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &args.params.params_val,
+ &args.params.params_len, 0) < 0) {
xdr_free((xdrproc_t) xdr_remote_domain_migrate_perform3_params_args,
(char *) &args);
goto cleanup;
args.flags = flags;
args.cancelled = cancelled;
- if (remoteSerializeTypedParameters(params, nparams,
- &args.params.params_val,
- &args.params.params_len) < 0) {
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &args.params.params_val,
+ &args.params.params_len, 0) < 0) {
xdr_free((xdrproc_t) xdr_remote_domain_migrate_finish3_params_args,
(char *) &args);
goto cleanup;
args.flags = flags;
args.cancelled = cancelled;
- if (remoteSerializeTypedParameters(params, nparams,
- &args.params.params_val,
- &args.params.params_len) < 0) {
+ if (virTypedParamsSerialize(params, nparams,
+ (virTypedParameterRemotePtr *) &args.params.params_val,
+ &args.params.params_len, 0) < 0) {
xdr_free((xdrproc_t) xdr_remote_domain_migrate_confirm3_params_args,
(char *) &args);
goto cleanup;
}
return rv;
}
+
+
+/**
+ * virTypedParamsSerialize:
+ * @params: array of parameters to be serialized and later sent to remote side
+ * @nparams: number of elements in @params
+ * @remote_params_val: protocol independent remote representation of @params
+ * @remote_params_len: the final number of elements in @remote_params_val
+ * @flags: bitwise-OR of virTypedParameterFlags
+ *
+ * This method serializes typed parameters provided by @params into
+ * @remote_params_val which is the representation actually being sent.
+ *
+ * Server side using this method also filters out any string parameters that
+ * must not be returned to older clients and handles possibly sparse arrays
+ * returned by some APIs.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+int
+virTypedParamsSerialize(virTypedParameterPtr params,
+ int nparams,
+ virTypedParameterRemotePtr *remote_params_val,
+ unsigned int *remote_params_len,
+ unsigned int flags)
+{
+ size_t i;
+ size_t j;
+ int rv = -1;
+ virTypedParameterRemotePtr params_val;
+
+ *remote_params_len = nparams;
+ if (VIR_ALLOC_N(params_val, nparams) < 0)
+ goto cleanup;
+
+ for (i = 0, j = 0; i < nparams; ++i) {
+ virTypedParameterPtr param = params + i;
+ virTypedParameterRemotePtr val = params_val + j;
+ /* NOTE: Following snippet is relevant to server only, because
+ * virDomainGetCPUStats can return a sparse array; also, we can't pass
+ * back strings to older clients. */
+ if (!param->type ||
+ (!(flags & VIR_TYPED_PARAM_STRING_OKAY) &&
+ param->type == VIR_TYPED_PARAM_STRING)) {
+ --*remote_params_len;
+ continue;
+ }
+
+ /* This will be either freed by virNetServerDispatchCall or call(),
+ * depending on the calling side, i.e. server or client */
+ if (VIR_STRDUP(val->field, param->field) < 0)
+ goto cleanup;
+ val->value.type = param->type;
+ switch (param->type) {
+ case VIR_TYPED_PARAM_INT:
+ val->value.remote_typed_param_value.i = param->value.i;
+ break;
+ case VIR_TYPED_PARAM_UINT:
+ val->value.remote_typed_param_value.ui = param->value.ui;
+ break;
+ case VIR_TYPED_PARAM_LLONG:
+ val->value.remote_typed_param_value.l = param->value.l;
+ break;
+ case VIR_TYPED_PARAM_ULLONG:
+ val->value.remote_typed_param_value.ul = param->value.ul;
+ break;
+ case VIR_TYPED_PARAM_DOUBLE:
+ val->value.remote_typed_param_value.d = param->value.d;
+ break;
+ case VIR_TYPED_PARAM_BOOLEAN:
+ val->value.remote_typed_param_value.b = param->value.b;
+ break;
+ case VIR_TYPED_PARAM_STRING:
+ if (VIR_STRDUP(val->value.remote_typed_param_value.s, param->value.s) < 0)
+ goto cleanup;
+ break;
+ default:
+ virReportError(VIR_ERR_RPC, _("unknown parameter type: %d"),
+ param->type);
+ goto cleanup;
+ }
+ j++;
+ }
+
+ *remote_params_val = params_val;
+ params_val = NULL;
+ rv = 0;
+
+ cleanup:
+ virTypedParamsRemoteFree(params_val, nparams);
+ return rv;
+}