diff options
Diffstat (limited to 'coreutils/chown.c')
-rw-r--r-- | coreutils/chown.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/coreutils/chown.c b/coreutils/chown.c index fddce7cf1..a45348a24 100644 --- a/coreutils/chown.c +++ b/coreutils/chown.c | |||
@@ -54,32 +54,38 @@ static int fileAction(const char *fileName, struct stat *statbuf, | |||
54 | 54 | ||
55 | int chown_main(int argc, char **argv) | 55 | int chown_main(int argc, char **argv) |
56 | { | 56 | { |
57 | int retval = EXIT_SUCCESS; | ||
58 | char *groupName; | 57 | char *groupName; |
58 | int retval = EXIT_SUCCESS; | ||
59 | 59 | ||
60 | opt_complementary = "-2"; | 60 | opt_complementary = "-2"; |
61 | getopt32(argc, argv, OPT_STR); | 61 | getopt32(argc, argv, OPT_STR); |
62 | argv += optind; | ||
62 | 63 | ||
63 | if (OPT_NODEREF) chown_func = lchown; | 64 | if (OPT_NODEREF) chown_func = lchown; |
64 | 65 | ||
65 | argv += optind; | ||
66 | |||
67 | /* First, check if there is a group name here */ | 66 | /* First, check if there is a group name here */ |
68 | groupName = strchr(*argv, '.'); | 67 | groupName = strchr(*argv, '.'); /* deprecated? */ |
69 | if (!groupName) { | 68 | if (!groupName) { |
70 | groupName = strchr(*argv, ':'); | 69 | groupName = strchr(*argv, ':'); |
71 | } | 70 | } |
72 | 71 | ||
73 | /* Check for the username and groupname */ | 72 | /* First, try parsing "user[:[group]]" */ |
74 | if (groupName) { | 73 | if (!groupName) { /* "user" */ |
75 | *groupName++ = '\0'; | 74 | uid = get_ug_id(*argv, xuname2uid); |
76 | gid = get_ug_id(groupName, bb_xgetgrnam); | 75 | } else if (groupName == *argv) { /* ":group" */ |
76 | gid = get_ug_id(groupName + 1, xgroup2gid); | ||
77 | } else { | ||
78 | struct bb_uidgid_t ugid; | ||
79 | if (!groupName[1]) /* "user:" */ | ||
80 | *groupName = '\0'; | ||
81 | if (!get_uidgid(&ugid, *argv, 1)) | ||
82 | bb_error_msg_and_die("unknown user/group %s", *argv); | ||
83 | uid = ugid.uid; | ||
84 | gid = ugid.gid; | ||
77 | } | 85 | } |
78 | if (--groupName != *argv) | ||
79 | uid = get_ug_id(*argv, bb_xgetpwnam); | ||
80 | ++argv; | ||
81 | 86 | ||
82 | /* Ok, ready to do the deed now */ | 87 | /* Ok, ready to do the deed now */ |
88 | argv++; | ||
83 | do { | 89 | do { |
84 | if (!recursive_action(*argv, | 90 | if (!recursive_action(*argv, |
85 | OPT_RECURSE, // recurse | 91 | OPT_RECURSE, // recurse |