aboutsummaryrefslogtreecommitdiff
path: root/toys/posix/chmod.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2012-08-25 14:25:22 -0500
committerRob Landley <rob@landley.net>2012-08-25 14:25:22 -0500
commit3a9241add947cb6d24b5de7a8927517426a78795 (patch)
treed122ab6570439cd6b17c7d73ed8d4e085e0b8a95 /toys/posix/chmod.c
parent689f095bc976417bf50810fe59a3b3ac32b21105 (diff)
downloadtoybox-3a9241add947cb6d24b5de7a8927517426a78795.tar.gz
Move commands into "posix", "lsb", and "other" menus/directories.
Diffstat (limited to 'toys/posix/chmod.c')
-rw-r--r--toys/posix/chmod.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/toys/posix/chmod.c b/toys/posix/chmod.c
new file mode 100644
index 00000000..e41598c1
--- /dev/null
+++ b/toys/posix/chmod.c
@@ -0,0 +1,72 @@
+/* vi: set sw=4 ts=4:
+ *
+ * chmod.c - Change file mode bits
+ *
+ * Copyright 2012 Rob Landley <rob@landley.net>
+ *
+ * See http://pubs.opengroup.org/onlinepubs/009695399/utilities/chmod.html
+ *
+
+USE_CHMOD(NEWTOY(chmod, "<2?vR", TOYFLAG_BIN))
+
+config CHMOD
+ bool "chmod"
+ default y
+ help
+ usage: chmod [-R] MODE FILE...
+
+ Change mode of listed file[s] (recursively with -R).
+
+ MODE can be (comma-separated) stanzas: [ugoa][+-=][rwxstXugo]
+
+ Stanzas are applied in order: For each category (u = user,
+ g = group, o = other, a = all three, if none specified default is a),
+ set (+), clear (-), or copy (=), r = read, w = write, x = execute.
+ s = u+s = suid, g+s = sgid, o+s = sticky. (+t is an alias for o+s).
+ suid/sgid: execute as the user/group who owns the file.
+ sticky: can't delete files you don't own out of this directory
+ X = x for directories or if any category already has x set.
+
+ Or MODE can be an octal value up to 7777 ug uuugggooo top +
+ bit 1 = o+x, bit 1<<8 = u+w, 1<<11 = g+1 sstrwxrwxrwx bottom
+
+ Examples:
+ chmod u+w file - allow owner of "file" to write to it.
+ chmod 744 file - user can read/write/execute, everyone else read only
+*/
+
+#include "toys.h"
+
+DEFINE_GLOBALS(
+ char *mode;
+)
+
+#define TT this.chmod
+
+#define FLAG_R 1
+#define FLAG_v 2
+
+int do_chmod(struct dirtree *try)
+{
+ mode_t mode;
+
+ if (!dirtree_notdotdot(try)) return 0;
+
+ mode = string_to_mode(TT.mode, try->st.st_mode);
+ if (toys.optflags & FLAG_v) {
+ char *s = dirtree_path(try, 0);
+ printf("chmod '%s' to %04o\n", s, mode);
+ free(s);
+ }
+ wfchmodat(dirtree_parentfd(try), try->name, mode);
+
+ return (toys.optflags & FLAG_R) ? DIRTREE_RECURSE : 0;
+}
+
+void chmod_main(void)
+{
+ TT.mode = *toys.optargs;
+ char **file;
+
+ for (file = toys.optargs+1; *file; file++) dirtree_read(*file, do_chmod);
+}