> -----Original Message-----
> From: Ian Campbell [mailto:ian.campb...@citrix.com]
> Sent: 16 November 2015 12:55
> To: Paul Durrant; xen-de...@lists.xenproject.org
> Cc: Ian Jackson; Stefano Stabellini; Wei Liu
> Subject: Re: [RFC PATCH 2/6] libxl: stop using libxl__xs_mkdir() for
> ~/control/shutdown
> 
> 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?)
> 

That's a good point. I would have thought wiring an xs_write() failure back 
through to the caller would be a good idea (and same goes for 
xs_set_permissions, I guess).

  Paul

> >      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

Reply via email to