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

[Xen-changelog] [xen-unstable] [TOOLS] Enhance xenstore-ls to optionally display permissions.



# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID 153e69eae6655c648f4acee0b05ea4a8c0aeb808
# Parent  ee6014279103ccbf6d533b6549cbe08faa740f5d
[TOOLS] Enhance xenstore-ls to optionally display permissions.
Also perform an ioctl to determine the current width of the terminal.

Signed-off-by: Michael LeMay <mdlemay@xxxxxxxxxxxxxx>
---
 tools/xenstore/xsls.c |  103 ++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 92 insertions(+), 11 deletions(-)

diff -r ee6014279103 -r 153e69eae665 tools/xenstore/xsls.c
--- a/tools/xenstore/xsls.c     Wed Aug 02 14:59:22 2006 +0100
+++ b/tools/xenstore/xsls.c     Wed Aug 02 15:00:39 2006 +0100
@@ -3,8 +3,19 @@
 #include <string.h>
 #include <err.h>
 #include <xs.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
 
-void print_dir(struct xs_handle *h, char *path, int cur_depth)
+static int max_width = 80;
+static int desired_width = 60;
+
+#define TAG " = \"...\""
+#define TAG_LEN strlen(TAG)
+
+#define MIN(a, b) (((a) < (b))? (a) : (b))
+
+void print_dir(struct xs_handle *h, char *path, int cur_depth, int show_perms)
 {
     char **e;
     char newpath[512], *val;
@@ -16,33 +27,103 @@ void print_dir(struct xs_handle *h, char
         err(1, "xs_directory (%s)", path);
 
     for (i = 0; i<num; i++) {
-        int j;
-        for (j=0; j<cur_depth; j++) printf(" ");
-        printf("%s", e[i]);
+        char buf[MAX_STRLEN(unsigned int)+1];
+        struct xs_permissions *perms;
+        unsigned int nperms;
+        int linewid;
+
+        for (linewid=0; linewid<cur_depth; linewid++) putchar(' ');
+        linewid += printf("%.*s",
+                          (int) (max_width - TAG_LEN - linewid), e[i]);
         sprintf(newpath, "%s%s%s", path, 
                 path[strlen(path)-1] == '/' ? "" : "/", 
                 e[i]);
         val = xs_read(h, XBT_NULL, newpath, &len);
-        if (val == NULL)
+        if (val == NULL) {
             printf(":\n");
-        else if ((unsigned)len > (151 - strlen(e[i])))
-            printf(" = \"%.*s...\"\n", (int)(148 - strlen(e[i])), val);
-        else
-            printf(" = \"%s\"\n", val);
+        }
+        else {
+            if (max_width < (linewid + len + TAG_LEN)) {
+                printf(" = \"%.*s...\"",
+                       (int)(max_width - TAG_LEN - linewid), val);
+            }
+            else {
+                linewid += printf(" = \"%s\"", val);
+                if (show_perms) {
+                    putchar(' ');
+                    for (linewid++;
+                         linewid < MIN(desired_width, max_width);
+                         linewid++)
+                        putchar((linewid & 1)? '.' : ' ');
+                }
+            }
+        }
         free(val);
-        print_dir(h, newpath, cur_depth+1); 
+
+        if (show_perms) {
+            perms = xs_get_permissions(h, XBT_NULL, newpath, &nperms);
+            if (perms == NULL) {
+                warn("\ncould not access permissions for %s", e[i]);
+            }
+            else {
+                int i;
+                fputs("  (", stdout);
+                for (i = 0; i < nperms; i++) {
+                    if (i)
+                        putchar(',');
+                    xs_perm_to_string(perms+i, buf);
+                    fputs(buf, stdout);
+                }
+                putchar(')');
+            }
+        }
+
+        putchar('\n');
+            
+        print_dir(h, newpath, cur_depth+1, show_perms); 
     }
     free(e);
 }
 
+void usage(int argc, char *argv[])
+{
+    fprintf(stderr, "Usage: %s [-p] [path]\n", argv[0]);
+}
+
 int main(int argc, char *argv[])
 {
+    struct winsize ws;
+    int ret;
+    int c;
+    int show_perm = 0;
+
     struct xs_handle *xsh = xs_daemon_open();
 
     if (xsh == NULL)
         err(1, "xs_daemon_open");
 
-    print_dir(xsh, argc == 1 ? "/" : argv[1], 0);
+#define PAD 2
+
+    memset(&ws, 0, sizeof(ws));
+    ret = ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws);
+    if (!ret)
+        max_width = ws.ws_col - PAD;
+
+    while (0 < (c = getopt(argc, argv, "p"))) {
+        switch (c) {
+        case 'p':
+            show_perm = 1;
+            max_width -= 16;
+            break;
+        case ':':
+        case '?':
+        default:
+            usage(argc, argv);
+            return 0;
+        }
+    }
+
+    print_dir(xsh, (argc - optind) == 1 ? argv[optind] : "/", 0, show_perm);
 
     return 0;
 }

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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