diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | Completion/Zsh/Command/.distfiles | 1 | ||||
-rw-r--r-- | Completion/Zsh/Command/_zattr | 34 | ||||
-rw-r--r-- | Doc/Makefile.in | 2 | ||||
-rw-r--r-- | Doc/Zsh/.distfiles | 3 | ||||
-rw-r--r-- | Doc/Zsh/mod_attr.yo | 34 | ||||
-rw-r--r-- | Src/Modules/.distfiles | 2 | ||||
-rw-r--r-- | Src/Modules/attr.c | 174 | ||||
-rw-r--r-- | Src/Modules/attr.mdd | 12 | ||||
-rw-r--r-- | configure.ac | 4 |
10 files changed, 270 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog index 85e599b71..9560be129 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2009-03-03 Peter Stephenson <pws@csr.com> + * Mikael Magnusson: 26670: configure.ac, + Completion/Command/Zsh/.distfiles, Completion/Zsh/Command/_zattr, + Doc/Makefile.in, Doc/Zsh/.distfiles, Doc/Zsh/mod_attr.yo, + Src/Modules/.distfiles, Src/Modules/attr.c, Src/Modules/attr.mdd: + add module to handle Linux extended file attributes. + * Jun T.: 26667: Doc/Zsh/prompt.yo: separate out parentheses. 2009-03-02 Barton E. Schaefer <schaefer@zsh.org> @@ -11298,5 +11304,5 @@ ***************************************************** * This is used by the shell to define $ZSH_PATCHLEVEL -* $Revision: 1.4591 $ +* $Revision: 1.4592 $ ***************************************************** diff --git a/Completion/Zsh/Command/.distfiles b/Completion/Zsh/Command/.distfiles index 54e1f75e9..9e8e6adc4 100644 --- a/Completion/Zsh/Command/.distfiles +++ b/Completion/Zsh/Command/.distfiles @@ -37,6 +37,7 @@ _unsetopt _vared _wait _which +_zattr _zcompile _zed _zftp diff --git a/Completion/Zsh/Command/_zattr b/Completion/Zsh/Command/_zattr new file mode 100644 index 000000000..e3836f247 --- /dev/null +++ b/Completion/Zsh/Command/_zattr @@ -0,0 +1,34 @@ +#compdef zgetattr zsetattr zdelattr zlistattr + +local state line expl ret=1 REPLY +local -a args privs + +case $service in +zgetattr) +_arguments \ + '1:file:_files' \ + '2:attribute:->attrs' \ + '3:parameter' +;; +zsetattr) +_arguments \ + '1:file:_files' \ + '2:attribute:->attrs' \ + '3:value' +;; +zdelattr) +_arguments \ + '1:file:_files' \ + '2:attribute:->attrs' +;; +zlistattr) +_arguments \ + '1:file:_files' \ + '2:parameter' +;; +esac + +if [[ $state = attrs ]]; then + zlistattr $line[1] REPLY + _wanted attrs expl 'attribute' compadd ${(0)REPLY} +fi diff --git a/Doc/Makefile.in b/Doc/Makefile.in index 7ca9dd25c..2c07dc101 100644 --- a/Doc/Makefile.in +++ b/Doc/Makefile.in @@ -55,7 +55,7 @@ zshall.1 YODLDOC = $(MAN) texi MODDOCSRC = \ -Zsh/mod_cap.yo Zsh/mod_clone.yo \ +Zsh/mod_attr.yo Zsh/mod_cap.yo Zsh/mod_clone.yo \ Zsh/mod_compctl.yo Zsh/mod_complete.yo Zsh/mod_complist.yo \ Zsh/mod_computil.yo Zsh/mod_curses.yo \ Zsh/mod_datetime.yo Zsh/mod_deltochar.yo \ diff --git a/Doc/Zsh/.distfiles b/Doc/Zsh/.distfiles index 4a2ea4fd0..95764875b 100644 --- a/Doc/Zsh/.distfiles +++ b/Doc/Zsh/.distfiles @@ -5,7 +5,8 @@ DISTFILES_SRC=' contrib.yo exec.yo expn.yo filelist.yo files.yo func.yo grammar.yo index.yo intro.yo invoke.yo jobs.yo manmodmenu.yo - manual.yo metafaq.yo mod_cap.yo mod_clone.yo + manual.yo metafaq.yo mod_attr.yo mod_cap.yo + mod_clone.yo mod_compctl.yo mod_complete.yo mod_complist.yo mod_computil.yo mod_curses.yo mod_datetime.yo mod_deltochar.yo mod_example.yo mod_files.yo mod_langinfo.yo modlist.yo mod_mapfile.yo diff --git a/Doc/Zsh/mod_attr.yo b/Doc/Zsh/mod_attr.yo new file mode 100644 index 000000000..ed444d0d7 --- /dev/null +++ b/Doc/Zsh/mod_attr.yo @@ -0,0 +1,34 @@ +COMMENT(!MOD!zsh/attr +Builtins for manipulating extended attributes (xattr). +!MOD!) +The tt(zsh/attr) module is used for manipulating extended attributes. +The builtins in this module are: + +startitem() +findex(zgetattr) +cindex(extended attributes, xattr, getting from files) +item(tt(zgetattr) var(filename) var(attribute) [ var(parameter) ])( +Get the extended attribute var(attribute) from the specified +var(filename). If the optional argument var(parameter) is given, the +attribute is set on that parameter instead of being printed to stdout. +) +findex(zsetattr) +cindex(extended attributes, xattr, setting on files) +item(tt(zsetattr) var(filename) var(attribute) var(value))( +Set the extended attribute var(attribute) on the specified +var(filename) to var(value). +) +findex(zdelattr) +cindex(extended attributes, xattr, removing, deleting) +item(tt(zdelattr) var(filename) var(attribute))( +Remove the extended attribute var(attribute) from the specified +var(filename). +) +findex(zlistattr) +cindex(extended attributes, xattr, listing) +item(tt(zlistattr) var(filename) [ var(parameter) ])( +List the extended attributes currently set on the specified +var(filename). If the optional argument var(parameter) is given, the +list of attributes is set on that parameter instead of being printed to stdout. +) +enditem() diff --git a/Src/Modules/.distfiles b/Src/Modules/.distfiles index 40d3114ca..9231cecb3 100644 --- a/Src/Modules/.distfiles +++ b/Src/Modules/.distfiles @@ -2,6 +2,8 @@ DISTFILES_SRC=' .cvsignore .distfiles .exrc +attr.mdd +attr.c cap.mdd cap.c clone.mdd diff --git a/Src/Modules/attr.c b/Src/Modules/attr.c new file mode 100644 index 000000000..3355d5c6b --- /dev/null +++ b/Src/Modules/attr.c @@ -0,0 +1,174 @@ +/* + * attr.c - extended attributes (xattr) manipulation + * + * This file is part of zsh, the Z shell. + * + * Copyright (c) 2009 Mikael Magnusson + * All rights reserved. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and to distribute modified versions of this software for any + * purpose, provided that the above copyright notice and the following + * two paragraphs appear in all copies of this software. + * + * In no event shall Mikael Magnusson or the Zsh Development Group be liable + * to any party for direct, indirect, special, incidental, or consequential + * damages arising out of the use of this software and its documentation, + * even if Andrew Main and the Zsh Development Group have been advised of + * the possibility of such damage. + * + * Mikael Magnusson and the Zsh Development Group specifically disclaim any + * warranties, including, but not limited to, the implied warranties of + * merchantability and fitness for a particular purpose. The software + * provided hereunder is on an "as is" basis, and Mikael Magnusson and the + * Zsh Development Group have no obligation to provide maintenance, + * support, updates, enhancements, or modifications. + * + */ + +#include "attr.mdh" +#include "attr.pro" + +#include <sys/types.h> +#include <sys/xattr.h> + +static int +bin_getattr(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func)) +{ + int ret = 0; + int len; + char value[256]; + + unmetafy(*argv, NULL); + unmetafy(*(argv+1), NULL); + if (listxattr(*argv, NULL, 0) > 0) { + if (0 < (len = getxattr(*argv, *(argv+1), value, 255))) { + if (len < 256) { + value[len] = '\0'; + if (*(argv+2)) + setsparam(*(argv+2), metafy(value, len, META_DUP)); + else + printf("%s\n", value); + } + } else { + zwarnnam(nam, "%s: %e", metafy(*argv, -1, META_NOALLOC), errno); + ret = 1; + } + } + return ret; +} + +static int +bin_setattr(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func)) +{ + int ret = 0; + + unmetafy(*argv, NULL); + unmetafy(*(argv+1), NULL); + unmetafy(*(argv+2), NULL); + if (setxattr(*argv, *(argv+1), *(argv+2), strlen(*(argv+2)), 0)) { + zwarnnam(nam, "%s: %e", metafy(*argv, -1, META_NOALLOC), errno); + ret = 1; + } + return ret; +} + +static int +bin_delattr(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func)) +{ + int ret = 0; + + unmetafy(*argv, NULL); + unmetafy(*(argv+1), NULL); + if (removexattr(*argv, *(argv+1))) { + zwarnnam(nam, "%s: %e", metafy(*argv, -1, META_NOALLOC), errno); + ret = 1; + } + return ret; +} + +static int +bin_listattr(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func)) +{ + int ret = 0; + int len, i = 1; + char value[256]; + + unmetafy(*argv, NULL); + if (0 < (len = listxattr(*argv, value, 256))) { + if (len < 256) { + char *p = value; + if (*(argv+1)) + setsparam(*(argv+1), metafy(value, len, META_DUP)); + else while (p < &value[len]) { + printf("%s\n", p); + p += strlen(p) + 1; + } + } + } else { + zwarnnam(nam, "%s: %e", metafy(*argv, -1, META_NOALLOC), errno); + ret = 1; + } + return ret; +} + +/* module paraphernalia */ + +static struct builtin bintab[] = { + BUILTIN("zgetattr", 0, bin_getattr, 2, 3, 0, NULL, NULL), + BUILTIN("zsetattr", 0, bin_setattr, 3, 3, 0, NULL, NULL), + BUILTIN("zdelattr", 0, bin_delattr, 2, 2, 0, NULL, NULL), + BUILTIN("zlistattr", 0, bin_listattr, 1, 2, 0, NULL, NULL), +}; + +static struct features module_features = { + bintab, sizeof(bintab)/sizeof(*bintab), + NULL, 0, + NULL, 0, + NULL, 0, + 0 +}; + +/**/ +int +setup_(UNUSED(Module m)) +{ + return 0; +} + +/**/ +int +features_(Module m, char ***features) +{ + *features = featuresarray(m, &module_features); + return 0; +} + +/**/ +int +enables_(Module m, int **enables) +{ + return handlefeatures(m, &module_features, enables); +} + +/**/ +int +boot_(UNUSED(Module m)) +{ + return 0; +} + +/**/ +int +cleanup_(Module m) +{ + return setfeatureenables(m, &module_features, NULL); +} + +/**/ +int +finish_(UNUSED(Module m)) +{ + return 0; +} diff --git a/Src/Modules/attr.mdd b/Src/Modules/attr.mdd new file mode 100644 index 000000000..52f3e2420 --- /dev/null +++ b/Src/Modules/attr.mdd @@ -0,0 +1,12 @@ +name=zsh/attr +link='if test "x$ac_cv_func_getxattr" = xyes && test "x$ac_cv_header_sys_xattr_h" = xyes; then + echo dynamic +else + echo no +fi +' +load=no + +autofeatures="b:zgetattr b:zsetattr b:zdelattr" + +objects="attr.o" diff --git a/configure.ac b/configure.ac index d67f2034c..136086545 100644 --- a/configure.ac +++ b/configure.ac @@ -858,6 +858,8 @@ if test x$gdbm != xno; then AC_CHECK_LIB(gdbm, gdbm_open) fi +AC_CHECK_HEADERS(sys/xattr.h) + dnl -------------- dnl CHECK TYPEDEFS dnl -------------- @@ -1155,7 +1157,7 @@ AC_CHECK_FUNCS(strftime strptime mktime timelocal \ grantpt unlockpt ptsname \ htons ntohs \ regcomp regexec regerror regfree \ - gdbm_open) + gdbm_open getxattr) AC_FUNC_STRCOLL if test x$enable_cap = xyes; then |