Exemplo n.º 1
0
void visit_type_VncInfo(Visitor *m, VncInfo ** obj, const char *name, Error **errp)
{
    visit_start_struct(m, (void **)obj, "VncInfo", name, sizeof(VncInfo), errp);
    visit_type_bool(m, (obj && *obj) ? &(*obj)->enabled : NULL, "enabled", errp);
    visit_start_optional(m, (obj && *obj) ? &(*obj)->has_host : NULL, "host", errp);
    if ((*obj)->has_host) {
        visit_type_str(m, (obj && *obj) ? &(*obj)->host : NULL, "host", errp);
    }
    visit_end_optional(m, errp);
    visit_start_optional(m, (obj && *obj) ? &(*obj)->has_family : NULL, "family", errp);
    if ((*obj)->has_family) {
        visit_type_str(m, (obj && *obj) ? &(*obj)->family : NULL, "family", errp);
    }
    visit_end_optional(m, errp);
    visit_start_optional(m, (obj && *obj) ? &(*obj)->has_service : NULL, "service", errp);
    if ((*obj)->has_service) {
        visit_type_str(m, (obj && *obj) ? &(*obj)->service : NULL, "service", errp);
    }
    visit_end_optional(m, errp);
    visit_start_optional(m, (obj && *obj) ? &(*obj)->has_auth : NULL, "auth", errp);
    if ((*obj)->has_auth) {
        visit_type_str(m, (obj && *obj) ? &(*obj)->auth : NULL, "auth", errp);
    }
    visit_end_optional(m, errp);
    visit_start_optional(m, (obj && *obj) ? &(*obj)->has_clients : NULL, "clients", errp);
    if ((*obj)->has_clients) {
        visit_type_VncClientInfoList(m, (obj && *obj) ? &(*obj)->clients : NULL, "clients", errp);
    }
    visit_end_optional(m, errp);
    visit_end_struct(m, errp);
}
Exemplo n.º 2
0
void visit_type_PciDeviceInfo(Visitor *m, PciDeviceInfo ** obj, const char *name, Error **errp)
{
    visit_start_struct(m, (void **)obj, "PciDeviceInfo", name, sizeof(PciDeviceInfo), errp);
    visit_type_int(m, (obj && *obj) ? &(*obj)->bus : NULL, "bus", errp);
    visit_type_int(m, (obj && *obj) ? &(*obj)->slot : NULL, "slot", errp);
    visit_type_int(m, (obj && *obj) ? &(*obj)->function : NULL, "function", errp);
    visit_start_struct(m, NULL, "", "class_info", 0, errp);
    visit_start_optional(m, (obj && *obj) ? &(*obj)->class_info.has_desc : NULL, "desc", errp);
    if ((*obj)->class_info.has_desc) {
        visit_type_str(m, (obj && *obj) ? &(*obj)->class_info.desc : NULL, "desc", errp);
    }
    visit_end_optional(m, errp);
    visit_type_int(m, (obj && *obj) ? &(*obj)->class_info.class : NULL, "class", errp);
    visit_end_struct(m, errp);
    visit_start_struct(m, NULL, "", "id", 0, errp);
    visit_type_int(m, (obj && *obj) ? &(*obj)->id.device : NULL, "device", errp);
    visit_type_int(m, (obj && *obj) ? &(*obj)->id.vendor : NULL, "vendor", errp);
    visit_end_struct(m, errp);
    visit_start_optional(m, (obj && *obj) ? &(*obj)->has_irq : NULL, "irq", errp);
    if ((*obj)->has_irq) {
        visit_type_int(m, (obj && *obj) ? &(*obj)->irq : NULL, "irq", errp);
    }
    visit_end_optional(m, errp);
    visit_type_str(m, (obj && *obj) ? &(*obj)->qdev_id : NULL, "qdev_id", errp);
    visit_start_optional(m, (obj && *obj) ? &(*obj)->has_pci_bridge : NULL, "pci_bridge", errp);
    if ((*obj)->has_pci_bridge) {
        visit_type_PciBridgeInfo(m, (obj && *obj) ? &(*obj)->pci_bridge : NULL, "pci_bridge", errp);
    }
    visit_end_optional(m, errp);
    visit_type_PciMemoryRegionList(m, (obj && *obj) ? &(*obj)->regions : NULL, "regions", errp);
    visit_end_struct(m, errp);
}
Exemplo n.º 3
0
void visit_type_ChardevInfo(Visitor *m, ChardevInfo ** obj, const char *name, Error **errp)
{
    visit_start_struct(m, (void **)obj, "ChardevInfo", name, sizeof(ChardevInfo), errp);
    visit_type_str(m, (obj && *obj) ? &(*obj)->label : NULL, "label", errp);
    visit_type_str(m, (obj && *obj) ? &(*obj)->filename : NULL, "filename", errp);
    visit_end_struct(m, errp);
}
Exemplo n.º 4
0
void visit_type_SpiceChannel(Visitor *m, SpiceChannel ** obj, const char *name, Error **errp)
{
    visit_start_struct(m, (void **)obj, "SpiceChannel", name, sizeof(SpiceChannel), errp);
    visit_type_str(m, (obj && *obj) ? &(*obj)->host : NULL, "host", errp);
    visit_type_str(m, (obj && *obj) ? &(*obj)->family : NULL, "family", errp);
    visit_type_str(m, (obj && *obj) ? &(*obj)->port : NULL, "port", errp);
    visit_type_int(m, (obj && *obj) ? &(*obj)->connection_id : NULL, "connection-id", errp);
    visit_type_int(m, (obj && *obj) ? &(*obj)->channel_type : NULL, "channel-type", errp);
    visit_type_int(m, (obj && *obj) ? &(*obj)->channel_id : NULL, "channel-id", errp);
    visit_type_bool(m, (obj && *obj) ? &(*obj)->tls : NULL, "tls", errp);
    visit_end_struct(m, errp);
}
Exemplo n.º 5
0
static void get_string(DeviceState *dev, Visitor *v, void *opaque,
                       const char *name, Error **errp)
{
    Property *prop = opaque;
    char **ptr = qdev_get_prop_ptr(dev, prop);

    if (!*ptr) {
        char *str = (char *)"";
        visit_type_str(v, &str, name, errp);
    } else {
        visit_type_str(v, ptr, name, errp);
    }
}
Exemplo n.º 6
0
void visit_type_BlockDeviceInfo(Visitor *m, BlockDeviceInfo ** obj, const char *name, Error **errp)
{
    visit_start_struct(m, (void **)obj, "BlockDeviceInfo", name, sizeof(BlockDeviceInfo), errp);
    visit_type_str(m, (obj && *obj) ? &(*obj)->file : NULL, "file", errp);
    visit_type_bool(m, (obj && *obj) ? &(*obj)->ro : NULL, "ro", errp);
    visit_type_str(m, (obj && *obj) ? &(*obj)->drv : NULL, "drv", errp);
    visit_start_optional(m, (obj && *obj) ? &(*obj)->has_backing_file : NULL, "backing_file", errp);
    if ((*obj)->has_backing_file) {
        visit_type_str(m, (obj && *obj) ? &(*obj)->backing_file : NULL, "backing_file", errp);
    }
    visit_end_optional(m, errp);
    visit_type_bool(m, (obj && *obj) ? &(*obj)->encrypted : NULL, "encrypted", errp);
    visit_end_struct(m, errp);
}
Exemplo n.º 7
0
static void get_string(Object *obj, Visitor *v, const char *name,
                       void *opaque, Error **errp)
{
    DeviceState *dev = DEVICE(obj);
    Property *prop = opaque;
    char **ptr = qdev_get_prop_ptr(dev, prop);

    if (!*ptr) {
        char *str = (char *)"";
        visit_type_str(v, name, &str, errp);
    } else {
        visit_type_str(v, name, ptr, errp);
    }
}
Exemplo n.º 8
0
Object *user_creatable_add(const QDict *qdict,
                           Visitor *v, Error **errp)
{
    char *type = NULL;
    char *id = NULL;
    Object *obj = NULL;
    Error *local_err = NULL;
    QDict *pdict;

    pdict = qdict_clone_shallow(qdict);

    visit_start_struct(v, NULL, NULL, 0, &local_err);
    if (local_err) {
        goto out;
    }

    qdict_del(pdict, "qom-type");
    visit_type_str(v, "qom-type", &type, &local_err);
    if (local_err) {
        goto out_visit;
    }

    qdict_del(pdict, "id");
    visit_type_str(v, "id", &id, &local_err);
    if (local_err) {
        goto out_visit;
    }
    visit_check_struct(v, &local_err);
    if (local_err) {
        goto out_visit;
    }

    obj = user_creatable_add_type(type, id, pdict, v, &local_err);

out_visit:
    visit_end_struct(v, NULL);

out:
    QDECREF(pdict);
    g_free(id);
    g_free(type);
    if (local_err) {
        error_propagate(errp, local_err);
        object_unref(obj);
        return NULL;
    }
    return obj;
}
Exemplo n.º 9
0
static void set_pointer(Object *obj, Visitor *v, Property *prop,
                        int (*parse)(DeviceState *dev, const char *str, void **ptr),
                        const char *name, Error **errp)
{
    DeviceState *dev = DEVICE(obj);
    Error *local_err = NULL;
    void **ptr = qdev_get_prop_ptr(dev, prop);
    char *str;
    int ret;

    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;
    }
    if (!*str) {
        g_free(str);
        *ptr = NULL;
        return;
    }
    ret = parse(dev, str, ptr);
    error_set_from_qdev_prop_error(errp, ret, dev, prop, str);
    g_free(str);
}
Exemplo n.º 10
0
static void test_visitor_in_null(TestInputVisitorData *data,
                                 const void *unused)
{
    Visitor *v;
    Error *err = NULL;
    char *tmp;

    /*
     * FIXME: Since QAPI doesn't know the 'null' type yet, we can't
     * test visit_type_null() by reading into a QAPI struct then
     * checking that it was populated correctly.  The best we can do
     * for now is ensure that we consumed null from the input, proven
     * by the fact that we can't re-read the key; and that we detect
     * when input is not null.
     */

    v = visitor_input_test_init(data, "{ 'a': null, 'b': '' }");
    visit_start_struct(v, NULL, NULL, 0, &error_abort);
    visit_type_null(v, "a", &error_abort);
    visit_type_str(v, "a", &tmp, &err);
    g_assert(!tmp);
    error_free_or_abort(&err);
    visit_type_null(v, "b", &err);
    error_free_or_abort(&err);
    visit_check_struct(v, &error_abort);
    visit_end_struct(v, NULL);
}
Exemplo n.º 11
0
void input_type_enum(Visitor *v, int *obj, const char * const strings[],
                     const char *kind, const char *name,
                     Error **errp)
{
    Error *local_err = NULL;
    int64_t value = 0;
    char *enum_str;

    assert(strings);

    visit_type_str(v, &enum_str, name, &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
        return;
    }

    while (strings[value] != NULL) {
        if (strcmp(strings[value], enum_str) == 0) {
            break;
        }
        value++;
    }

    if (strings[value] == NULL) {
        error_setg(errp, QERR_INVALID_PARAMETER, enum_str);
        g_free(enum_str);
        return;
    }

    g_free(enum_str);
    *obj = value;
}
Exemplo n.º 12
0
static void set_generic(DeviceState *dev, Visitor *v, void *opaque,
                        const char *name, Error **errp)
{
    Property *prop = opaque;
    Error *local_err = NULL;
    char *str;
    int ret;

    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;
    }
    if (!*str) {
        g_free(str);
        error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
        return;
    }
    ret = prop->info->parse(dev, prop, str);
    error_set_from_qdev_prop_error(errp, ret, dev, prop, str);
    g_free(str);
}
Exemplo n.º 13
0
static void set_string(DeviceState *dev, Visitor *v, void *opaque,
                       const char *name, Error **errp)
{
    Property *prop = opaque;
    char **ptr = qdev_get_prop_ptr(dev, prop);
    Error *local_err = NULL;
    char *str;

    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;
    }
    if (!*str) {
        g_free(str);
        str = NULL;
    }
    if (*ptr) {
        g_free(*ptr);
    }
    *ptr = str;
}
Exemplo n.º 14
0
static void set_tpm(Object *obj, Visitor *v, const char *name, void *opaque,
                    Error **errp)
{
    DeviceState *dev = DEVICE(obj);
    Error *local_err = NULL;
    Property *prop = opaque;
    TPMBackend *s, **be = qdev_get_prop_ptr(dev, prop);
    char *str;

    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;
    }

    s = qemu_find_tpm_be(str);
    if (s == NULL) {
        error_setg(errp, "Property '%s.%s' can't find value '%s'",
                   object_get_typename(obj), prop->name, str);
    } else if (tpm_backend_init(s, TPM_IF(obj), errp) == 0) {
        *be = s; /* weak reference, avoid cyclic ref */
    }
    g_free(str);
}
Exemplo n.º 15
0
/*
 * bus-local address, i.e. "$slot" or "$slot.$fn"
 */
static void set_pci_devfn(Object *obj, Visitor *v, void *opaque,
                          const char *name, Error **errp)
{
    DeviceState *dev = DEVICE(obj);
    Property *prop = opaque;
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
    unsigned int slot, fn, n;
    Error *local_err = NULL;
    char *str = (char *)"";

    if (dev->state != DEV_STATE_CREATED) {
        error_set(errp, QERR_PERMISSION_DENIED);
        return;
    }

    visit_type_str(v, &str, name, &local_err);
    if (local_err) {
        return set_int32(obj, v, opaque, name, errp);
    }

    if (sscanf(str, "%x.%x%n", &slot, &fn, &n) != 2) {
        fn = 0;
        if (sscanf(str, "%x%n", &slot, &n) != 1) {
            goto invalid;
        }
    }
    if (str[n] != '\0' || fn > 7 || slot > 31) {
        goto invalid;
    }
    *ptr = slot << 3 | fn;
    return;

invalid:
    error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str);
}
Exemplo n.º 16
0
static void set_pointer(Object *obj, Visitor *v, Property *prop,
                        void (*parse)(DeviceState *dev, const char *str,
                                      void **ptr, const char *propname,
                                      Error **errp),
                        const char *name, Error **errp)
{
    DeviceState *dev = DEVICE(obj);
    Error *local_err = NULL;
    void **ptr = qdev_get_prop_ptr(dev, prop);
    char *str;

    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;
    }
    if (!*str) {
        g_free(str);
        *ptr = NULL;
        return;
    }
    parse(dev, str, ptr, prop->name, errp);
    g_free(str);
}
Exemplo n.º 17
0
static void spapr_cap_set_string(Object *obj, Visitor *v, const char *name,
                                 void *opaque, Error **errp)
{
    sPAPRCapabilityInfo *cap = opaque;
    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
    Error *local_err = NULL;
    uint8_t i;
    char *val;

    visit_type_str(v, name, &val, &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
        return;
    }

    if (!strcmp(val, "?")) {
        error_setg(errp, "%s", cap->possible->help);
        goto out;
    }
    for (i = 0; i < cap->possible->num; i++) {
        if (!strcasecmp(val, cap->possible->vals[i])) {
            spapr->cmd_line_caps[cap->index] = true;
            spapr->eff.caps[cap->index] = i;
            goto out;
        }
    }

    error_setg(errp, "Invalid capability mode \"%s\" for cap-%s", val,
               cap->name);
out:
    g_free(val);
}
Exemplo n.º 18
0
static void visit_type_TestStruct(Visitor *v, TestStruct **obj,
                                  const char *name, Error **errp)
{
    Error *err = NULL;

    visit_start_struct(v, (void **)obj, "TestStruct", name, sizeof(TestStruct),
                       &err);
    if (err) {
        goto out;
    }
    visit_type_int(v, &(*obj)->integer, "integer", &err);
    if (err) {
        goto out_end;
    }
    visit_type_bool(v, &(*obj)->boolean, "boolean", &err);
    if (err) {
        goto out_end;
    }
    visit_type_str(v, &(*obj)->string, "string", &err);

out_end:
    error_propagate(errp, err);
    err = NULL;
    visit_end_struct(v, &err);
out:
    error_propagate(errp, err);
}
Exemplo n.º 19
0
static void visit_type_GuestNetworkInterface_fields(Visitor *m, GuestNetworkInterface ** obj, Error **errp)
{
    Error *err = NULL;
    visit_type_str(m, obj ? &(*obj)->name : NULL, "name", &err);
    visit_start_optional(m, obj ? &(*obj)->has_hardware_address : NULL, "hardware-address", &err);
    if (obj && (*obj)->has_hardware_address) {
        visit_type_str(m, obj ? &(*obj)->hardware_address : NULL, "hardware-address", &err);
    }
    visit_end_optional(m, &err);
    visit_start_optional(m, obj ? &(*obj)->has_ip_addresses : NULL, "ip-addresses", &err);
    if (obj && (*obj)->has_ip_addresses) {
        visit_type_GuestIpAddressList(m, obj ? &(*obj)->ip_addresses : NULL, "ip-addresses", &err);
    }
    visit_end_optional(m, &err);

    error_propagate(errp, err);
}
Exemplo n.º 20
0
static void visit_type_GuestAgentInfo_fields(Visitor *m, GuestAgentInfo ** obj, Error **errp)
{
    Error *err = NULL;
    visit_type_str(m, obj ? &(*obj)->version : NULL, "version", &err);
    visit_type_GuestAgentCommandInfoList(m, obj ? &(*obj)->supported_commands : NULL, "supported_commands", &err);

    error_propagate(errp, err);
}
Exemplo n.º 21
0
static void visit_type_GuestAgentCommandInfo_fields(Visitor *m, GuestAgentCommandInfo ** obj, Error **errp)
{
    Error *err = NULL;
    visit_type_str(m, obj ? &(*obj)->name : NULL, "name", &err);
    visit_type_bool(m, obj ? &(*obj)->enabled : NULL, "enabled", &err);
    visit_type_bool(m, obj ? &(*obj)->success_response : NULL, "success-response", &err);

    error_propagate(errp, err);
}
Exemplo n.º 22
0
static void visit_type_GuestIpAddress_fields(Visitor *m, GuestIpAddress ** obj, Error **errp)
{
    Error *err = NULL;
    visit_type_str(m, obj ? &(*obj)->ip_address : NULL, "ip-address", &err);
    visit_type_GuestIpAddressType(m, obj ? &(*obj)->ip_address_type : NULL, "ip-address-type", &err);
    visit_type_int(m, obj ? &(*obj)->prefix : NULL, "prefix", &err);

    error_propagate(errp, err);
}
Exemplo n.º 23
0
void visit_type_VncClientInfo(Visitor *m, VncClientInfo ** obj, const char *name, Error **errp)
{
    visit_start_struct(m, (void **)obj, "VncClientInfo", name, sizeof(VncClientInfo), errp);
    visit_type_str(m, (obj && *obj) ? &(*obj)->host : NULL, "host", errp);
    visit_type_str(m, (obj && *obj) ? &(*obj)->family : NULL, "family", errp);
    visit_type_str(m, (obj && *obj) ? &(*obj)->service : NULL, "service", errp);
    visit_start_optional(m, (obj && *obj) ? &(*obj)->has_x509_dname : NULL, "x509_dname", errp);
    if ((*obj)->has_x509_dname) {
        visit_type_str(m, (obj && *obj) ? &(*obj)->x509_dname : NULL, "x509_dname", errp);
    }
    visit_end_optional(m, errp);
    visit_start_optional(m, (obj && *obj) ? &(*obj)->has_sasl_username : NULL, "sasl_username", errp);
    if ((*obj)->has_sasl_username) {
        visit_type_str(m, (obj && *obj) ? &(*obj)->sasl_username : NULL, "sasl_username", errp);
    }
    visit_end_optional(m, errp);
    visit_end_struct(m, errp);
}
Exemplo n.º 24
0
void visit_type_MouseInfo(Visitor *m, MouseInfo ** obj, const char *name, Error **errp)
{
    visit_start_struct(m, (void **)obj, "MouseInfo", name, sizeof(MouseInfo), errp);
    visit_type_str(m, (obj && *obj) ? &(*obj)->name : NULL, "name", errp);
    visit_type_int(m, (obj && *obj) ? &(*obj)->index : NULL, "index", errp);
    visit_type_bool(m, (obj && *obj) ? &(*obj)->current : NULL, "current", errp);
    visit_type_bool(m, (obj && *obj) ? &(*obj)->absolute : NULL, "absolute", errp);
    visit_end_struct(m, errp);
}
Exemplo n.º 25
0
static void visit_type_GuestFileRead_fields(Visitor *m, GuestFileRead ** obj, Error **errp)
{
    Error *err = NULL;
    visit_type_int(m, obj ? &(*obj)->count : NULL, "count", &err);
    visit_type_str(m, obj ? &(*obj)->buf_b64 : NULL, "buf-b64", &err);
    visit_type_bool(m, obj ? &(*obj)->eof : NULL, "eof", &err);

    error_propagate(errp, err);
}
Exemplo n.º 26
0
void visit_type_NameInfo(Visitor *m, NameInfo ** obj, const char *name, Error **errp)
{
    visit_start_struct(m, (void **)obj, "NameInfo", name, sizeof(NameInfo), errp);
    visit_start_optional(m, (obj && *obj) ? &(*obj)->has_name : NULL, "name", errp);
    if ((*obj)->has_name) {
        visit_type_str(m, (obj && *obj) ? &(*obj)->name : NULL, "name", errp);
    }
    visit_end_optional(m, errp);
    visit_end_struct(m, errp);
}
Exemplo n.º 27
0
/* --- netdev device --- */
static void get_netdev(Object *obj, Visitor *v, const char *name,
                       void *opaque, Error **errp)
{
    DeviceState *dev = DEVICE(obj);
    Property *prop = opaque;
    NICPeers *peers_ptr = qdev_get_prop_ptr(dev, prop);
    char *p = g_strdup(peers_ptr->ncs[0] ? peers_ptr->ncs[0]->name : "");

    visit_type_str(v, name, &p, errp);
    g_free(p);
}
Exemplo n.º 28
0
static void get_chr(Object *obj, Visitor *v, const char *name, void *opaque,
                    Error **errp)
{
    DeviceState *dev = DEVICE(obj);
    CharBackend *be = qdev_get_prop_ptr(dev, opaque);
    char *p;

    p = g_strdup(be->chr && be->chr->label ? be->chr->label : "");
    visit_type_str(v, name, &p, errp);
    g_free(p);
}
Exemplo n.º 29
0
void visit_type_VersionInfo(Visitor *m, VersionInfo ** obj, const char *name, Error **errp)
{
    visit_start_struct(m, (void **)obj, "VersionInfo", name, sizeof(VersionInfo), errp);
    visit_start_struct(m, NULL, "", "qemu", 0, errp);
    visit_type_int(m, (obj && *obj) ? &(*obj)->qemu.major : NULL, "major", errp);
    visit_type_int(m, (obj && *obj) ? &(*obj)->qemu.minor : NULL, "minor", errp);
    visit_type_int(m, (obj && *obj) ? &(*obj)->qemu.micro : NULL, "micro", errp);
    visit_end_struct(m, errp);
    visit_type_str(m, (obj && *obj) ? &(*obj)->package : NULL, "package", errp);
    visit_end_struct(m, errp);
}
Exemplo n.º 30
0
static void get_pointer(Object *obj, Visitor *v, Property *prop,
                        const char *(*print)(void *ptr),
                        const char *name, Error **errp)
{
    DeviceState *dev = DEVICE(obj);
    void **ptr = qdev_get_prop_ptr(dev, prop);
    char *p;

    p = (char *) (*ptr ? print(*ptr) : "");
    visit_type_str(v, &p, name, errp);
}