diff options
author | Rob Landley <rob@landley.net> | 2012-06-24 18:35:49 -0500 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2012-06-24 18:35:49 -0500 |
commit | 78aaef2a7ac9e852258e385ff3923353d78b8781 (patch) | |
tree | 91dddd2a5442f47c4a2e5c6d5529987edf175fcd /toys/chown.c | |
parent | 728c94a0022d431f80a2333a143fc4dbf1056268 (diff) | |
download | toybox-78aaef2a7ac9e852258e385ff3923353d78b8781.tar.gz |
Unify chown and chgrp, add support for -hHLP flags.0.3.1
Diffstat (limited to 'toys/chown.c')
-rw-r--r-- | toys/chown.c | 137 |
1 files changed, 0 insertions, 137 deletions
diff --git a/toys/chown.c b/toys/chown.c deleted file mode 100644 index d3a4c112..00000000 --- a/toys/chown.c +++ /dev/null @@ -1,137 +0,0 @@ -/* vi: set sw=4 ts=4: - * - * chown.c - Change ownership - * - * Copyright 2012 Georgi Chorbadzhiyski <georgi@unixsol.org> - * - * See http://pubs.opengroup.org/onlinepubs/009695399/utilities/chown.html - * - * TODO: Add support for -h - * TODO: Add support for -H - * TODO: Add support for -L - * TODO: Add support for -P - -USE_CHOWN(NEWTOY(chown, "<2Rfv", TOYFLAG_BIN)) - -config CHOWN - bool "chown" - default n - help - usage: chown [-R] [-f] [-v] group file... - Change ownership of one or more files. - - -R recurse into subdirectories. - -f suppress most error messages. - -v verbose output. -*/ - -#include "toys.h" - -#define FLAG_R 4 -#define FLAG_f 2 -#define FLAG_v 1 - -DEFINE_GLOBALS( - uid_t owner; - gid_t group; - char *owner_name; - char *group_name; -) - -#define TT this.chown - -static int do_chown(const char *path) { - int ret = chown(path, TT.owner, TT.group); - if (toys.optflags & FLAG_v) - xprintf("chown(%s:%s, %s)\n", TT.owner_name, TT.group_name, path); - if (ret == -1 && !(toys.optflags & FLAG_f)) - perror_msg("changing owner of '%s' to '%s:%s'", path, - TT.owner_name, TT.group_name); - toys.exitval |= ret; - return ret; -} - -// Copied from toys/cp.c:cp_node() -int chown_node(char *path, struct dirtree *node) -{ - char *s = path + strlen(path); - struct dirtree *n = node; - - for ( ; ; n = n->parent) { - while (s!=path) { - if (*(--s) == '/') break; - } - if (!n) break; - } - if (s != path) s++; - - do_chown(s); - - return 0; -} - -void chown_main(void) -{ - char **s; - char *owner = NULL, *group; - char *param1 = *toys.optargs; - - TT.owner = -1; - TT.group = -1; - TT.owner_name = ""; - TT.group_name = ""; - - group = strchr(param1, ':'); - if (!group) - group = strchr(param1, '.'); - - if (group) { - group++; - struct group *g = getgrnam(group); - if (!g) { - error_msg("invalid group '%s'", group); - toys.exitval = 1; - return; - } - TT.group = g->gr_gid; - TT.group_name = group; - owner = param1; - owner[group - owner - 1] = '\0'; - } else { - owner = param1; - } - - if (owner && owner[0]) { - struct passwd *p = getpwnam(owner); - if (!p) { - error_msg("invalid owner '%s'", owner); - toys.exitval = 1; - return; - } - TT.owner = p->pw_uid; - TT.owner_name = owner; - } - - if (toys.optflags & FLAG_R) { - // Recurse into subdirectories - for (s=toys.optargs + 1; *s; s++) { - struct stat sb; - if (stat(*s, &sb) == -1) { - if (!(toys.optflags & FLAG_f)) - perror_msg("%s", *s); - continue; - } - do_chown(*s); - if (S_ISDIR(sb.st_mode)) { - strncpy(toybuf, *s, sizeof(toybuf) - 1); - toybuf[sizeof(toybuf) - 1] = 0; - dirtree_read(toybuf, NULL, chown_node); - } - } - } else { - // Do not recurse - for (s=toys.optargs + 1; *s; s++) { - do_chown(*s); - } - } -} |