aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxl/libxl.c
diff options
context:
space:
mode:
authorAnthony PERARD <anthony.perard@citrix.com>2011-01-06 18:03:11 +0000
committerAnthony PERARD <anthony.perard@citrix.com>2011-01-06 18:03:11 +0000
commit8e173f3bc39b07b95678af896115db5520eb94e8 (patch)
tree306397b7020d1a1d523245347f509f093305c5dc /tools/libxl/libxl.c
parent30cbc3ec4b4ecfd293f689c0f19126ecc5549c0d (diff)
downloadxen-8e173f3bc39b07b95678af896115db5520eb94e8.tar.gz
xen-8e173f3bc39b07b95678af896115db5520eb94e8.tar.bz2
xen-8e173f3bc39b07b95678af896115db5520eb94e8.zip
libxl: Factorize function libxl_device_disk_list
This patch adds function libxl_append_disk_list_of_type to get disks parameter of one backend type. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
Diffstat (limited to 'tools/libxl/libxl.c')
-rw-r--r--tools/libxl/libxl.c99
1 files changed, 50 insertions, 49 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 8f6561a87e..171aca616d 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -2495,61 +2495,62 @@ int libxl_device_vkb_hard_shutdown(libxl_ctx *ctx, uint32_t domid)
return ERROR_NI;
}
-libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num)
+static unsigned int libxl_append_disk_list_of_type(libxl_ctx *ctx,
+ uint32_t domid,
+ const char *type,
+ libxl_device_disk **disks,
+ unsigned int *ndisks)
{
libxl__gc gc = LIBXL_INIT_GC(ctx);
- char *be_path_tap, *be_path_vbd;
- libxl_device_disk *dend, *disks, *ret = NULL;
- char **b, **l = NULL;
- unsigned int numl, len;
- char *type;
-
- be_path_vbd = libxl__sprintf(&gc, "%s/backend/vbd/%d", libxl__xs_get_dompath(&gc, 0), domid);
- be_path_tap = libxl__sprintf(&gc, "%s/backend/tap/%d", libxl__xs_get_dompath(&gc, 0), domid);
-
- b = l = libxl__xs_directory(&gc, XBT_NULL, be_path_vbd, &numl);
- if (l) {
- ret = realloc(ret, sizeof(libxl_device_disk) * numl);
- disks = ret;
- *num = numl;
- dend = ret + *num;
- for (; disks < dend; ++disks, ++l) {
- disks->backend_domid = 0;
- disks->domid = domid;
- disks->physpath = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/%s/params", be_path_vbd, *l), &len);
- libxl_string_to_phystype(ctx, libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/type", be_path_vbd, *l)), &(disks->phystype));
- disks->virtpath = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/%s/dev", be_path_vbd, *l), &len);
- disks->unpluggable = atoi(libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/removable", be_path_vbd, *l)));
- if (!strcmp(libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/mode", be_path_vbd, *l)), "w"))
- disks->readwrite = 1;
- else
- disks->readwrite = 0;
- type = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/device-type", libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/frontend", be_path_vbd, *l))));
- disks->is_cdrom = !strcmp(type, "cdrom");
- }
- }
- b = l = libxl__xs_directory(&gc, XBT_NULL, be_path_tap, &numl);
- if (l) {
- ret = realloc(ret, sizeof(libxl_device_disk) * (*num + numl));
- disks = ret + *num;
- *num += numl;
- for (dend = ret + *num; disks < dend; ++disks, ++l) {
- disks->backend_domid = 0;
- disks->domid = domid;
- disks->physpath = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/%s/params", be_path_tap, *l), &len);
- libxl_string_to_phystype(ctx, libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/type", be_path_tap, *l)), &(disks->phystype));
- disks->virtpath = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/%s/dev", be_path_tap, *l), &len);
- disks->unpluggable = atoi(libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/removable", be_path_tap, *l)));
- if (!strcmp(libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/mode", be_path_tap, *l)), "w"))
- disks->readwrite = 1;
+ char *be_path = NULL;
+ char **dir = NULL;
+ unsigned int n = 0, len = 0;
+ libxl_device_disk *pdisk = NULL, *pdisk_end = NULL;
+ char *physpath_tmp = NULL;
+
+ be_path = libxl__sprintf(&gc, "%s/backend/%s/%d",
+ libxl__xs_get_dompath(&gc, 0), type, domid);
+ dir = libxl__xs_directory(&gc, XBT_NULL, be_path, &n);
+ if (dir) {
+ *disks = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n));
+ pdisk = *disks + *ndisks;
+ *ndisks += n;
+ pdisk_end = *disks + *ndisks;
+ for (; pdisk < pdisk_end; pdisk++, dir++) {
+ pdisk->backend_domid = 0;
+ pdisk->domid = domid;
+ physpath_tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/%s/params", be_path, *dir), &len);
+ if (strchr(physpath_tmp, ':')) {
+ pdisk->physpath = strdup(strchr(physpath_tmp, ':') + 1);
+ free(physpath_tmp);
+ } else {
+ pdisk->physpath = physpath_tmp;
+ }
+ libxl_string_to_phystype(ctx, libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/type", be_path, *dir)), &(pdisk->phystype));
+ pdisk->virtpath = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/%s/dev", be_path, *dir), &len);
+ pdisk->unpluggable = atoi(libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/removable", be_path, *dir)));
+ if (!strcmp(libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/mode", be_path, *dir)), "w"))
+ pdisk->readwrite = 1;
else
- disks->readwrite = 0;
- type = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/device-type", libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/frontend", be_path_tap, *l))));
- disks->is_cdrom = !strcmp(type, "cdrom");
+ pdisk->readwrite = 0;
+ type = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/device-type", libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/frontend", be_path, *dir))));
+ pdisk->is_cdrom = !strcmp(type, "cdrom");
}
}
+
libxl__free_all(&gc);
- return ret;
+ return n;
+}
+
+libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num)
+{
+ libxl_device_disk *disks = NULL;
+ unsigned int ndisks = 0;
+
+ *num = libxl_append_disk_list_of_type(ctx, domid, "vbd", &disks, &ndisks);
+ *num += libxl_append_disk_list_of_type(ctx, domid, "tap", &disks, &ndisks);
+
+ return disks;
}
int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,