@@ -1990,6 +1990,67 @@ out:
return rc;
}
+void *libxl__device_list(libxl__gc *gc, const struct libxl_device_type *dt,
+ uint32_t domid, const char* name, int *num)
+{
+ void *r = NULL;
+ void *list = NULL;
+ void *item = NULL;
+ char *libxl_path;
+ char **dir = NULL;
+ unsigned int ndirs = 0;
+ int rc;
+
+ *num = 0;
+
+ libxl_path = GCSPRINTF("%s/device/%s",
+ libxl__xs_libxl_path(gc, domid), name);
+
+ dir = libxl__xs_directory(gc, XBT_NULL, libxl_path, &ndirs);
+
+ if (dir && ndirs) {
+ list = libxl__malloc(NOGC, dt->dev_elem_size * ndirs);
+ item = list;
+
+ while (*num < ndirs) {
+ dt->init(item);
+ ++(*num);
+
+ if (dt->from_xenstore) {
+ char *device_libxl_path = GCSPRINTF("%s/%s", libxl_path, *dir);
+ rc = dt->from_xenstore(gc, device_libxl_path, atoi(*dir), item);
+ if (rc) goto out;
+ }
+
+ item = (uint8_t *)item + dt->dev_elem_size;
+ ++dir;
+ }
+ }
+
+ r = list;
+ list = NULL;
+
+out:
+
+ if (list) {
+ libxl__device_list_free(dt, list, *num);
+ *num = 0;
+ }
+
+ return r;
+}
+
+void libxl__device_list_free(const struct libxl_device_type *dt,
+ void *list, int num)
+{
+ int i;
+
+ for (i = 0; i < num; i++)
+ dt->dispose((uint8_t*)list + i * dt->dev_elem_size);
+
+ free(list);
+}
+
/*
* Local variables:
* mode: C
@@ -3505,6 +3505,7 @@ struct libxl_device_type {
int (*dm_needed)(void *, unsigned);
void (*update_config)(libxl__gc *, void *, void *);
int (*update_devid)(libxl__gc *, uint32_t, void *);
+ int (*from_xenstore)(libxl__gc *, const char *, libxl_devid, void *);
int (*set_xenstore_config)(libxl__gc *, uint32_t, void *, flexarray_t *,
flexarray_t *, flexarray_t *);
};
@@ -4385,6 +4386,13 @@ void libxl__device_add_async(libxl__egc *egc, uint32_t domid,
int libxl__device_add(libxl__gc *gc, uint32_t domid,
const struct libxl_device_type *dt, void *type);
+/* Caller is responsible for freeing the memory by calling
+ * 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);
+void libxl__device_list_free(const struct libxl_device_type *dt,
+ void *list, int num);
#endif
/*