On Wed, 2015-11-11 at 16:18 +0000, Paul Durrant wrote: > 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.durr...@citrix.com> > Cc: Ian Jackson <ian.jack...@eu.citrix.com> > Cc: Stefano Stabellini <stefano.stabell...@eu.citrix.com> > Cc: Ian Campbell <ian.campb...@citrix.com> > Cc: Wei Liu <wei.l...@citrix.com> > --- > tools/libxl/libxl_create.c | 16 ++++++++++------ > tools/libxl/libxl_internal.h | 10 ++++++++++ > tools/libxl/libxl_xshelp.c | 44 > ++++++++++++++++++++++++++++++++++++++------ > 3 files changed, 58 insertions(+), 12 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 4710804..04d8a29 100644 > --- a/tools/libxl/libxl_internal.h > +++ b/tools/libxl/libxl_internal.h > @@ -666,6 +666,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 3cac4f2..0b56f8b 100644 > --- a/tools/libxl/libxl_xshelp.c > +++ b/tools/libxl/libxl_xshelp.c > @@ -96,25 +96,57 @@ 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; > - va_list ap; > int ret; > - va_start(ap, fmt); > - ret = vasprintf(&s, fmt, ap); > - va_end(ap); > > + ret = vasprintf(&s, fmt, ap); > if (ret == -1) { > return -1; > } > xs_write(ctx->xsh, t, path, s, ret); > + if (perms) > + xs_set_permissions(ctx->xsh, t, path, perms, num_perms);
This can fail, can't it? (OTOH so can xs_write, so maybe there is some reason we apparently don't care for such things here?) > free(s); > 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 = libxl__xs_vprintf_perms(gc, t, path, perms, num_perms, fmt, > ap); > + va_end(ap); > + > + 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) > { > libxl_ctx *ctx = libxl__gc_owner(gc); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel