The entries in xenstore have permission attributes. The
attributes can be easily altered by xenstore-chmod, however,
I cannot find an easy way to view them.
I've modified xenstore_client.c to raise a new utility.
The utility checks the permission and makes an easy-to-look output.
Please tell me any suggestions.
Thanks.
Signed-off-by: Frank Pan <frankpzh@xxxxxxxxx>
---
tools/xenstore/Makefile | 2 +-
tools/xenstore/xenstore_client.c | 51 ++++++++++++++++++++++++++++++++++++++
2 files changed, 52 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..3a537ce 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,23 @@ 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 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 +480,34 @@ 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: {
+ unsigned int i, nperms;
+ struct xs_permissions *perms;
+
+ perms = xs_get_permissions(xsh, xth, argv[optind], &nperms);
+ if (!perms)
+ errx(1, "Unable to get permission on %s\n", argv[optind]);
+
+ if (!nperms) {
+ free(perms);
+ errx(1, "Cannot determine owner of %s\n", argv[optind]);
+ }
+
+ 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", perms[0].id);
+ for (i = 1; i < nperms; i++) {
+ output("%d: %s", perms[0].id,
+ perm_type_str(perms[0].perms));
+ if (i < nperms - 1)
+ output(" ");
+ }
+ output("\n");
+ free(perms);
+ optind++;
+ break;
}
}
}
@@ -486,6 +535,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
|