aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefano Stabellini <stefano.stabellini@eu.citrix.com>2010-08-13 20:34:09 +0100
committerStefano Stabellini <stefano.stabellini@eu.citrix.com>2010-08-13 20:34:09 +0100
commitedef2b102fec881aba7bd644e475f6e689dddd81 (patch)
treef7e709cd8eebf7ae88f4f934ace03a7d0cea5291
parent036b528f559911f1d820168ad90b2dd8cbd7f787 (diff)
downloadxen-edef2b102fec881aba7bd644e475f6e689dddd81.tar.gz
xen-edef2b102fec881aba7bd644e475f6e689dddd81.tar.bz2
xen-edef2b102fec881aba7bd644e475f6e689dddd81.zip
tools/libxl: libxl_device_generic_add: handle NULL fents or bents
This is going to be used by libxl_console_add in the next patch to avoid creating the device/console path on xenstore for console 0. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
-rw-r--r--tools/libxl/libxl_device.c28
-rw-r--r--tools/libxl/libxl_xshelp.c3
2 files changed, 17 insertions, 14 deletions
diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
index 905fe58c05..58cff09fc9 100644
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -76,21 +76,21 @@ retry_transaction:
t = xs_transaction_start(ctx->xsh);
/* FIXME: read frontend_path and check state before removing stuff */
- xs_rm(ctx->xsh, t, frontend_path);
- xs_rm(ctx->xsh, t, backend_path);
-
- xs_mkdir(ctx->xsh, t, frontend_path);
- xs_set_permissions(ctx->xsh, t, frontend_path, frontend_perms, ARRAY_SIZE(frontend_perms));
-
- xs_mkdir(ctx->xsh, t, backend_path);
- xs_set_permissions(ctx->xsh, t, backend_path, backend_perms, ARRAY_SIZE(backend_perms));
-
- xs_write(ctx->xsh, t, libxl_sprintf(&gc, "%s/backend", frontend_path), backend_path, strlen(backend_path));
- xs_write(ctx->xsh, t, libxl_sprintf(&gc, "%s/frontend", backend_path), frontend_path, strlen(frontend_path));
+ if (fents) {
+ xs_rm(ctx->xsh, t, frontend_path);
+ xs_mkdir(ctx->xsh, t, frontend_path);
+ xs_set_permissions(ctx->xsh, t, frontend_path, frontend_perms, ARRAY_SIZE(frontend_perms));
+ xs_write(ctx->xsh, t, libxl_sprintf(&gc, "%s/backend", frontend_path), backend_path, strlen(backend_path));
+ libxl_xs_writev(&gc, t, frontend_path, fents);
+ }
- /* and write frontend kvs and backend kvs */
- libxl_xs_writev(&gc, t, backend_path, bents);
- libxl_xs_writev(&gc, t, frontend_path, fents);
+ if (bents) {
+ xs_rm(ctx->xsh, t, backend_path);
+ xs_mkdir(ctx->xsh, t, backend_path);
+ xs_set_permissions(ctx->xsh, t, backend_path, backend_perms, ARRAY_SIZE(backend_perms));
+ xs_write(ctx->xsh, t, libxl_sprintf(&gc, "%s/frontend", backend_path), frontend_path, strlen(frontend_path));
+ libxl_xs_writev(&gc, t, backend_path, bents);
+ }
if (!xs_transaction_end(ctx->xsh, t, 0)) {
if (errno == EAGAIN)
diff --git a/tools/libxl/libxl_xshelp.c b/tools/libxl/libxl_xshelp.c
index 3098f343c2..90acd5d045 100644
--- a/tools/libxl/libxl_xshelp.c
+++ b/tools/libxl/libxl_xshelp.c
@@ -49,6 +49,9 @@ char **libxl_xs_kvs_of_flexarray(libxl_gc *gc, flexarray_t *array, int length)
char **kvs;
int i;
+ if (!length)
+ return NULL;
+
kvs = libxl_calloc(gc, length + 2, sizeof(char *));
if (kvs) {
for (i = 0; i < length; i += 2) {