Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH 2/4] attr: Make zlistattr return an array, zdelattr take several attrs



---
 Completion/Zsh/Command/_zattr |    2 +-
 Src/Modules/attr.c            |   39 ++++++++++++++++++++++++++++++---------
 2 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/Completion/Zsh/Command/_zattr b/Completion/Zsh/Command/_zattr
index 55804db..a6ae806 100644
--- a/Completion/Zsh/Command/_zattr
+++ b/Completion/Zsh/Command/_zattr
@@ -31,6 +31,6 @@ esac
 if [[ $state = attrs ]]; then
   if [[ -f $~line[1] ]]; then
     zlistattr $~line[1] REPLY
-    _wanted attrs expl 'attribute' compadd ${(0)REPLY}
+    _wanted attrs expl 'attribute' compadd $REPLY
   fi
 fi
diff --git a/Src/Modules/attr.c b/Src/Modules/attr.c
index cbf3d92..1a9c323 100644
--- a/Src/Modules/attr.c
+++ b/Src/Modules/attr.c
@@ -142,12 +142,16 @@ bin_delattr(char *nam, char **argv, Options ops, UNUSED(int func))
 {
     int ret = 0, slen;
     int symlink = OPT_ISSET(ops, 'h');
+    char *file = *argv;

-    unmetafy(*argv, &slen);
-    unmetafy(*(argv+1), NULL);
-    if (xremovexattr(*argv, *(argv+1), symlink)) {
-        zwarnnam(nam, "%s: %e", metafy(*argv, slen, META_NOALLOC), errno);
-        ret = 1;
+    unmetafy(file, &slen);
+    while (*++argv) {
+        unmetafy(*argv, NULL);
+        if (xremovexattr(file, *argv, symlink)) {
+            zwarnnam(nam, "%s: %e", metafy(file, slen, META_NOALLOC), errno);
+            ret = 1;
+            break;
+        }
     }
     return ret;
 }
@@ -164,9 +168,26 @@ bin_listattr(char *nam, char **argv, Options ops, UNUSED(int func))
     if (0 < (len = xlistxattr(*argv, value, 256, symlink))) {
         if (len < 256) {
             char *p = value;
-            if (*(argv+1))
-                setsparam(*(argv+1), metafy(value, len, META_DUP));
-            else while (p < &value[len]) {
+            if (*(argv+1)) {
+                if (strlen(value) + 1 == len)
+                    setsparam(*(argv+1), metafy(value, len-1, META_DUP));
+                else {
+                    int arrlen = 0;
+                    char **array = NULL, **arrptr = NULL;
+
+                    while (p < &value[len]) {
+                        arrlen++;
+                        p += strlen(p) + 1;
+                    }
+                    arrptr = array = (char **)zshcalloc((arrlen+1) * sizeof(char *));
+                    p = value;
+                    while (p < &value[len]) {
+                        *arrptr++ = metafy(p, -1, META_DUP);
+                        p += strlen(p) + 1;
+                    }
+                    setaparam(*(argv+1), array);
+                }
+            } else while (p < &value[len]) {
                 printf("%s\n", p);
                 p += strlen(p) + 1;
             }
@@ -183,7 +204,7 @@ bin_listattr(char *nam, char **argv, Options ops, UNUSED(int func))
 static struct builtin bintab[] = {
     BUILTIN("zgetattr", 0, bin_getattr, 2, 3, 0, "h", NULL),
     BUILTIN("zsetattr", 0, bin_setattr, 3, 3, 0, "h", NULL),
-    BUILTIN("zdelattr", 0, bin_delattr, 2, 2, 0, "h", NULL),
+    BUILTIN("zdelattr", 0, bin_delattr, 2, -1, 0, "h", NULL),
     BUILTIN("zlistattr", 0, bin_listattr, 1, 2, 0, "h", NULL),
 };

--
1.6.5



Messages sorted by: Reverse Date, Date, Thread, Author