va_end(ap);
return ret;
}
+
+/* Assign name, type, and convert the argument from a const string.
+ * In case of a string, the string is copied.
+ * Return 0 on success, -1 after an error message on failure. */
+int
+virTypedParameterAssignFromStr(virTypedParameterPtr param, const char *name,
+ int type, const char *val)
+{
+ int ret = -1;
+
+ if (!val) {
+ virReportError(VIR_ERR_INVALID_ARG, _("NULL value for field '%s'"),
+ name);
+ goto cleanup;
+ }
+
+ if (virStrcpyStatic(param->field, name) == NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, _("Field name '%s' too long"),
+ name);
+ goto cleanup;
+ }
+
+ param->type = type;
+ switch (type) {
+ case VIR_TYPED_PARAM_INT:
+ if (virStrToLong_i(val, NULL, 10, ¶m->value.i) < 0) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("Invalid value for field '%s': expected int"),
+ name);
+ goto cleanup;
+ }
+ break;
+ case VIR_TYPED_PARAM_UINT:
+ if (virStrToLong_ui(val, NULL, 10, ¶m->value.ui) < 0) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("Invalid value for field '%s': "
+ "expected unsigned int"),
+ name);
+ goto cleanup;
+ }
+ break;
+ case VIR_TYPED_PARAM_LLONG:
+ if (virStrToLong_ll(val, NULL, 10, ¶m->value.l) < 0) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("Invalid value for field '%s': "
+ "expected long long"),
+ name);
+ goto cleanup;
+ }
+ break;
+ case VIR_TYPED_PARAM_ULLONG:
+ if (virStrToLong_ull(val, NULL, 10, ¶m->value.ul) < 0) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("Invalid value for field '%s': "
+ "expected unsigned long long"),
+ name);
+ goto cleanup;
+ }
+ break;
+ case VIR_TYPED_PARAM_DOUBLE:
+ if (virStrToDouble(val, NULL, ¶m->value.d) < 0) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("Invalid value for field '%s': "
+ "expected double"),
+ name);
+ goto cleanup;
+ }
+ break;
+ case VIR_TYPED_PARAM_BOOLEAN:
+ if (STRCASEEQ(val, "true") ||
+ STREQ(val, "1")) {
+ param->value.b = true;
+ } else if (STRCASEEQ(val, "false") ||
+ STREQ(val, "0")) {
+ param->value.b = false;
+ } else {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("Invalid boolean value for field '%s'"), name);
+ goto cleanup;
+ }
+ break;
+ case VIR_TYPED_PARAM_STRING:
+ if (!(param->value.s = strdup(val))) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ break;
+ default:
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unexpected type %d for field %s"), type, name);
+ goto cleanup;
+ }
+
+ ret = 0;
+cleanup:
+ return ret;
+}