summaryrefslogtreecommitdiff
path: root/Src/Modules/attr.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2009-03-03 15:04:15 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2009-03-03 15:04:15 +0000
commitd58e5061ad49a3778dd1295e28810ad1f6e44cf6 (patch)
treed05af96bd224cdc79dc5beda68faeeb8a1844b35 /Src/Modules/attr.c
parent29233548ae94e0925b03d224e782075f2ae0d7ea (diff)
downloadzsh-d58e5061ad49a3778dd1295e28810ad1f6e44cf6.tar.gz
zsh-d58e5061ad49a3778dd1295e28810ad1f6e44cf6.zip
Mikael Magnusson: 26670: add zsh/attr module
Diffstat (limited to 'Src/Modules/attr.c')
-rw-r--r--Src/Modules/attr.c174
1 files changed, 174 insertions, 0 deletions
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;
+}