[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] xenstore-stat v2


  • To: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>, Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>, Ian Campbell <Ian.Campbell@xxxxxxxxxx>
  • From: Frank Pan <frankpzh@xxxxxxxxx>
  • Date: Wed, 30 Mar 2011 20:23:28 +0800
  • Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
  • Delivery-date: Wed, 30 Mar 2011 05:24:41 -0700
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:from:date:message-id:subject:to:cc:content-type :content-transfer-encoding; b=EywPOb0V31G6mpK8Jurli0K1SeADt3rCB4OmQzGQ1sPprPH/lnNxQhDdLnuzOe0j80 UptiuQn7+MV3tvjsTOZjtWql3wvsdrHMx0ma01UKTg0cADrZt6EdxMySBil9ike1cDoR k6vhKojoMsv3xfxfWFbv47zvLhrLDdlP0/7RU=
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.