[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |