@@ -3470,6 +3470,44 @@ _hidden void libxl__bootloader_run(libxl__egc*, libxl__bootloader_state *st);
return 0; \
}
+#define LIBXL_DEFINE_DEVID_TO_DEVICE(name) \
+ int libxl_devid_to_device_##name(libxl_ctx *ctx, uint32_t domid, \
+ int devid, \
+ libxl_device_##name *type) \
+ { \
+ GC_INIT(ctx); \
+ \
+ char *device_path; \
+ const char *tmp; \
+ int rc; \
+ \
+ libxl_device_##name##_init(type); \
+ \
+ device_path = GCSPRINTF("%s/device/%s/%d", \
+ libxl__xs_libxl_path(gc, domid), \
+ libxl__device_kind_to_string( \
+ libxl__##name##_devtype.type), \
+ devid); \
+ \
+ if (libxl__xs_read_mandatory(gc, XBT_NULL, device_path, &tmp)) {\
+ rc = ERROR_NOTFOUND; goto out; \
+ } \
+ \
+ if (libxl__##name##_devtype.from_xenstore) { \
+ rc = libxl__##name##_devtype.from_xenstore(gc, device_path, \
+ devid, type); \
+ if (rc) goto out; \
+ } \
+ \
+ rc = 0; \
+ \
+ out: \
+ \
+ GC_FREE; \
+ return rc; \
+ }
+
+
#define LIBXL_DEFINE_DEVICE_REMOVE(type) \
LIBXL_DEFINE_DEVICE_REMOVE_EXT(type, generic, remove, 0) \
LIBXL_DEFINE_DEVICE_REMOVE_EXT(type, generic, destroy, 1)
@@ -381,31 +381,6 @@ static int libxl__nic_from_xenstore(libxl__gc *gc, const char *libxl_path,
return rc;
}
-int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
- int devid, libxl_device_nic *nic)
-{
- GC_INIT(ctx);
- char *libxl_dom_path, *libxl_path;
- int rc = ERROR_FAIL;
-
- libxl_device_nic_init(nic);
- libxl_dom_path = libxl__xs_libxl_path(gc, domid);
- if (!libxl_dom_path)
- goto out;
-
- libxl_path = GCSPRINTF("%s/device/%s/%d", libxl_dom_path,
- libxl__device_kind_to_string(LIBXL__DEVICE_KIND_VIF),
- devid);
-
- rc = libxl__nic_from_xenstore(gc, libxl_path, devid, nic);
- if (rc) goto out;
-
- rc = 0;
-out:
- GC_FREE;
- return rc;
-}
-
libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num)
{
libxl_device_nic *r;
@@ -529,6 +504,7 @@ out:
static LIBXL_DEFINE_UPDATE_DEVID(nic)
static LIBXL_DEFINE_DEVICE_FROM_TYPE(nic)
+LIBXL_DEFINE_DEVID_TO_DEVICE(nic)
LIBXL_DEFINE_DEVICE_ADD(nic)
LIBXL_DEFINE_DEVICES_ADD(nic)
LIBXL_DEFINE_DEVICE_REMOVE(nic)
@@ -198,44 +198,11 @@ out:
return rc;
}
-int libxl_devid_to_device_vdispl(libxl_ctx *ctx, uint32_t domid,
- int devid, libxl_device_vdispl *vdispl)
-{
- GC_INIT(ctx);
-
- libxl_device_vdispl *vdispls = NULL;
- int n, i;
- int rc;
-
- libxl_device_vdispl_init(vdispl);
-
- vdispls = libxl__device_list(gc, &libxl__vdispl_devtype, domid, &n);
-
- if (!vdispls) { rc = ERROR_NOTFOUND; goto out; }
-
- for (i = 0; i < n; ++i) {
- if (devid == vdispls[i].devid) {
- libxl_device_vdispl_copy(ctx, vdispl, &vdispls[i]);
- rc = 0;
- goto out;
- }
- }
-
- rc = ERROR_NOTFOUND;
-
-out:
-
- if (vdispls)
- libxl__device_list_free(&libxl__vdispl_devtype, vdispls, n);
-
- GC_FREE;
- return rc;
-}
-
static LIBXL_DEFINE_DEVICE_FROM_TYPE(vdispl)
static LIBXL_DEFINE_UPDATE_DEVID(vdispl)
static LIBXL_DEFINE_DEVICES_ADD(vdispl)
+LIBXL_DEFINE_DEVID_TO_DEVICE(vdispl)
LIBXL_DEFINE_DEVICE_ADD(vdispl)
LIBXL_DEFINE_DEVICE_REMOVE(vdispl)
LIBXL_DEFINE_DEVICE_LIST(vdispl)
@@ -61,40 +61,6 @@ out:
return AO_INPROGRESS;
}
-int libxl_devid_to_device_vkb(libxl_ctx *ctx, uint32_t domid,
- int devid, libxl_device_vkb *vkb)
-{
- GC_INIT(ctx);
-
- libxl_device_vkb *vkbs = NULL;
- int n, i;
- int rc;
-
- libxl_device_vkb_init(vkb);
-
- vkbs = libxl__device_list(gc, &libxl__vkb_devtype, domid, &n);
-
- if (!vkbs) { rc = ERROR_NOTFOUND; goto out; }
-
- for (i = 0; i < n; ++i) {
- if (devid == vkbs[i].devid) {
- libxl_device_vkb_copy(ctx, vkb, &vkbs[i]);
- rc = 0;
- goto out;
- }
- }
-
- rc = ERROR_NOTFOUND;
-
-out:
-
- if (vkbs)
- libxl__device_list_free(&libxl__vkb_devtype, vkbs, n);
-
- GC_FREE;
- return rc;
-}
-
int libxl_device_vkb_getinfo(libxl_ctx *ctx, uint32_t domid,
libxl_device_vkb *vkb,
libxl_vkbinfo *info)
@@ -152,6 +118,7 @@ static LIBXL_DEFINE_DEVICE_FROM_TYPE(vkb)
#define libxl__add_vkbs NULL
#define libxl_device_vkb_compare NULL
+LIBXL_DEFINE_DEVID_TO_DEVICE(vkb)
LIBXL_DEFINE_DEVICE_LIST(vkb)
LIBXL_DEFINE_DEVICE_REMOVE(vkb)
@@ -593,45 +593,11 @@ out:
return rc;
}
-int libxl_devid_to_device_vsnd(libxl_ctx *ctx, uint32_t domid,
- int devid, libxl_device_vsnd *vsnd)
-{
- GC_INIT(ctx);
-
- libxl_device_vsnd *vsnds = NULL;
- int n, i;
- int rc;
-
- libxl_device_vsnd_init(vsnd);
-
- vsnds = libxl__device_list(gc, &libxl__vsnd_devtype, domid, &n);
-
- if (!vsnds) { rc = ERROR_NOTFOUND; goto out; }
-
- for (i = 0; i < n; ++i) {
- if (devid == vsnds[i].devid) {
- libxl_device_vsnd_copy(ctx, vsnd, &vsnds[i]);
- rc = 0;
- goto out;
- }
- }
-
- rc = ERROR_NOTFOUND;
-
-out:
-
- if (vsnds)
- libxl__device_list_free(&libxl__vsnd_devtype, vsnds, n);
-
- GC_FREE;
- return rc;
-}
-
-
static LIBXL_DEFINE_UPDATE_DEVID(vsnd)
static LIBXL_DEFINE_DEVICE_FROM_TYPE(vsnd)
static LIBXL_DEFINE_DEVICES_ADD(vsnd)
+LIBXL_DEFINE_DEVID_TO_DEVICE(vsnd)
LIBXL_DEFINE_DEVICE_ADD(vsnd)
LIBXL_DEFINE_DEVICE_REMOVE(vsnd)
LIBXL_DEFINE_DEVICE_LIST(vsnd)