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

unix.superglobalmegacorp.com

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