/* See LICENSE file for copyright and license details. */ #include #include #include #include #include #include #include #include "util.h" static void chownpwgr(const char *); static bool rflag = false; static struct passwd *pw = NULL; static struct group *gr = NULL; static int ret = 0; static void usage(void) { eprintf("usage: %s [-Rr] [owner][:[group]] file...\n", argv0); } int main(int argc, char *argv[]) { char *owner, *group; ARGBEGIN { case 'R': case 'r': rflag = true; break; default: usage(); } ARGEND; if(argc == 0) usage(); owner = argv[0]; argv++; argc--; if((group = strchr(owner, ':'))) *group++ = '\0'; if(owner && *owner) { errno = 0; pw = getpwnam(owner); if (!pw) { if(errno != 0) eprintf("getpwnam %s:", owner); else eprintf("getpwnam %s: no such user\n", owner); } } if(group && *group) { errno = 0; gr = getgrnam(group); if (!gr) { if(errno != 0) eprintf("getgrnam %s:", group); else eprintf("getgrnam %s: no such group\n", group); } } for(; argc > 0; argc--, argv++) chownpwgr(argv[0]); return ret; } void chownpwgr(const char *path) { if(chown(path, pw ? pw->pw_uid : (uid_t)-1, gr ? gr->gr_gid : (gid_t)-1) == -1) { weprintf("chown %s:", path); ret = 1; } if(rflag) recurse(path, chownpwgr); }