Annotation of 43BSD/bin/chgrp.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1980 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: #ifndef lint
        !             8: static char sccsid[] = "@(#)chgrp.c    5.7 (Berkeley) 6/4/86";
        !             9: #endif not lint
        !            10: 
        !            11: /*
        !            12:  * chgrp -fR gid file ...
        !            13:  */
        !            14: 
        !            15: #include <stdio.h>
        !            16: #include <ctype.h>
        !            17: #include <sys/types.h>
        !            18: #include <sys/stat.h>
        !            19: #include <grp.h>
        !            20: #include <pwd.h>
        !            21: #include <sys/dir.h>
        !            22: 
        !            23: struct group *gr, *getgrnam(), *getgrgid();
        !            24: struct passwd *getpwuid(), *pwd;
        !            25: struct stat stbuf;
        !            26: int    gid, uid;
        !            27: int    status;
        !            28: int    fflag, rflag;
        !            29: /* VARARGS */
        !            30: int    fprintf();
        !            31: 
        !            32: main(argc, argv)
        !            33:        int argc;
        !            34:        char *argv[];
        !            35: {
        !            36:        register c, i;
        !            37:        register char *cp;
        !            38: 
        !            39:        argc--, argv++;
        !            40:        while (argc > 0 && argv[0][0] == '-') {
        !            41:                for (cp = &argv[0][1]; *cp; cp++) switch (*cp) {
        !            42: 
        !            43:                case 'f':
        !            44:                        fflag++;
        !            45:                        break;
        !            46: 
        !            47:                case 'R':
        !            48:                        rflag++;
        !            49:                        break;
        !            50: 
        !            51:                default:
        !            52:                        fatal(255, "unknown option: %c", *cp);
        !            53:                        /*NOTREACHED*/
        !            54:                }
        !            55:                argv++, argc--;
        !            56:        }
        !            57:        if (argc < 2) {
        !            58:                fprintf(stderr, "usage: chgrp [-fR] gid file ...\n");
        !            59:                exit(255);
        !            60:        }
        !            61:        uid = getuid();
        !            62:        if (isnumber(argv[0])) {
        !            63:                gid = atoi(argv[0]);
        !            64:                gr = getgrgid(gid);
        !            65:                if (uid && gr == NULL)
        !            66:                        fatal(255, "%s: unknown group", argv[0]);
        !            67:        } else {
        !            68:                gr = getgrnam(argv[0]);
        !            69:                if (gr == NULL)
        !            70:                        fatal(255, "%s: unknown group", argv[0]);
        !            71:                gid = gr->gr_gid;
        !            72:        }
        !            73:        pwd = getpwuid(uid);
        !            74:        if (pwd == NULL)
        !            75:                fatal(255, "Who are you?");
        !            76:        if (uid && pwd->pw_gid != gid) {
        !            77:                for (i=0; gr->gr_mem[i]; i++)
        !            78:                        if (!(strcmp(pwd->pw_name, gr->gr_mem[i])))
        !            79:                                goto ok;
        !            80:                if (fflag)
        !            81:                        exit(0);
        !            82:                fatal(255, "You are not a member of the %s group", argv[0]);
        !            83:        }
        !            84: ok:
        !            85:        for (c = 1; c < argc; c++) {
        !            86:                /* do stat for directory arguments */
        !            87:                if (lstat(argv[c], &stbuf)) {
        !            88:                        status += Perror(argv[c]);
        !            89:                        continue;
        !            90:                }
        !            91:                if (uid && uid != stbuf.st_uid) {
        !            92:                        status += error("You are not the owner of %s", argv[c]);
        !            93:                        continue;
        !            94:                }
        !            95:                if (rflag && ((stbuf.st_mode & S_IFMT) == S_IFDIR)) {
        !            96:                        status += chownr(argv[c], stbuf.st_uid, gid);
        !            97:                        continue;
        !            98:                }
        !            99:                if (chown(argv[c], -1, gid)) {
        !           100:                        status += Perror(argv[c]);
        !           101:                        continue;
        !           102:                }
        !           103:        }
        !           104:        exit(status);
        !           105: }
        !           106: 
        !           107: isnumber(s)
        !           108:        char *s;
        !           109: {
        !           110:        register int c;
        !           111: 
        !           112:        while (c = *s++)
        !           113:                if (!isdigit(c))
        !           114:                        return (0);
        !           115:        return (1);
        !           116: }
        !           117: 
        !           118: chownr(dir, uid, gid)
        !           119:        char *dir;
        !           120: {
        !           121:        register DIR *dirp;
        !           122:        register struct direct *dp;
        !           123:        register struct stat st;
        !           124:        char savedir[1024];
        !           125:        int ecode;
        !           126: 
        !           127:        if (getwd(savedir) == 0)
        !           128:                fatal(255, "%s", savedir);
        !           129:        /*
        !           130:         * Change what we are given before doing its contents.
        !           131:         */
        !           132:        if (chown(dir, -1, gid) < 0 && Perror(dir))
        !           133:                return (1);
        !           134:        if (chdir(dir) < 0) {
        !           135:                Perror(dir);
        !           136:                return (1);
        !           137:        }
        !           138:        if ((dirp = opendir(".")) == NULL) {
        !           139:                Perror(dir);
        !           140:                return (1);
        !           141:        }
        !           142:        dp = readdir(dirp);
        !           143:        dp = readdir(dirp); /* read "." and ".." */
        !           144:        ecode = 0;
        !           145:        for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
        !           146:                if (lstat(dp->d_name, &st) < 0) {
        !           147:                        ecode = Perror(dp->d_name);
        !           148:                        if (ecode)
        !           149:                                break;
        !           150:                        continue;
        !           151:                }
        !           152:                if (uid && uid != st.st_uid) {
        !           153:                        ecode = error("You are not the owner of %s",
        !           154:                                dp->d_name);
        !           155:                        continue;
        !           156:                }
        !           157:                if ((st.st_mode & S_IFMT) == S_IFDIR) {
        !           158:                        ecode = chownr(dp->d_name, st.st_uid, gid);
        !           159:                        if (ecode)
        !           160:                                break;
        !           161:                        continue;
        !           162:                }
        !           163:                if (chown(dp->d_name, -1, gid) < 0 &&
        !           164:                    (ecode = Perror(dp->d_name)))
        !           165:                        break;
        !           166:        }
        !           167:        closedir(dirp);
        !           168:        if (chdir(savedir) < 0)
        !           169:                fatal(255, "can't change back to %s", savedir);
        !           170:        return (ecode);
        !           171: }
        !           172: 
        !           173: error(fmt, a)
        !           174:        char *fmt, *a;
        !           175: {
        !           176: 
        !           177:        if (!fflag) {
        !           178:                fprintf(stderr, "chgrp: ");
        !           179:                fprintf(stderr, fmt, a);
        !           180:                putc('\n', stderr);
        !           181:        }
        !           182:        return (!fflag);
        !           183: }
        !           184: 
        !           185: fatal(status, fmt, a)
        !           186:        int status;
        !           187:        char *fmt, *a;
        !           188: {
        !           189: 
        !           190:        fflag = 0;
        !           191:        (void) error(fmt, a);
        !           192:        exit(status);
        !           193: }
        !           194: 
        !           195: Perror(s)
        !           196:        char *s;
        !           197: {
        !           198: 
        !           199:        if (!fflag) {
        !           200:                fprintf(stderr, "chgrp: ");
        !           201:                perror(s);
        !           202:        }
        !           203:        return (!fflag);
        !           204: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.