On Fri, Oct 19, 2012 at 05:18:46PM +0000, Blue Swirl wrote: > On Wed, Oct 17, 2012 at 8:14 PM, Eduardo Habkost <ehabk...@redhat.com> wrote: > > On Wed, Jul 15, 2009 at 01:43:31PM +0200, Gerd Hoffmann wrote: > > [...] > >> diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c > >> new file mode 100644 > >> index 0000000..8b0d0ff > >> --- /dev/null > >> +++ b/hw/qdev-properties.c > >> @@ -0,0 +1,246 @@ > > > > Gerd, could you clarify what's the copyright/license of this file? (I > > mean, at least the copyright/license of the initial version of the file > > you wrote, below). > > > > I am CCing all other authors that touched the file (according to git > > logs), so they can clarify what's the license they assumed for the file > > and their contributions. > > I can't remember what I assumed, but I'm fine with GPLv2+. > > Furthermore, in my opinion, my changes were either trivial > (446333cd5b5c985f6517dee7004e542ecacd21c, > 73538c31a8f2d5aba3d82d8e60dadcb40d59061b, > bc19fcaa1b6d2a89b96793c7e8890978fc477f51) or copied heavily from other > existing code (5a053d1f2e75e6a87c483bb3ff5cc6cdf29e1569) so I think > that my consent should not be required in case Gerd and others want to > relicense in the future. >
Same goes for me (c08fb2ac) > > > > > > > >> +#include "qdev.h" > >> + > >> +void *qdev_get_prop_ptr(DeviceState *dev, Property *prop) > >> +{ > >> + void *ptr = dev; > >> + ptr += prop->offset; > >> + return ptr; > >> +} > >> + > >> +/* --- 16bit integer --- */ > >> + > >> +static int parse_uint16(DeviceState *dev, Property *prop, const char *str) > >> +{ > >> + uint16_t *ptr = qdev_get_prop_ptr(dev, prop); > >> + const char *fmt; > >> + > >> + /* accept both hex and decimal */ > >> + fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx16 : "%" PRIu16; > >> + if (sscanf(str, fmt, ptr) != 1) > >> + return -1; > >> + return 0; > >> +} > >> + > >> +static int print_uint16(DeviceState *dev, Property *prop, char *dest, > >> size_t len) > >> +{ > >> + uint16_t *ptr = qdev_get_prop_ptr(dev, prop); > >> + return snprintf(dest, len, "%" PRIu16, *ptr); > >> +} > >> + > >> +PropertyInfo qdev_prop_uint16 = { > >> + .name = "uint16", > >> + .type = PROP_TYPE_UINT16, > >> + .size = sizeof(uint16_t), > >> + .parse = parse_uint16, > >> + .print = print_uint16, > >> +}; > >> + > >> +/* --- 32bit integer --- */ > >> + > >> +static int parse_uint32(DeviceState *dev, Property *prop, const char *str) > >> +{ > >> + uint32_t *ptr = qdev_get_prop_ptr(dev, prop); > >> + const char *fmt; > >> + > >> + /* accept both hex and decimal */ > >> + fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx32 : "%" PRIu32; > >> + if (sscanf(str, fmt, ptr) != 1) > >> + return -1; > >> + return 0; > >> +} > >> + > >> +static int print_uint32(DeviceState *dev, Property *prop, char *dest, > >> size_t len) > >> +{ > >> + uint32_t *ptr = qdev_get_prop_ptr(dev, prop); > >> + return snprintf(dest, len, "%" PRIu32, *ptr); > >> +} > >> + > >> +PropertyInfo qdev_prop_uint32 = { > >> + .name = "uint32", > >> + .type = PROP_TYPE_UINT32, > >> + .size = sizeof(uint32_t), > >> + .parse = parse_uint32, > >> + .print = print_uint32, > >> +}; > >> + > >> +/* --- 32bit hex value --- */ > >> + > >> +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 0; > >> +} > >> + > >> +static int print_hex32(DeviceState *dev, Property *prop, char *dest, > >> size_t len) > >> +{ > >> + uint32_t *ptr = qdev_get_prop_ptr(dev, prop); > >> + return snprintf(dest, len, "0x%" PRIx32, *ptr); > >> +} > >> + > >> +PropertyInfo qdev_prop_hex32 = { > >> + .name = "hex32", > >> + .type = PROP_TYPE_UINT32, > >> + .size = sizeof(uint32_t), > >> + .parse = parse_hex32, > >> + .print = print_hex32, > >> +}; > >> + > >> +/* --- pointer --- */ > >> + > >> +static int print_ptr(DeviceState *dev, Property *prop, char *dest, size_t > >> len) > >> +{ > >> + void **ptr = qdev_get_prop_ptr(dev, prop); > >> + return snprintf(dest, len, "<%p>", *ptr); > >> +} > >> + > >> +PropertyInfo qdev_prop_ptr = { > >> + .name = "ptr", > >> + .type = PROP_TYPE_PTR, > >> + .size = sizeof(void*), > >> + .print = print_ptr, > >> +}; > >> + > >> +/* --- mac address --- */ > >> + > >> +/* > >> + * accepted syntax versions: > >> + * 01:02:03:04:05:06 > >> + * 01-02-03-04-05-06 > >> + */ > >> +static int parse_mac(DeviceState *dev, Property *prop, const char *str) > >> +{ > >> + uint8_t *mac = qdev_get_prop_ptr(dev, prop); > >> + int i, pos; > >> + char *p; > >> + > >> + for (i = 0, pos = 0; i < 6; i++, pos += 3) { > >> + if (!isxdigit(str[pos])) > >> + return -1; > >> + if (!isxdigit(str[pos+1])) > >> + return -1; > >> + if (i == 5 && str[pos+2] != '\0') > >> + return -1; > >> + if (str[pos+2] != ':' && str[pos+2] != '-') > >> + return -1; > >> + mac[i] = strtol(str+pos, &p, 16); > >> + } > >> + return 0; > >> +} > >> + > >> +static int print_mac(DeviceState *dev, Property *prop, char *dest, size_t > >> len) > >> +{ > >> + uint8_t *mac = qdev_get_prop_ptr(dev, prop); > >> + return snprintf(dest, len, "%02x:%02x:%02x:%02x:%02x:%02x", > >> + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); > >> +} > >> + > >> +PropertyInfo qdev_prop_macaddr = { > >> + .name = "mac-addr", > >> + .type = PROP_TYPE_MACADDR, > >> + .size = 6, > >> + .parse = parse_mac, > >> + .print = print_mac, > >> +}; > >> + > >> +/* --- public helpers --- */ > >> + > >> +static Property *qdev_prop_walk(Property *props, const char *name) > >> +{ > >> + if (!props) > >> + return NULL; > >> + while (props->name) { > >> + if (strcmp(props->name, name) == 0) > >> + return props; > >> + props++; > >> + } > >> + return NULL; > >> +} > >> + > >> +static Property *qdev_prop_find(DeviceState *dev, const char *name) > >> +{ > >> + Property *prop; > >> + > >> + /* device properties */ > >> + prop = qdev_prop_walk(dev->info->props, name); > >> + if (prop) > >> + return prop; > >> + > >> + /* bus properties */ > >> + prop = qdev_prop_walk(dev->parent_bus->info->props, name); > >> + if (prop) > >> + return prop; > >> + > >> + return NULL; > >> +} > >> + > >> +int qdev_prop_parse(DeviceState *dev, const char *name, const char *value) > >> +{ > >> + Property *prop; > >> + > >> + prop = qdev_prop_find(dev, name); > >> + if (!prop) { > >> + fprintf(stderr, "property \"%s.%s\" not found\n", > >> + dev->info->name, name); > >> + return -1; > >> + } > >> + if (!prop->info->parse) { > >> + fprintf(stderr, "property \"%s.%s\" has no parser\n", > >> + dev->info->name, name); > >> + return -1; > >> + } > >> + return prop->info->parse(dev, prop, value); > >> +} > >> + > >> +void qdev_prop_set(DeviceState *dev, const char *name, void *src, enum > >> PropertyType type) > >> +{ > >> + Property *prop; > >> + void *dst; > >> + > >> + prop = qdev_prop_find(dev, name); > >> + if (!prop) { > >> + fprintf(stderr, "%s: property \"%s.%s\" not found\n", > >> + __FUNCTION__, dev->info->name, name); > >> + abort(); > >> + } > >> + if (prop->info->type != type) { > >> + fprintf(stderr, "%s: property \"%s.%s\" type mismatch\n", > >> + __FUNCTION__, dev->info->name, name); > >> + abort(); > >> + } > >> + dst = qdev_get_prop_ptr(dev, prop); > >> + memcpy(dst, src, prop->info->size); > >> +} > >> + > >> +void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t > >> value) > >> +{ > >> + qdev_prop_set(dev, name, &value, PROP_TYPE_UINT16); > >> +} > >> + > >> +void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t > >> value) > >> +{ > >> + qdev_prop_set(dev, name, &value, PROP_TYPE_UINT32); > >> +} > >> + > >> +void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value) > >> +{ > >> + qdev_prop_set(dev, name, &value, PROP_TYPE_PTR); > >> +} > >> + > >> +void qdev_prop_set_defaults(DeviceState *dev, Property *props) > >> +{ > >> + char *dst; > >> + > >> + if (!props) > >> + return; > >> + while (props->name) { > >> + if (props->defval) { > >> + dst = qdev_get_prop_ptr(dev, props); > >> + memcpy(dst, props->defval, props->info->size); > >> + } > >> + props++; > >> + } > >> +} > >> + > > > > -- > > Eduardo >