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