The entries in xenstore have permission attributes. The attributes can be easily altered by xenstore-chmod, however, I cannot find a easy way to see them. I''ve modified xenstore_client.c to raise a new utility. The utility checks the permission and makes an easy-look output. Please tell me any suggestions. Thanks. Signed-off-by: Frank Pan <frankpzh@gmail.com> --- tools/xenstore/Makefile | 2 +- tools/xenstore/xenstore_client.c | 58 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletions(-) diff --git a/tools/xenstore/Makefile b/tools/xenstore/Makefile index 35e68d0..ca57e9c 100644 --- a/tools/xenstore/Makefile +++ b/tools/xenstore/Makefile @@ -9,7 +9,7 @@ CFLAGS += -I. CFLAGS += $(CFLAGS_libxenctrl) CLIENTS := xenstore-exists xenstore-list xenstore-read xenstore-rm xenstore-chmod -CLIENTS += xenstore-write xenstore-ls xenstore-watch +CLIENTS += xenstore-write xenstore-ls xenstore-watch xenstore-stat XENSTORED_OBJS = xenstored_core.o xenstored_watch.o xenstored_domain.o xenstored_transaction.o xs_lib.o talloc.o utils.o tdb.o hashtable.o diff --git a/tools/xenstore/xenstore_client.c b/tools/xenstore/xenstore_client.c index 94b82b9..cd8b4d8 100644 --- a/tools/xenstore/xenstore_client.c +++ b/tools/xenstore/xenstore_client.c @@ -37,6 +37,7 @@ enum mode { MODE_rm, MODE_write, MODE_watch, + MODE_stat, }; static char *output_buf = NULL; @@ -99,6 +100,9 @@ usage(enum mode mode, int incl_mode, const char *progname) case MODE_watch: mstr = incl_mode ? "watch " : ""; errx(1, "Usage: %s %s[-h] [-n NR] key", progname, mstr); + case MODE_stat: + mstr = incl_mode ? "stat " : ""; + errx(1, "Usage: %s %s[-h] [-s] key [...]", progname, mstr); } } @@ -286,6 +290,52 @@ do_watch(struct xs_handle *xsh, int max_events) } } +static const char * +perm_type_str(int perm_type) +{ + switch (perm_type) { + case XS_PERM_WRITE: + return "-w"; + case XS_PERM_READ: + return "r-"; + case XS_PERM_READ|XS_PERM_WRITE: + return "rw"; + case XS_PERM_NONE: + return "--"; + default: + return "uu"; + } +} + +static void +do_stat(struct xs_handle *xsh, xs_transaction_t xth, char *path) +{ + unsigned int i, nperms; + struct xs_permissions *perms; + + perms = xs_get_permissions(xsh, xth, path, &nperms); + if (!perms) + errx(1, "Unable to get permission on %s\n", path); + + if (!nperms) { + free(perms); + errx(1, "Cannot determine owner of %s\n", path); + } + + output("Path:\t\t\t%s\n", path); + output("Owner:\t\t\t%d\n", perms[0].id); + output("Default permission:\t%s\n", perm_type_str(perms[0].perms)); + output("Permissions:\t\t"); + for (i = 1; i < nperms; i++) { + output("%d: %s", perms[i].id, + perm_type_str(perms[i].perms)); + if (i < nperms - 1) + output(" "); + } + output("\n"); + free(perms); +} + static int perform(enum mode mode, int optind, int argc, char **argv, struct xs_handle *xsh, xs_transaction_t xth, int prefix, int tidy, int upto, int recurse, int nr_watches) @@ -459,6 +509,12 @@ perform(enum mode mode, int optind, int argc, char **argv, struct xs_handle *xsh errx(1, "Unable to add watch on %s\n", w); } do_watch(xsh, nr_watches); + break; + } + case MODE_stat: { + do_stat(xsh, xth, argv[optind]); + optind++; + break; } } } @@ -486,6 +542,8 @@ static enum mode lookup_mode(const char *m) return MODE_read; else if (strcmp(m, "watch") == 0) return MODE_watch; + else if (strcmp(m, "stat") == 0) + return MODE_stat; errx(1, "unknown mode %s\n", m); return 0; -- 1.7.1 -- 潘震皓, Frank Pan Computer Science and Technology Tsinghua University _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
You can just use: xenstore-ls -p You''ll get output like this: tool = "" . . . . . . . . . . . . . . . . . . . . . . . . . (n0) xenstored = "" . . . . . . . . . . . . . . . . . . . . . . (n0) vm = "" . . . . . . . . . . . . . . . . . . . . . . . . . . (n0) 59809a69-1c6d-48f1-bbbe-ed08e3d69b36 = "" . . . . . . . . . (n0,r4) uuid = "59809a69-1c6d-48f1-bbbe-ed08e3d69b36" . . . . . . (n0,r4) name = "domU" . . . . . . . . . . . . . . . . . . . . . . (n0,r4) pool_name = "Pool-0" . . . . . . . . . . . . . . . . . . . (n0,r4) image = "" . . . . . . . . . . . . . . . . . . . . . . . . (n0,r4) ostype = "linux" . . . . . . . . . . . . . . . . . . . . (n0,r4) kernel = "/boot/vmlinuz-domU" . . . . . . . . . . . . . . (n0,r4) ramdisk = "/boot/initrd.img-domU" . . . . . . . . . . . . (n0,r4) . . . Patrick On 30 March 2011 05:23, Frank Pan <frankpzh@gmail.com> wrote:> The entries in xenstore have permission attributes. The > attributes can be easily altered by xenstore-chmod, however, > I cannot find a easy way to see them. > > I''ve modified xenstore_client.c to raise a new utility. > The utility checks the permission and makes an easy-look output. > > Please tell me any suggestions. > Thanks. > > Signed-off-by: Frank Pan <frankpzh@gmail.com> > --- > tools/xenstore/Makefile | 2 +- > tools/xenstore/xenstore_client.c | 58 ++++++++++++++++++++++++++++++++++++++ > 2 files changed, 59 insertions(+), 1 deletions(-) > > diff --git a/tools/xenstore/Makefile b/tools/xenstore/Makefile > index 35e68d0..ca57e9c 100644 > --- a/tools/xenstore/Makefile > +++ b/tools/xenstore/Makefile > @@ -9,7 +9,7 @@ CFLAGS += -I. > CFLAGS += $(CFLAGS_libxenctrl) > > CLIENTS := xenstore-exists xenstore-list xenstore-read xenstore-rm > xenstore-chmod > -CLIENTS += xenstore-write xenstore-ls xenstore-watch > +CLIENTS += xenstore-write xenstore-ls xenstore-watch xenstore-stat > > XENSTORED_OBJS = xenstored_core.o xenstored_watch.o > xenstored_domain.o xenstored_transaction.o xs_lib.o talloc.o utils.o > tdb.o hashtable.o > > diff --git a/tools/xenstore/xenstore_client.c b/tools/xenstore/xenstore_client.c > index 94b82b9..cd8b4d8 100644 > --- a/tools/xenstore/xenstore_client.c > +++ b/tools/xenstore/xenstore_client.c > @@ -37,6 +37,7 @@ enum mode { > MODE_rm, > MODE_write, > MODE_watch, > + MODE_stat, > }; > > static char *output_buf = NULL; > @@ -99,6 +100,9 @@ usage(enum mode mode, int incl_mode, const char *progname) > case MODE_watch: > mstr = incl_mode ? "watch " : ""; > errx(1, "Usage: %s %s[-h] [-n NR] key", progname, mstr); > + case MODE_stat: > + mstr = incl_mode ? "stat " : ""; > + errx(1, "Usage: %s %s[-h] [-s] key [...]", progname, mstr); > } > } > > @@ -286,6 +290,52 @@ do_watch(struct xs_handle *xsh, int max_events) > } > } > > +static const char * > +perm_type_str(int perm_type) > +{ > + switch (perm_type) { > + case XS_PERM_WRITE: > + return "-w"; > + case XS_PERM_READ: > + return "r-"; > + case XS_PERM_READ|XS_PERM_WRITE: > + return "rw"; > + case XS_PERM_NONE: > + return "--"; > + default: > + return "uu"; > + } > +} > + > +static void > +do_stat(struct xs_handle *xsh, xs_transaction_t xth, char *path) > +{ > + unsigned int i, nperms; > + struct xs_permissions *perms; > + > + perms = xs_get_permissions(xsh, xth, path, &nperms); > + if (!perms) > + errx(1, "Unable to get permission on %s\n", path); > + > + if (!nperms) { > + free(perms); > + errx(1, "Cannot determine owner of %s\n", path); > + } > + > + output("Path:\t\t\t%s\n", path); > + output("Owner:\t\t\t%d\n", perms[0].id); > + output("Default permission:\t%s\n", perm_type_str(perms[0].perms)); > + output("Permissions:\t\t"); > + for (i = 1; i < nperms; i++) { > + output("%d: %s", perms[i].id, > + perm_type_str(perms[i].perms)); > + if (i < nperms - 1) > + output(" "); > + } > + output("\n"); > + free(perms); > +} > + > static int > perform(enum mode mode, int optind, int argc, char **argv, struct > xs_handle *xsh, > xs_transaction_t xth, int prefix, int tidy, int upto, int > recurse, int nr_watches) > @@ -459,6 +509,12 @@ perform(enum mode mode, int optind, int argc, > char **argv, struct xs_handle *xsh > errx(1, "Unable to add watch on %s\n", w); > } > do_watch(xsh, nr_watches); > + break; > + } > + case MODE_stat: { > + do_stat(xsh, xth, argv[optind]); > + optind++; > + break; > } > } > } > @@ -486,6 +542,8 @@ static enum mode lookup_mode(const char *m) > return MODE_read; > else if (strcmp(m, "watch") == 0) > return MODE_watch; > + else if (strcmp(m, "stat") == 0) > + return MODE_stat; > > errx(1, "unknown mode %s\n", m); > return 0; > -- > 1.7.1 > > -- > 潘震皓, Frank Pan > > Computer Science and Technology > Tsinghua University > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel > >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ah, I see Ian beat me to it. Looking over your patch, it seems like your tool will produce something much prettier too. Patrick On 30 March 2011 09:04, Patrick Colp <pjcolp@cs.ubc.ca> wrote:> You can just use: > > xenstore-ls -p > > You''ll get output like this: > > tool = "" . . . . . . . . . . . . . . . . . . . . . . . . . (n0) > xenstored = "" . . . . . . . . . . . . . . . . . . . . . . (n0) > vm = "" . . . . . . . . . . . . . . . . . . . . . . . . . . (n0) > 59809a69-1c6d-48f1-bbbe-ed08e3d69b36 = "" . . . . . . . . . (n0,r4) > uuid = "59809a69-1c6d-48f1-bbbe-ed08e3d69b36" . . . . . . (n0,r4) > name = "domU" . . . . . . . . . . . . . . . . . . . . . . (n0,r4) > pool_name = "Pool-0" . . . . . . . . . . . . . . . . . . . (n0,r4) > image = "" . . . . . . . . . . . . . . . . . . . . . . . . (n0,r4) > ostype = "linux" . . . . . . . . . . . . . . . . . . . . (n0,r4) > kernel = "/boot/vmlinuz-domU" . . . . . . . . . . . . . . (n0,r4) > ramdisk = "/boot/initrd.img-domU" . . . . . . . . . . . . (n0,r4) > . > . > . > > > Patrick > > > On 30 March 2011 05:23, Frank Pan <frankpzh@gmail.com> wrote: >> The entries in xenstore have permission attributes. The >> attributes can be easily altered by xenstore-chmod, however, >> I cannot find a easy way to see them. >> >> I''ve modified xenstore_client.c to raise a new utility. >> The utility checks the permission and makes an easy-look output. >> >> Please tell me any suggestions. >> Thanks. >> >> Signed-off-by: Frank Pan <frankpzh@gmail.com> >> --- >> tools/xenstore/Makefile | 2 +- >> tools/xenstore/xenstore_client.c | 58 ++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 59 insertions(+), 1 deletions(-) >> >> diff --git a/tools/xenstore/Makefile b/tools/xenstore/Makefile >> index 35e68d0..ca57e9c 100644 >> --- a/tools/xenstore/Makefile >> +++ b/tools/xenstore/Makefile >> @@ -9,7 +9,7 @@ CFLAGS += -I. >> CFLAGS += $(CFLAGS_libxenctrl) >> >> CLIENTS := xenstore-exists xenstore-list xenstore-read xenstore-rm >> xenstore-chmod >> -CLIENTS += xenstore-write xenstore-ls xenstore-watch >> +CLIENTS += xenstore-write xenstore-ls xenstore-watch xenstore-stat >> >> XENSTORED_OBJS = xenstored_core.o xenstored_watch.o >> xenstored_domain.o xenstored_transaction.o xs_lib.o talloc.o utils.o >> tdb.o hashtable.o >> >> diff --git a/tools/xenstore/xenstore_client.c b/tools/xenstore/xenstore_client.c >> index 94b82b9..cd8b4d8 100644 >> --- a/tools/xenstore/xenstore_client.c >> +++ b/tools/xenstore/xenstore_client.c >> @@ -37,6 +37,7 @@ enum mode { >> MODE_rm, >> MODE_write, >> MODE_watch, >> + MODE_stat, >> }; >> >> static char *output_buf = NULL; >> @@ -99,6 +100,9 @@ usage(enum mode mode, int incl_mode, const char *progname) >> case MODE_watch: >> mstr = incl_mode ? "watch " : ""; >> errx(1, "Usage: %s %s[-h] [-n NR] key", progname, mstr); >> + case MODE_stat: >> + mstr = incl_mode ? "stat " : ""; >> + errx(1, "Usage: %s %s[-h] [-s] key [...]", progname, mstr); >> } >> } >> >> @@ -286,6 +290,52 @@ do_watch(struct xs_handle *xsh, int max_events) >> } >> } >> >> +static const char * >> +perm_type_str(int perm_type) >> +{ >> + switch (perm_type) { >> + case XS_PERM_WRITE: >> + return "-w"; >> + case XS_PERM_READ: >> + return "r-"; >> + case XS_PERM_READ|XS_PERM_WRITE: >> + return "rw"; >> + case XS_PERM_NONE: >> + return "--"; >> + default: >> + return "uu"; >> + } >> +} >> + >> +static void >> +do_stat(struct xs_handle *xsh, xs_transaction_t xth, char *path) >> +{ >> + unsigned int i, nperms; >> + struct xs_permissions *perms; >> + >> + perms = xs_get_permissions(xsh, xth, path, &nperms); >> + if (!perms) >> + errx(1, "Unable to get permission on %s\n", path); >> + >> + if (!nperms) { >> + free(perms); >> + errx(1, "Cannot determine owner of %s\n", path); >> + } >> + >> + output("Path:\t\t\t%s\n", path); >> + output("Owner:\t\t\t%d\n", perms[0].id); >> + output("Default permission:\t%s\n", perm_type_str(perms[0].perms)); >> + output("Permissions:\t\t"); >> + for (i = 1; i < nperms; i++) { >> + output("%d: %s", perms[i].id, >> + perm_type_str(perms[i].perms)); >> + if (i < nperms - 1) >> + output(" "); >> + } >> + output("\n"); >> + free(perms); >> +} >> + >> static int >> perform(enum mode mode, int optind, int argc, char **argv, struct >> xs_handle *xsh, >> xs_transaction_t xth, int prefix, int tidy, int upto, int >> recurse, int nr_watches) >> @@ -459,6 +509,12 @@ perform(enum mode mode, int optind, int argc, >> char **argv, struct xs_handle *xsh >> errx(1, "Unable to add watch on %s\n", w); >> } >> do_watch(xsh, nr_watches); >> + break; >> + } >> + case MODE_stat: { >> + do_stat(xsh, xth, argv[optind]); >> + optind++; >> + break; >> } >> } >> } >> @@ -486,6 +542,8 @@ static enum mode lookup_mode(const char *m) >> return MODE_read; >> else if (strcmp(m, "watch") == 0) >> return MODE_watch; >> + else if (strcmp(m, "stat") == 0) >> + return MODE_stat; >> >> errx(1, "unknown mode %s\n", m); >> return 0; >> -- >> 1.7.1 >> >> -- >> 潘震皓, Frank Pan >> >> Computer Science and Technology >> Tsinghua University >> >> _______________________________________________ >> Xen-devel mailing list >> Xen-devel@lists.xensource.com >> http://lists.xensource.com/xen-devel >> >> >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel