The `virTypedParamsPackStrings' function provides interface to pack multiple string values under the same key to the `virTypedParameter' array. Signed-off-by: Pavel Boldin <pboldin@xxxxxxxxxxxx> --- include/libvirt/libvirt-host.h | 6 +++ src/libvirt_public.syms | 1 + src/util/virtypedparam.c | 94 +++++++++++++++++++++++++++++++++--------- tests/virtypedparamtest.c | 28 +++++++++++++ 4 files changed, 109 insertions(+), 20 deletions(-) diff --git a/include/libvirt/libvirt-host.h b/include/libvirt/libvirt-host.h index afa730f..090ac83 100644 --- a/include/libvirt/libvirt-host.h +++ b/include/libvirt/libvirt-host.h @@ -344,6 +344,12 @@ virTypedParamsAddString (virTypedParameterPtr *params, const char *name, const char *value); int +virTypedParamsPackStrings(virTypedParameterPtr *params, + int *nparams, + int *maxparams, + const char *name, + const char **values); +int virTypedParamsAddFromString(virTypedParameterPtr *params, int *nparams, int *maxparams, diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index d886967..8a24bb6 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -714,6 +714,7 @@ LIBVIRT_1.2.16 { global: virTypedParamsPick; virTypedParamsPickStrings; + virTypedParamsPackStrings; } LIBVIRT_1.2.15; # .... define new API here using predicted next version number .... diff --git a/src/util/virtypedparam.c b/src/util/virtypedparam.c index 643d10e..9f2ab3c 100644 --- a/src/util/virtypedparam.c +++ b/src/util/virtypedparam.c @@ -1132,6 +1132,43 @@ virTypedParamsAddBoolean(virTypedParameterPtr *params, return -1; } +static int +virTypedParamsAddStringFull(virTypedParameterPtr *params, + int *nparams, + int *maxparams, + const char *name, + const char *value, + bool unique) +{ + char *str = NULL; + size_t max = *maxparams; + size_t n = *nparams; + + virResetLastError(); + + if (unique) + VIR_TYPED_PARAM_CHECK(); + if (VIR_RESIZE_N(*params, max, n, 1) < 0) + goto error; + *maxparams = max; + + if (VIR_STRDUP(str, value) < 0) + goto error; + + if (virTypedParameterAssign(*params + n, name, + VIR_TYPED_PARAM_STRING, str) < 0) { + VIR_FREE(str); + goto error; + } + + *nparams += 1; + return 0; + + error: + virDispatchError(NULL); + return -1; +} + /** * virTypedParamsAddString: @@ -1160,32 +1197,49 @@ virTypedParamsAddString(virTypedParameterPtr *params, const char *name, const char *value) { - char *str = NULL; - size_t max = *maxparams; - size_t n = *nparams; + return virTypedParamsAddStringFull(params, + nparams, + maxparams, + name, + value, + 1); +} - virResetLastError(); - VIR_TYPED_PARAM_CHECK(); - if (VIR_RESIZE_N(*params, max, n, 1) < 0) - goto error; - *maxparams = max; +/** + * virTypedParamsPackStrings: + * @params: array of typed parameters + * @nparams: number of parameters in the @params array + * @maxparams: maximum number of parameters that can be stored in @params + * array without allocating more memory + * @name: name of the parameter to store values to + * @values: the values to store into the new parameters + * + * Packs NULL-terminated list of strings @values into @params under the + * key @name. + * + * Returns 0 on success, -1 on error. + */ +int +virTypedParamsPackStrings(virTypedParameterPtr *params, + int *nparams, + int *maxparams, + const char *name, + const char **values) +{ + size_t i; + int rv = -1; - if (VIR_STRDUP(str, value) < 0) - goto error; + if (!values) + return 0; - if (virTypedParameterAssign(*params + n, name, - VIR_TYPED_PARAM_STRING, str) < 0) { - VIR_FREE(str); - goto error; + for (i = 0; values[i]; i++) { + if ((rv = virTypedParamsAddStringFull(params, nparams, maxparams, + name, values[i], 0)) < 0) + break; } - *nparams += 1; - return 0; - - error: - virDispatchError(NULL); - return -1; + return rv; } diff --git a/tests/virtypedparamtest.c b/tests/virtypedparamtest.c index 287d3f1..037d5d1 100644 --- a/tests/virtypedparamtest.c +++ b/tests/virtypedparamtest.c @@ -139,6 +139,31 @@ testTypedParamsPick(const void *opaque ATTRIBUTE_UNUSED) } static int +testTypedParamsPackStrings(const void *opaque ATTRIBUTE_UNUSED) +{ + int rv = 0; + virTypedParameterPtr params = NULL; + int nparams = 0, maxparams = 0, i; + + const char *values[] = { + "foo", "bar", "foobar", NULL + }; + + rv = virTypedParamsPackStrings(¶ms, &nparams, &maxparams, "param", + values); + + for (i = 0; i < nparams; i++) { + if (STRNEQ(params[i].field, "param") || + STRNEQ(params[i].value.s, values[i]) || + params[i].type != VIR_TYPED_PARAM_STRING) + rv = -1; + } + + virTypedParamsFree(params, nparams); + return rv; +} + +static int testTypedParamsPickStrings(const void *opaque ATTRIBUTE_UNUSED) { size_t i; @@ -256,6 +281,9 @@ mymain(void) if (virtTestRun("Picking Strings", testTypedParamsPickStrings, NULL) < 0) rv = -1; + if (virtTestRun("Packing Strings", testTypedParamsPackStrings, NULL) < 0) + rv = -1; + if (rv < 0) return EXIT_FAILURE; return EXIT_SUCCESS; -- 1.9.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list