annotate toys/posix/chgrp.c @ 656:6df4ccc0acbe

Regularize command headers, update links to standards documents.
author Rob Landley <rob@landley.net>
date Sat, 25 Aug 2012 18:08:51 -0500
parents 2986aa63a021
children 7e846e281e38
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
1 /* vi: set sw=4 ts=4:
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
2 *
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
3 * chown.c - Change ownership
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
4 *
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
5 * Copyright 2012 Georgi Chorbadzhiyski <georgi@unixsol.org>
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
6 *
656
6df4ccc0acbe Regularize command headers, update links to standards documents.
Rob Landley <rob@landley.net>
parents: 653
diff changeset
7 * See http://opengroup.org/onlinepubs/9699919799/utilities/chown.html
6df4ccc0acbe Regularize command headers, update links to standards documents.
Rob Landley <rob@landley.net>
parents: 653
diff changeset
8 * See http://opengroup.org/onlinepubs/9699919799/utilities/chgrp.html
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
9 *
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
10 * TODO: group only one of [HLP]
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
11
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
12 USE_CHGRP(NEWTOY(chgrp, "<2hPLHRfv", TOYFLAG_BIN))
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
13 USE_CHGRP(OLDTOY(chown, chgrp, "<2hPLHRfv", TOYFLAG_BIN))
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
14
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
15 config CHGRP
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
16 bool "chgrp/chown"
582
b88bc7dcdb48 Update chgrp so -R works, tweaking DIRTREE_COMEAGAIN design along the way.
Rob Landley <rob@landley.net>
parents: 545
diff changeset
17 default y
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
18 help
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
19 usage: chown [-RHLP] [-fvh] [owner][:group] file...
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
20 usage: chgrp [-RHLP] [-fvh] group file...
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
21
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
22 Change ownership of one or more files.
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
23
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
24 -f suppress most error messages.
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
25 -h change symlinks instead of what they point to
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
26 -R recurse into subdirectories (implies -h).
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
27 -H with -R change target of symlink, follow command line symlinks
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
28 -L with -R change target of symlink, follow all symlinks
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
29 -P with -R change symlink, do not follow symlinks (default)
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
30 -v verbose output.
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
31 */
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
32
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
33 #include "toys.h"
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
34
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
35 #define FLAG_v 1
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
36 #define FLAG_f 2
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
37 #define FLAG_R 4
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
38 #define FLAG_H 8
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
39 #define FLAG_L 16
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
40 #define FLAG_P 32
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
41 #define FLAG_h 64
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
42
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
43 DEFINE_GLOBALS(
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
44 uid_t owner;
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
45 gid_t group;
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
46 char *owner_name, *group_name;
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
47 int symfollow;
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
48 )
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
49
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
50 #define TT this.chgrp
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
51
582
b88bc7dcdb48 Update chgrp so -R works, tweaking DIRTREE_COMEAGAIN design along the way.
Rob Landley <rob@landley.net>
parents: 545
diff changeset
52 static int do_chgrp(struct dirtree *node)
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
53 {
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
54 int fd, ret, flags = toys.optflags;
582
b88bc7dcdb48 Update chgrp so -R works, tweaking DIRTREE_COMEAGAIN design along the way.
Rob Landley <rob@landley.net>
parents: 545
diff changeset
55
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
56 // Depth first search
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
57 if (!dirtree_notdotdot(node)) return 0;
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
58 if ((flags & FLAG_R) && node->data != -1 && S_ISDIR(node->st.st_mode))
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
59 return DIRTREE_COMEAGAIN|((flags&FLAG_L) ? DIRTREE_SYMFOLLOW : 0);
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
60
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
61 fd = dirtree_parentfd(node);
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
62 ret = fchownat(fd, node->name, TT.owner, TT.group,
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
63 (flags&(FLAG_L|FLAG_H)) || !(flags&(FLAG_h|FLAG_R))
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
64 ? 0 : AT_SYMLINK_NOFOLLOW);
582
b88bc7dcdb48 Update chgrp so -R works, tweaking DIRTREE_COMEAGAIN design along the way.
Rob Landley <rob@landley.net>
parents: 545
diff changeset
65
b88bc7dcdb48 Update chgrp so -R works, tweaking DIRTREE_COMEAGAIN design along the way.
Rob Landley <rob@landley.net>
parents: 545
diff changeset
66 if (ret || (flags & FLAG_v)) {
b88bc7dcdb48 Update chgrp so -R works, tweaking DIRTREE_COMEAGAIN design along the way.
Rob Landley <rob@landley.net>
parents: 545
diff changeset
67 char *path = dirtree_path(node, 0);
b88bc7dcdb48 Update chgrp so -R works, tweaking DIRTREE_COMEAGAIN design along the way.
Rob Landley <rob@landley.net>
parents: 545
diff changeset
68 if (flags & FLAG_v)
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
69 xprintf("%s %s%s%s %s\n", toys.which->name,
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
70 TT.owner_name ? TT.owner_name : "",
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
71 toys.which->name[2]=='o' && TT.group_name ? ":" : "",
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
72 TT.group_name ? TT.group_name : "", path);
582
b88bc7dcdb48 Update chgrp so -R works, tweaking DIRTREE_COMEAGAIN design along the way.
Rob Landley <rob@landley.net>
parents: 545
diff changeset
73 if (ret == -1 && !(toys.optflags & FLAG_f))
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
74 perror_msg("changing owner:group of '%s' to '%s:%s'", path,
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
75 TT.owner_name, TT.group_name);
582
b88bc7dcdb48 Update chgrp so -R works, tweaking DIRTREE_COMEAGAIN design along the way.
Rob Landley <rob@landley.net>
parents: 545
diff changeset
76 free(path);
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
77 }
582
b88bc7dcdb48 Update chgrp so -R works, tweaking DIRTREE_COMEAGAIN design along the way.
Rob Landley <rob@landley.net>
parents: 545
diff changeset
78 toys.exitval |= ret;
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
79
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
80 return 0;
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
81 }
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
82
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
83 void chgrp_main(void)
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
84 {
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
85 int ischown = toys.which->name[2] == 'o';
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
86 char **s, *own;
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
87
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
88 // Distinguish chown from chgrp
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
89 if (ischown) {
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
90 char *grp;
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
91 struct passwd *p;
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
92
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
93 own = xstrdup(*toys.optargs);
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
94 if ((grp = strchr(own, ':')) || (grp = strchr(own, '.'))) {
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
95 *(grp++) = 0;
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
96 TT.group_name = grp;
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
97 }
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
98 if (*own) {
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
99 TT.owner_name = own;
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
100 p = getpwnam(own);
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
101 // TODO: trailing garbage?
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
102 if (!p && isdigit(*own)) p=getpwuid(atoi(own));
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
103 if (!p) error_exit("no user '%s'", own);
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
104 TT.owner = p->pw_uid;
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
105 }
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
106 } else TT.group_name = *toys.optargs;
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
107
607
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
108 if (TT.group_name) {
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
109 struct group *g;
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
110 g = getgrnam(TT.group_name);
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
111 if (!g) g=getgrgid(atoi(TT.group_name));
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
112 if (!g) error_exit("no group '%s'", TT.group_name);
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
113 TT.group = g->gr_gid;
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
114 }
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
115
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
116 for (s=toys.optargs+1; *s; s++) {
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
117 struct dirtree *new = dirtree_add_node(AT_FDCWD, *s,
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
118 toys.optflags&(FLAG_H|FLAG_L));
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
119 if (new) handle_callback(new, do_chgrp);
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
120 else toys.exitval = 1;
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
121 }
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
122
8bee9c27c219 Unify chown and chgrp, add support for -hHLP flags.
Rob Landley <rob@landley.net>
parents: 589
diff changeset
123 if (CFG_TOYBOX_FREE) free(own);
544
f11693d78764 New toys - chmod, chown, and chgrp.
Georgi Chorbadzhiyski <gf@unixsol.org>
parents:
diff changeset
124 }