aboutsummaryrefslogtreecommitdiff
path: root/hw/qdev-properties.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/qdev-properties.c')
-rw-r--r--hw/qdev-properties.c57
1 files changed, 34 insertions, 23 deletions
diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c
index 277ff9e780..438eaea4d8 100644
--- a/hw/qdev-properties.c
+++ b/hw/qdev-properties.c
@@ -44,7 +44,7 @@ static int parse_bit(DeviceState *dev, Property *prop, const char *str)
else if (!strncasecmp(str, "off", 3))
bit_prop_set(dev, prop, false);
else
- return -1;
+ return -EINVAL;
return 0;
}
@@ -72,7 +72,7 @@ static int parse_uint8(DeviceState *dev, Property *prop, const char *str)
/* accept both hex and decimal */
fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx8 : "%" PRIu8;
if (sscanf(str, fmt, ptr) != 1)
- return -1;
+ return -EINVAL;
return 0;
}
@@ -100,7 +100,7 @@ static int parse_uint16(DeviceState *dev, Property *prop, const char *str)
/* accept both hex and decimal */
fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx16 : "%" PRIu16;
if (sscanf(str, fmt, ptr) != 1)
- return -1;
+ return -EINVAL;
return 0;
}
@@ -128,7 +128,7 @@ static int parse_uint32(DeviceState *dev, Property *prop, const char *str)
/* accept both hex and decimal */
fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx32 : "%" PRIu32;
if (sscanf(str, fmt, ptr) != 1)
- return -1;
+ return -EINVAL;
return 0;
}
@@ -151,7 +151,7 @@ static int parse_int32(DeviceState *dev, Property *prop, const char *str)
int32_t *ptr = qdev_get_prop_ptr(dev, prop);
if (sscanf(str, "%" PRId32, ptr) != 1)
- return -1;
+ return -EINVAL;
return 0;
}
@@ -176,7 +176,7 @@ static int parse_hex32(DeviceState *dev, Property *prop, const char *str)
uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
if (sscanf(str, "%" PRIx32, ptr) != 1)
- return -1;
+ return -EINVAL;
return 0;
}
@@ -204,7 +204,7 @@ static int parse_uint64(DeviceState *dev, Property *prop, const char *str)
/* accept both hex and decimal */
fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx64 : "%" PRIu64;
if (sscanf(str, fmt, ptr) != 1)
- return -1;
+ return -EINVAL;
return 0;
}
@@ -229,7 +229,7 @@ static int parse_hex64(DeviceState *dev, Property *prop, const char *str)
uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
if (sscanf(str, "%" PRIx64, ptr) != 1)
- return -1;
+ return -EINVAL;
return 0;
}
@@ -283,7 +283,7 @@ static int parse_drive(DeviceState *dev, Property *prop, const char *str)
*ptr = drive_get_by_id(str);
if (*ptr == NULL)
- return -1;
+ return -ENOENT;
return 0;
}
@@ -309,7 +309,7 @@ static int parse_chr(DeviceState *dev, Property *prop, const char *str)
*ptr = qemu_chr_find(str);
if (*ptr == NULL)
- return -1;
+ return -ENOENT;
return 0;
}
@@ -340,7 +340,7 @@ static int parse_netdev(DeviceState *dev, Property *prop, const char *str)
*ptr = qemu_find_netdev(str);
if (*ptr == NULL)
- return -1;
+ return -ENOENT;
return 0;
}
@@ -371,10 +371,10 @@ static int parse_vlan(DeviceState *dev, Property *prop, const char *str)
int id;
if (sscanf(str, "%d", &id) != 1)
- return -1;
+ return -EINVAL;
*ptr = qemu_find_vlan(id, 1);
if (*ptr == NULL)
- return -1;
+ return -ENOENT;
return 0;
}
@@ -427,15 +427,15 @@ static int parse_mac(DeviceState *dev, Property *prop, const char *str)
for (i = 0, pos = 0; i < 6; i++, pos += 3) {
if (!qemu_isxdigit(str[pos]))
- return -1;
+ return -EINVAL;
if (!qemu_isxdigit(str[pos+1]))
- return -1;
+ return -EINVAL;
if (i == 5) {
if (str[pos+2] != '\0')
- return -1;
+ return -EINVAL;
} else {
if (str[pos+2] != ':' && str[pos+2] != '-')
- return -1;
+ return -EINVAL;
}
mac->a[i] = strtol(str+pos, &p, 16);
}
@@ -472,13 +472,13 @@ static int parse_pci_devfn(DeviceState *dev, Property *prop, const char *str)
if (sscanf(str, "%x.%x%n", &slot, &fn, &n) != 2) {
fn = 0;
if (sscanf(str, "%x%n", &slot, &n) != 1) {
- return -1;
+ return -EINVAL;
}
}
if (str[n] != '\0')
- return -1;
+ return -EINVAL;
if (fn > 7)
- return -1;
+ return -EINVAL;
*ptr = slot << 3 | fn;
return 0;
}
@@ -541,6 +541,7 @@ int qdev_prop_exists(DeviceState *dev, const char *name)
int qdev_prop_parse(DeviceState *dev, const char *name, const char *value)
{
Property *prop;
+ int ret;
prop = qdev_prop_find(dev, name);
if (!prop) {
@@ -553,9 +554,19 @@ int qdev_prop_parse(DeviceState *dev, const char *name, const char *value)
dev->info->name, name);
return -1;
}
- if (prop->info->parse(dev, prop, value) != 0) {
- fprintf(stderr, "property \"%s.%s\": failed to parse \"%s\"\n",
- dev->info->name, name, value);
+ ret = prop->info->parse(dev, prop, value);
+ if (ret < 0) {
+ switch (ret) {
+ default:
+ case -EINVAL:
+ fprintf(stderr, "property \"%s.%s\": failed to parse \"%s\"\n",
+ dev->info->name, name, value);
+ break;
+ case -ENOENT:
+ fprintf(stderr, "property \"%s.%s\": could not find \"%s\"\n",
+ dev->info->name, name, value);
+ break;
+ }
return -1;
}
return 0;