diff --git a/docs/apibuild.py b/docs/apibuild.py index e0996bfcce..aca2370110 100755 --- a/docs/apibuild.py +++ b/docs/apibuild.py @@ -69,6 +69,7 @@ ignored_functions = { "virTypedParameterAssignFromStr": "internal function in virtypedparam.c", "virTypedParameterToString": "internal function in virtypedparam.c", "virTypedParamsCheck": "internal function in virtypedparam.c", + "virTypedParamsCopy": "internal function in virtypedparam.c", } ignored_macros = { diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 504cec3d71..92619a0623 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1947,6 +1947,7 @@ virTypedParameterToString; virTypedParameterTypeFromString; virTypedParameterTypeToString; virTypedParamsCheck; +virTypedParamsCopy; virTypedParamsReplaceString; virTypedParamsValidate; diff --git a/src/util/virtypedparam.c b/src/util/virtypedparam.c index 88e0951afb..c767e32a86 100644 --- a/src/util/virtypedparam.c +++ b/src/util/virtypedparam.c @@ -395,6 +395,40 @@ error: } +int +virTypedParamsCopy(virTypedParameterPtr *dst, + virTypedParameterPtr src, + int nparams) +{ + int i; + + *dst = NULL; + if (!src || nparams <= 0) + return 0; + + if (VIR_ALLOC_N(*dst, nparams) < 0) { + virReportOOMError(); + 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; +} + + /* The following APIs are public and their signature may never change. */ /** diff --git a/src/util/virtypedparam.h b/src/util/virtypedparam.h index 364df2bd10..0c185047b7 100644 --- a/src/util/virtypedparam.h +++ b/src/util/virtypedparam.h @@ -50,6 +50,10 @@ int virTypedParamsReplaceString(virTypedParameterPtr *params, const char *name, const char *value); +int virTypedParamsCopy(virTypedParameterPtr *dst, + virTypedParameterPtr src, + int nparams); + char *virTypedParameterToString(virTypedParameterPtr param); VIR_ENUM_DECL(virTypedParameter)