+ int argc;
+ char **argv;
+{
+ extern char *optarg;
+ extern int optind;
+ register char *cp;
+ int ch;
+ char curpath[MAXPATHLEN], *reset, *index(), *rindex();
+
+ myname = (cp = rindex(*argv, '/')) ? cp + 1 : *argv;
+ ischown = myname[2] == 'o';
+
+ while ((ch = getopt(argc, argv, "Rf")) != EOF)
+ switch((char)ch) {
+ case 'R':
+ rflag++;
+ break;
+ case 'f':
+ fflag++;
+ break;
+ case '?':
+ default:
+ usage();
+ }
+ argv += optind;
+ argc -= optind;
+
+ if (argc < 2)
+ usage();
+
+ if (ischown) {
+ if (cp = index(*argv, '.')) {
+ *cp++ = '\0';
+ setgid(cp);
+ }
+ else
+ gid = -1;
+ setuid(*argv);
+ }
+ else {
+ uid = -1;
+ setgid(*argv);
+ }
+
+ while (*++argv) {
+ if (reset = index(*argv, '/'))
+ (void)getwd(curpath);
+ change(*argv);
+ if (reset && chdir(curpath)) {
+ if (fflag)
+ exit(0);
+ err(curpath);
+ exit(-1);
+ }
+ }
+ exit(retval);
+}
+
+static
+setgid(s)
+ register char *s;
+{
+ struct group *gr, *getgrnam();
+
+ if (!*s) {
+ gid = -1; /* argument was "uid." */
+ return;
+ }
+ for (gname = s; *s && isdigit(*s); ++s);
+ if (!*s)
+ gid = atoi(gname);
+ else {
+ if (!(gr = getgrnam(gname))) {
+ if (fflag)
+ exit(0);
+ fprintf(stderr, "%s: unknown group id: %s\n",
+ myname, gname);
+ exit(-1);
+ }
+ gid = gr->gr_gid;
+ }
+}
+
+static
+setuid(s)
+ register char *s;
+{
+ struct passwd *pwd, *getpwnam();
+ char *beg;
+
+ if (!*s) {
+ uid = -1; /* argument was ".gid" */
+ return;
+ }
+ for (beg = s; *s && isdigit(*s); ++s);
+ if (!*s)
+ uid = atoi(beg);
+ else {
+ if (!(pwd = getpwnam(beg))) {
+ if (fflag)
+ exit(0);
+ fprintf(stderr, "chown: unknown user id: %s\n", beg);
+ exit(-1);
+ }
+ uid = pwd->pw_uid;
+ }
+}
+
+static
+change(file)
+ char *file;