From edef2b102fec881aba7bd644e475f6e689dddd81 Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Fri, 13 Aug 2010 20:34:09 +0100 Subject: 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 Signed-off-by: Ian Jackson --- tools/libxl/libxl_device.c | 28 ++++++++++++++-------------- tools/libxl/libxl_xshelp.c | 3 +++ 2 files changed, 17 insertions(+), 14 deletions(-) (limited to 'tools/libxl') 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) { -- cgit v1.2.3