# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1317389247 -3600
# Node ID 8645a81f04282ca4e3c51141b1c177ad9a8d5943
# Parent 9fdae058b42c9a8981599d96e1de3131997e7b64
libxl: refactor code to construct disk from xenstore backend
Temporarily retain unsafe behaviour of reading f.e. directory.
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
diff -r 9fdae058b42c -r 8645a81f0428 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c Fri Sep 30 14:27:27 2011 +0100
+++ b/tools/libxl/libxl.c Fri Sep 30 14:27:27 2011 +0100
@@ -1502,24 +1502,69 @@ int libxl_device_vkb_hard_shutdown(libxl
return ERROR_NI;
}
+static void libxl__device_disk_from_xs_be(libxl__gc *gc,
+ const char *be_path,
+ libxl_device_disk *disk)
+{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
+ unsigned int len;
+ char *tmp;
+ const char *fe_path; /* XXX unsafe */
+
+ memset(disk, 0, sizeof(*disk));
+
+ tmp = xs_read(ctx->xsh, XBT_NULL,
+ libxl__sprintf(gc, "%s/params", be_path), &len);
+ if (tmp && strchr(tmp, ':')) {
+ disk->pdev_path = strdup(strchr(tmp, ':') + 1);
+ free(tmp);
+ } else {
+ disk->pdev_path = tmp;
+ }
+ libxl_string_to_backend(ctx,
+ libxl__xs_read(gc, XBT_NULL,
+ libxl__sprintf(gc, "%s/type", be_path)),
+ &(disk->backend));
+ disk->vdev = xs_read(ctx->xsh, XBT_NULL,
+ libxl__sprintf(gc, "%s/dev", be_path), &len);
+ tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf
+ (gc, "%s/removable", be_path));
+
+ if (tmp)
+ disk->removable = atoi(tmp);
+ else
+ disk->removable = 0;
+
+ tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/mode", be_path));
+ if (!strcmp(tmp, "w"))
+ disk->readwrite = 1;
+ else
+ disk->readwrite = 0;
+
+ fe_path = libxl__xs_read(gc, XBT_NULL,
+ libxl__sprintf(gc, "%s/frontend", be_path));
+ tmp = libxl__xs_read(gc, XBT_NULL,
+ libxl__sprintf(gc, "%s/device-type", fe_path));
+ disk->is_cdrom = !strcmp(tmp, "cdrom");
+
+ disk->format = LIBXL_DISK_FORMAT_UNKNOWN;
+}
+
static int libxl__append_disk_list_of_type(libxl__gc *gc,
uint32_t domid,
const char *type,
libxl_device_disk **disks,
int *ndisks)
{
- libxl_ctx *ctx = libxl__gc_owner(gc);
char *be_path = NULL;
char **dir = NULL;
- unsigned int n = 0, len = 0;
+ unsigned int n = 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) {
- char *removable;
libxl_device_disk *tmp;
tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n));
if (tmp == NULL)
@@ -1529,32 +1574,10 @@ static int libxl__append_disk_list_of_ty
*ndisks += n;
pdisk_end = *disks + *ndisks;
for (; pdisk < pdisk_end; pdisk++, dir++) {
- memset(pdisk, 0, sizeof(*pdisk));
+ const char *p;
+ p = libxl__sprintf(gc, "%s/%s", be_path, *dir);
+ libxl__device_disk_from_xs_be(gc, p, pdisk);
pdisk->backend_domid = 0;
- physpath_tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc,
"%s/%s/params", be_path, *dir), &len);
- if (physpath_tmp && strchr(physpath_tmp, ':')) {
- pdisk->pdev_path = strdup(strchr(physpath_tmp, ':') + 1);
- free(physpath_tmp);
- } else {
- pdisk->pdev_path = physpath_tmp;
- }
- libxl_string_to_backend(ctx, libxl__xs_read(gc, XBT_NULL,
- libxl__sprintf(gc, "%s/%s/type", be_path, *dir)),
- &(pdisk->backend));
- pdisk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc,
"%s/%s/dev", be_path, *dir), &len);
- removable = libxl__xs_read(gc, XBT_NULL, libxl__sprintf
- (gc, "%s/%s/removable", be_path, *dir));
- if (removable)
- pdisk->removable = atoi(removable);
- else
- pdisk->removable = 0;
- if (!strcmp(libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc,
"%s/%s/mode", be_path, *dir)), "w"))
- pdisk->readwrite = 1;
- else
- 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");
- pdisk->format = LIBXL_DISK_FORMAT_UNKNOWN;
}
}
return 0;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|