[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 3/3] libxl: stop using libxl__xs_mkdir() for ~/control/shutdown
As documented in docs/misc/xenstore, the XS_MKDIR operation merely makes sure a path exists whereas ~/control/shutdown needs to start empty. Also using XS_MKDIR for a node which is never supposed to have children is somewhat counterintuitive. This patch introduces a new libxl__xs_printf_perms() function analogous to libxl__xs_printf() but taking explicit permissions arguments, and then uses this to create an empty ~/control/shutdown node. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx> Cc: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/libxl/libxl_create.c | 16 +++++++++----- tools/libxl/libxl_internal.h | 10 +++++++++ tools/libxl/libxl_xshelp.c | 52 +++++++++++++++++++++++++++++++++++++------- 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 921d155..279deda 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -484,7 +484,7 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_config *d_config, libxl_ctx *ctx = libxl__gc_owner(gc); int flags, ret, rc, nb_vm; char *uuid_string; - char *dom_path, *vm_path, *libxl_path; + char *dom_path, *vm_path, *libxl_path, *control_path; struct xs_permissions roperm[2]; struct xs_permissions rwperm[1]; struct xs_permissions noperm[1]; @@ -605,17 +605,21 @@ retry_transaction: libxl__xs_mkdir(gc, t, libxl__sprintf(gc, "%s/device", dom_path), roperm, ARRAY_SIZE(roperm)); - libxl__xs_mkdir(gc, t, - libxl__sprintf(gc, "%s/control", dom_path), + + control_path = libxl__sprintf(gc, "%s/control", dom_path); + + libxl__xs_mkdir(gc, t, control_path, roperm, ARRAY_SIZE(roperm)); if (info->type == LIBXL_DOMAIN_TYPE_HVM) libxl__xs_mkdir(gc, t, libxl__sprintf(gc, "%s/hvmloader", dom_path), roperm, ARRAY_SIZE(roperm)); - libxl__xs_mkdir(gc, t, - libxl__sprintf(gc, "%s/control/shutdown", dom_path), - rwperm, ARRAY_SIZE(rwperm)); + libxl__xs_printf_perms(gc, t, + libxl__sprintf(gc, "%s/shutdown", control_path), + rwperm, ARRAY_SIZE(rwperm), + ""); + libxl__xs_mkdir(gc, t, libxl__sprintf(gc, "%s/device/suspend/event-channel", dom_path), rwperm, ARRAY_SIZE(rwperm)); diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index e51d57f..94f05cd 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -667,6 +667,16 @@ _hidden int libxl__xs_writev_perms(libxl__gc *gc, xs_transaction_t t, _hidden int libxl__xs_writev_atonce(libxl__gc *gc, const char *dir, char **kvs); +_hidden int libxl__xs_vprintf_perms(libxl__gc *gc, xs_transaction_t t, + const char *path, + struct xs_permissions *perms, + unsigned int num_perms, + const char *fmt, va_list ap); +_hidden int libxl__xs_printf_perms(libxl__gc *gc, xs_transaction_t t, + const char *path, + struct xs_permissions *perms, + unsigned int num_perms, + const char *fmt, ...) PRINTF_ATTRIBUTE(6, 7); _hidden int libxl__xs_printf(libxl__gc *gc, xs_transaction_t t, const char *path, const char *fmt, ...) PRINTF_ATTRIBUTE(4, 5); /* Each fn returns 0 on success. diff --git a/tools/libxl/libxl_xshelp.c b/tools/libxl/libxl_xshelp.c index a178039..6d4f33d 100644 --- a/tools/libxl/libxl_xshelp.c +++ b/tools/libxl/libxl_xshelp.c @@ -98,22 +98,58 @@ out: } -int libxl__xs_printf(libxl__gc *gc, xs_transaction_t t, - const char *path, const char *fmt, ...) +int libxl__xs_vprintf_perms(libxl__gc *gc, xs_transaction_t t, + const char *path, + struct xs_permissions *perms, + unsigned int num_perms, + const char *fmt, + va_list ap) { libxl_ctx *ctx = libxl__gc_owner(gc); char *s; + int ret; + + ret = vasprintf(&s, fmt, ap); + if (ret == -1) + return ERROR_FAIL; + + libxl__ptr_add(gc, s); + + if (!xs_write(ctx->xsh, t, path, s, ret)) + return ERROR_FAIL; + if (perms && !xs_set_permissions(ctx->xsh, t, path, perms, num_perms)) + return ERROR_FAIL; + + return 0; +} + +int libxl__xs_printf_perms(libxl__gc *gc, xs_transaction_t t, + const char *path, + struct xs_permissions *perms, + unsigned int num_perms, + const char *fmt, ...) +{ va_list ap; int ret; + va_start(ap, fmt); - ret = vasprintf(&s, fmt, ap); + ret = libxl__xs_vprintf_perms(gc, t, path, perms, num_perms, fmt, ap); va_end(ap); - if (ret == -1) { - return ERROR_FAIL; - } - libxl__ptr_add(gc, s); - return xs_write(ctx->xsh, t, path, s, ret) ? 0 : ERROR_FAIL; + return ret; +} + +int libxl__xs_printf(libxl__gc *gc, xs_transaction_t t, + const char *path, const char *fmt, ...) +{ + va_list ap; + int ret; + + va_start(ap, fmt); + ret = libxl__xs_vprintf_perms(gc, t, path, NULL, 0, fmt, ap); + va_end(ap); + + return ret; } char * libxl__xs_read(libxl__gc *gc, xs_transaction_t t, const char *path) -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |