[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] xenstore-stat v2
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@xxxxxxxxx> --- 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@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |