/* See LICENSE file for copyright and license details. */ #include #include #include #include #include #include #include #include "util.h" static int hflag = 0; static int Rflag = 0; static uid_t uid = -1; static gid_t gid = -1; static int ret = 0; static void chownpwgr(const char *path, int depth, void *data) { char *chownf_name; int (*chownf)(const char *, uid_t, gid_t); if (recurse_follow == 'P' || (recurse_follow == 'H' && depth) || (hflag && !depth)) { chownf_name = "lchown"; chownf = lchown; } else { chownf_name = "chown"; chownf = chown; } if (chownf(path, uid, gid) < 0) { weprintf("%s %s:", chownf_name, path); ret = 1; } else if (Rflag) { recurse(path, chownpwgr, depth, NULL); } } static void usage(void) { eprintf("usage: %s [-h] [-R [-H | -L | -P]] [owner][:[group]] file ...\n", argv0); } int main(int argc, char *argv[]) { struct passwd *pw; struct group *gr; char *owner, *group; ARGBEGIN { case 'h': hflag = 1; break; case 'r': case 'R': Rflag = 1; break; case 'H': case 'L': case 'P': recurse_follow = ARGC(); break; default: usage(); } ARGEND; if (argc < 2) usage(); owner = argv[0]; if ((group = strchr(owner, ':'))) *group++ = '\0'; if (owner && *owner) { errno = 0; pw = getpwnam(owner); if (pw) { uid = pw->pw_uid; } else { if (errno) eprintf("getpwnam %s:", owner); uid = estrtonum(owner, 0, UINT_MAX); } } if (group && *group) { errno = 0; gr = getgrnam(group); if (gr) { gid = gr->gr_gid; } else { if (errno) eprintf("getgrnam %s:", group); gid = estrtonum(group, 0, UINT_MAX); } } for (argc--, argv++; *argv; argc--, argv++) chownpwgr(*argv, 0, NULL); return ret; }