static void set_mac(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { DeviceState *dev = DEVICE(obj); Property *prop = opaque; MACAddr *mac = qdev_get_prop_ptr(dev, prop); Error *local_err = NULL; int i, pos; char *str, *p; if (dev->realized) { qdev_prop_set_after_realize(dev, name, errp); return; } visit_type_str(v, name, &str, &local_err); if (local_err) { error_propagate(errp, local_err); return; } for (i = 0, pos = 0; i < 6; i++, pos += 3) { if (!qemu_isxdigit(str[pos])) { goto inval; } if (!qemu_isxdigit(str[pos+1])) { goto inval; } if (i == 5) { if (str[pos+2] != '\0') { goto inval; } } else { if (str[pos+2] != ':' && str[pos+2] != '-') { goto inval; } } mac->a[i] = strtol(str+pos, &p, 16); } g_free(str); return; inval: error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str); g_free(str); }
/* Compare the binary fingerprint (hash of host key) with the * host_key_check parameter. */ static int compare_fingerprint(const unsigned char *fingerprint, size_t len, const char *host_key_check) { unsigned c; while (len > 0) { while (*host_key_check == ':') host_key_check++; if (!qemu_isxdigit(host_key_check[0]) || !qemu_isxdigit(host_key_check[1])) return 1; c = hex2decimal(host_key_check[0]) * 16 + hex2decimal(host_key_check[1]); if (c - *fingerprint != 0) return c - *fingerprint; fingerprint++; len--; host_key_check += 2; } return *host_key_check - '\0'; }
static void set_mac(Object *obj, Visitor *v, void *opaque, const char *name, Error **errp) { DeviceState *dev = DEVICE(obj); Property *prop = opaque; MACAddr *mac = qdev_get_prop_ptr(dev, prop); Error *local_err = NULL; int i, pos; char *str, *p; if (dev->state != DEV_STATE_CREATED) { error_set(errp, QERR_PERMISSION_DENIED); return; } visit_type_str(v, &str, name, &local_err); if (local_err) { error_propagate(errp, local_err); return; } for (i = 0, pos = 0; i < 6; i++, pos += 3) { if (!qemu_isxdigit(str[pos])) goto inval; if (!qemu_isxdigit(str[pos+1])) goto inval; if (i == 5) { if (str[pos+2] != '\0') goto inval; } else { if (str[pos+2] != ':' && str[pos+2] != '-') goto inval; } mac->a[i] = strtol(str+pos, &p, 16); } return; inval: error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str); }
/* * 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) { MACAddr *mac = qdev_get_prop_ptr(dev, prop); int i, pos; char *p; for (i = 0, pos = 0; i < 6; i++, pos += 3) { if (!qemu_isxdigit(str[pos])) return -EINVAL; if (!qemu_isxdigit(str[pos+1])) return -EINVAL; if (i == 5) { if (str[pos+2] != '\0') return -EINVAL; } else { if (str[pos+2] != ':' && str[pos+2] != '-') return -EINVAL; } mac->a[i] = strtol(str+pos, &p, 16); } return 0; }