static void rng_egd_opened(RngBackend *b, Error **errp) { RngEgd *s = RNG_EGD(b); if (s->chr_name == NULL) { error_set(errp, QERR_INVALID_PARAMETER_VALUE, "chardev", "a valid character device"); return; } s->chr = qemu_chr_find(s->chr_name); if (s->chr == NULL) { error_set(errp, QERR_DEVICE_NOT_FOUND, s->chr_name); return; } if (qemu_chr_fe_claim(s->chr) != 0) { error_set(errp, QERR_DEVICE_IN_USE, s->chr_name); return; } /* FIXME we should resubmit pending requests when the CDS reconnects. */ qemu_chr_add_handlers(s->chr, rng_egd_chr_can_read, rng_egd_chr_read, NULL, s); }
static int parse_chr(DeviceState *dev, const char *str, void **ptr) { CharDriverState *chr = qemu_chr_find(str); if (chr == NULL) { return -ENOENT; } if (qemu_chr_fe_claim(chr) != 0) { return -EEXIST; } *ptr = chr; return 0; }
static void parse_chr(DeviceState *dev, const char *str, void **ptr, const char *propname, Error **errp) { CharDriverState *chr = qemu_chr_find(str); if (chr == NULL) { error_setg(errp, "Property '%s.%s' can't find value '%s'", object_get_typename(OBJECT(dev)), propname, str); return; } if (qemu_chr_fe_claim(chr) != 0) { error_setg(errp, "Property '%s.%s' can't take value '%s', it's in use", object_get_typename(OBJECT(dev)), propname, str); return; } *ptr = chr; }