if (cds->device_kind_flags & (1 << LIBXL__DEVICE_KIND_VIF))
cds->nics = libxl__device_list(gc, &libxl__nic_devtype, cds->domid,
- "vif", &cds->num_nics);
+ &cds->num_nics);
if (cds->device_kind_flags & (1 << LIBXL__DEVICE_KIND_VBD))
cds->disks = libxl__device_list(gc, &libxl__disk_devtype, cds->domid,
- "vbd", &cds->num_disks);
+ &cds->num_disks);
if (cds->num_nics == 0 && cds->num_disks == 0)
goto out;
/* Use this args we can connect to qemu colo-compare */
cds->nics = libxl__device_list(gc, &libxl__nic_devtype,
- cds->domid, "vif", &cds->num_nics);
+ cds->domid, &cds->num_nics);
if (cds->num_nics > 0) {
css->cps.checkpoint_host = cds->nics[0].colo_checkpoint_host;
css->cps.checkpoint_port = cds->nics[0].colo_checkpoint_port;
}
void *libxl__device_list(libxl__gc *gc, const struct libxl_device_type *dt,
- uint32_t domid, const char* name, int *num)
+ uint32_t domid, int *num)
{
void *r = NULL;
void *list = NULL;
*num = 0;
libxl_path = GCSPRINTF("%s/device/%s",
- libxl__xs_libxl_path(gc, domid), name);
+ libxl__xs_libxl_path(gc, domid), dt->entry);
dir = libxl__xs_directory(gc, XBT_NULL, libxl_path, &ndirs);
return rc;
}
-libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num)
-{
- libxl_device_disk *r;
-
- GC_INIT(ctx);
-
- r = libxl__device_list(gc, &libxl__disk_devtype, domid, "vbd", num);
-
- GC_FREE;
-
- return r;
-}
-
-void libxl_device_disk_list_free(libxl_device_disk *list, int num)
-{
- libxl__device_list_free(&libxl__disk_devtype, list, num);
-}
-
int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
libxl_device_disk *disk, libxl_diskinfo *diskinfo)
{
goto out;
}
- disks = libxl__device_list(gc, &libxl__disk_devtype, domid, "vbd", &num);
+ disks = libxl__device_list(gc, &libxl__disk_devtype, domid, &num);
for (i = 0; i < num; i++) {
if (disks[i].is_cdrom && !strcmp(disk->vdev, disks[i].vdev))
{
elem->backend_domid == domid;
}
+LIBXL_DEFINE_DEVICE_LIST(disk)
+
#define libxl__device_disk_update_devid NULL
-DEFINE_DEVICE_TYPE_STRUCT(disk,
+DEFINE_DEVICE_TYPE_STRUCT_X(disk, disk, vbd,
.merge = libxl_device_disk_merge,
.dm_needed = libxl_device_disk_dm_needed,
.from_xenstore = (device_from_xenstore_fn_t)libxl__disk_from_xenstore,
if (!dt)
break;
- if (!dt->list || !dt->compare)
+ if (!dt->compare)
continue;
num_dev = libxl__device_type_get_num(dt, d_config);
- p = dt->list(CTX, domid, &num);
+ p = libxl__device_list(gc, dt, domid, &num);
if (p == NULL) {
LOGD(DEBUG, domid, "No %s from xenstore",
dt->type);
LIBXL_DEFINE_DEVICE_REMOVE_EXT(type, type, remove, 0) \
LIBXL_DEFINE_DEVICE_REMOVE_EXT(type, type, destroy, 1)
+#define LIBXL_DEFINE_DEVICE_LIST(type) \
+ libxl_device_##type *libxl_device_##type##_list(libxl_ctx *ctx, \
+ uint32_t domid, \
+ int *num) \
+ { \
+ libxl_device_##type *r; \
+ GC_INIT(ctx); \
+ r = libxl__device_list(gc, &libxl__##type##_devtype, \
+ domid, num); \
+ GC_FREE; \
+ return r; \
+ } \
+ \
+ void libxl_device_##type##_list_free(libxl_device_##type *list, \
+ int num) \
+ { \
+ libxl__device_list_free(&libxl__##type##_devtype, list, num); \
+ }
+
typedef void (*device_add_fn_t)(libxl__egc *, libxl__ao *, uint32_t,
libxl_domain_config *, libxl__multidev *);
-typedef void *(*device_list_fn_t)(libxl_ctx *, uint32_t, int *);
typedef int (*device_set_default_fn_t)(libxl__gc *, uint32_t, void *, bool);
typedef int (*device_to_device_fn_t)(libxl__gc *, uint32_t, void *,
libxl__device *);
struct libxl_device_type {
char *type;
+ char *entry;
int skip_attach; /* Skip entry in domcreate_attach_devices() if 1 */
int ptr_offset; /* Offset of device array ptr in libxl_domain_config */
int num_offset; /* Offset of # of devices in libxl_domain_config */
int dev_elem_size; /* Size of one device element in array */
device_add_fn_t add;
- device_list_fn_t list;
device_set_default_fn_t set_default;
device_to_device_fn_t to_device;
device_init_fn_t init;
device_set_xenstore_config_fn_t set_xenstore_config;
};
-#define DEFINE_DEVICE_TYPE_STRUCT_X(name, sname, ...) \
+#define DEFINE_DEVICE_TYPE_STRUCT_X(name, sname, sentry, ...) \
const struct libxl_device_type libxl__ ## name ## _devtype = { \
.type = #sname, \
+ .entry = #sentry, \
.ptr_offset = offsetof(libxl_domain_config, name ## s), \
.num_offset = offsetof(libxl_domain_config, num_ ## name ## s), \
.dev_elem_size = sizeof(libxl_device_ ## sname), \
.add = libxl__add_ ## name ## s, \
- .list = (device_list_fn_t)libxl_device_ ## sname ## _list, \
.set_default = (device_set_default_fn_t) \
libxl__device_ ## sname ## _setdefault, \
.to_device = (device_to_device_fn_t)libxl__device_from_ ## name, \
}
#define DEFINE_DEVICE_TYPE_STRUCT(name, ...) \
- DEFINE_DEVICE_TYPE_STRUCT_X(name, name, __VA_ARGS__)
+ DEFINE_DEVICE_TYPE_STRUCT_X(name, name, name, __VA_ARGS__)
static inline void **libxl__device_type_get_ptr(
const struct libxl_device_type *dt, const libxl_domain_config *d_config)
* libxl__device_list_free
*/
void* libxl__device_list(libxl__gc *gc, const struct libxl_device_type *dt,
- uint32_t domid, const char* name, int *num);
+ uint32_t domid, int *num);
void libxl__device_list_free(const struct libxl_device_type *dt,
void *list, int num);
#endif
if (rc)
return rc;
- nics = libxl__device_list(gc, &libxl__nic_devtype, domid, "vif", &nb);
+ nics = libxl__device_list(gc, &libxl__nic_devtype, domid, &nb);
if (!nics)
return ERROR_FAIL;
GC_INIT(ctx);
- r = libxl__device_list(gc, &libxl__nic_devtype, domid, "vif", num);
+ r = libxl__device_list(gc, &libxl__nic_devtype, domid, num);
GC_FREE;
LIBXL_DEFINE_DEVICES_ADD(nic)
LIBXL_DEFINE_DEVICE_REMOVE(nic)
-DEFINE_DEVICE_TYPE_STRUCT(nic,
+DEFINE_DEVICE_TYPE_STRUCT_X(nic, nic, vif,
.update_config = libxl_device_nic_update_config,
.from_xenstore = (device_from_xenstore_fn_t)libxl__nic_from_xenstore,
.set_xenstore_config = (device_set_xenstore_config_fn_t)
#define libxl__device_pci_update_devid NULL
-DEFINE_DEVICE_TYPE_STRUCT_X(pcidev, pci);
+DEFINE_DEVICE_TYPE_STRUCT_X(pcidev, pci, pci);
/*
* Local variables:
return 0;
}
-libxl_device_vdispl *libxl_device_vdispl_list(libxl_ctx *ctx, uint32_t domid,
- int *num)
-{
- libxl_device_vdispl *r;
-
- GC_INIT(ctx);
-
- r = libxl__device_list(gc, &libxl__vdispl_devtype, domid, "vdispl", num);
-
- GC_FREE;
-
- return r;
-}
-
-void libxl_device_vdispl_list_free(libxl_device_vdispl* list, int num)
-{
- libxl__device_list_free(&libxl__vdispl_devtype, list, num);
-}
-
static int libxl__device_vdispl_getconnectors(libxl_ctx *ctx,
const char *path,
libxl_vdisplinfo *info)
libxl_device_vdispl_init(vdispl);
- vdispls = libxl__device_list(gc, &libxl__vdispl_devtype,
- domid, "vdispl", &n);
+ vdispls = libxl__device_list(gc, &libxl__vdispl_devtype, domid, &n);
if (!vdispls) { rc = ERROR_NOTFOUND; goto out; }
static LIBXL_DEFINE_DEVICES_ADD(vdispl)
LIBXL_DEFINE_DEVICE_REMOVE(vdispl)
static LIBXL_DEFINE_UPDATE_DEVID(vdispl, "vdispl")
+LIBXL_DEFINE_DEVICE_LIST(vdispl)
DEFINE_DEVICE_TYPE_STRUCT(vdispl,
.update_config = (device_update_config_fn_t)libxl__update_config_vdispl,
return 0;
}
-libxl_device_vtpm *libxl_device_vtpm_list(libxl_ctx *ctx, uint32_t domid, int *num)
-{
- libxl_device_vtpm *r;
-
- GC_INIT(ctx);
-
- r = libxl__device_list(gc, &libxl__vtpm_devtype, domid, "vtpm", num);
-
- GC_FREE;
-
- return r;
-}
-
-void libxl_device_vtpm_list_free(libxl_device_vtpm* list, int num)
-{
- libxl__device_list_free(&libxl__vtpm_devtype, list, num);
-}
-
int libxl_device_vtpm_getinfo(libxl_ctx *ctx,
uint32_t domid,
libxl_device_vtpm *vtpm,
int nb, i;
int rc;
- vtpms = libxl__device_list(gc, &libxl__vtpm_devtype, domid, "vtpm", &nb);
+ vtpms = libxl__device_list(gc, &libxl__vtpm_devtype, domid, &nb);
if (!vtpms)
return ERROR_FAIL;
int nb, i;
int rc;
- vtpms = libxl__device_list(gc, &libxl__vtpm_devtype, domid, "vtpm", &nb);
+ vtpms = libxl__device_list(gc, &libxl__vtpm_devtype, domid, &nb);
if (!vtpms)
return ERROR_FAIL;
LIBXL_DEFINE_DEVICE_ADD(vtpm)
static LIBXL_DEFINE_DEVICES_ADD(vtpm)
LIBXL_DEFINE_DEVICE_REMOVE(vtpm)
+LIBXL_DEFINE_DEVICE_LIST(vtpm)
DEFINE_DEVICE_TYPE_STRUCT(vtpm,
.update_config = libxl_device_vtpm_update_config,