qom: interpret the return value when setting legacy properties

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Paolo Bonzini 2011-12-18 17:05:07 +01:00 committed by Anthony Liguori
parent e3cb6ba65d
commit 7db4c4e8e5
3 changed files with 29 additions and 19 deletions

View file

@ -614,6 +614,28 @@ int qdev_prop_exists(DeviceState *dev, const char *name)
return qdev_prop_find(dev, name) ? true : false;
}
void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
Property *prop, const char *value)
{
switch (ret) {
case -EEXIST:
error_set(errp, QERR_PROPERTY_VALUE_IN_USE,
dev->info->name, prop->name, value);
break;
default:
case -EINVAL:
error_set(errp, QERR_PROPERTY_VALUE_BAD,
dev->info->name, prop->name, value);
break;
case -ENOENT:
error_set(errp, QERR_PROPERTY_VALUE_NOT_FOUND,
dev->info->name, prop->name, value);
break;
case 0:
break;
}
}
int qdev_prop_parse(DeviceState *dev, const char *name, const char *value)
{
Property *prop;
@ -632,21 +654,10 @@ int qdev_prop_parse(DeviceState *dev, const char *name, const char *value)
}
ret = prop->info->parse(dev, prop, value);
if (ret < 0) {
switch (ret) {
case -EEXIST:
qerror_report(QERR_PROPERTY_VALUE_IN_USE,
dev->info->name, name, value);
break;
default:
case -EINVAL:
qerror_report(QERR_PROPERTY_VALUE_BAD,
dev->info->name, name, value);
break;
case -ENOENT:
qerror_report(QERR_PROPERTY_VALUE_NOT_FOUND,
dev->info->name, name, value);
break;
}
Error *err;
error_set_from_qdev_prop_error(&err, ret, dev, prop, value);
qerror_report_err(err);
error_free(err);
return -1;
}
return 0;

View file

@ -1162,10 +1162,7 @@ static void qdev_set_legacy_property(DeviceState *dev, Visitor *v, void *opaque,
}
ret = prop->info->parse(dev, prop, ptr);
if (ret != 0) {
error_set(errp, QERR_INVALID_PARAMETER_VALUE,
name, prop->info->name);
}
error_set_from_qdev_prop_error(errp, ret, dev, prop, ptr);
g_free(ptr);
}

View file

@ -370,6 +370,8 @@ void qdev_prop_set_defaults(DeviceState *dev, Property *props);
void qdev_prop_register_global_list(GlobalProperty *props);
void qdev_prop_set_globals(DeviceState *dev);
void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev,
Property *prop, const char *value);
static inline const char *qdev_fw_name(DeviceState *dev)
{