Annotation of 43BSD/etc/quotaon.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 not lint
                     12: 
                     13: #ifndef lint
                     14: static char sccsid[] = "@(#)quotaon.c  5.2 (Berkeley) 8/8/85";
                     15: #endif not lint
                     16: 
                     17: /*
                     18:  * Turn quota on/off for a filesystem.
                     19:  */
                     20: #include <sys/param.h>
                     21: #include <sys/file.h>
                     22: #include <stdio.h>
                     23: #include <fstab.h>
                     24: #include <mtab.h>
                     25: 
                     26: struct mtab mtab[NMOUNT];
                     27: 
                     28: int    vflag;          /* verbose */
                     29: int    aflag;          /* all file systems */
                     30: int    done;
                     31: int    mf;
                     32: 
                     33: char   *qfname = "quotas";
                     34: char   quotafile[MAXPATHLEN + 1];
                     35: char   *index(), *rindex();
                     36: 
                     37: main(argc, argv)
                     38:        int argc;
                     39:        char **argv;
                     40: {
                     41:        register struct fstab *fs;
                     42:        char *whoami, *rindex();
                     43:        int offmode = 0, errs = 0, i;
                     44: 
                     45:        whoami = rindex(*argv, '/') + 1;
                     46:        if (whoami == (char *)1)
                     47:                whoami = *argv;
                     48:        if (strcmp(whoami, "quotaoff") == 0)
                     49:                offmode++;
                     50:        else if (strcmp(whoami, "quotaon") != 0) {
                     51:                fprintf(stderr, "Name must be quotaon or quotaoff not %s\n",
                     52:                        whoami);
                     53:                exit(1);
                     54:        }
                     55: again:
                     56:        argc--, argv++;
                     57:        if (argc > 0 && strcmp(*argv, "-v") == 0) {
                     58:                vflag++;
                     59:                goto again;
                     60:        }
                     61:        if (argc > 0 && strcmp(*argv, "-a") == 0) {
                     62:                aflag++;
                     63:                goto again;
                     64:        }
                     65:        if (argc <= 0 && !aflag) {
                     66:                fprintf(stderr, "Usage:\n\t%s [-v] -a\n\t%s [-v] filesys ...\n",
                     67:                        whoami, whoami);
                     68:                exit(1);
                     69:        }
                     70:        mf = open("/etc/mtab", O_RDONLY);
                     71:        if (mf < 0) {
                     72:                perror("/etc/mtab");
                     73:                exit(1);
                     74:        }
                     75:        (void) read(mf, (char *)mtab, sizeof (mtab));
                     76:        close(mf);
                     77:        setfsent();
                     78:        while ((fs = getfsent()) != NULL) {
                     79:                if (aflag &&
                     80:                    (fs->fs_type == 0 || strcmp(fs->fs_type, "rq") != 0))
                     81:                        continue;
                     82:                if (!aflag &&
                     83:                    !(oneof(fs->fs_file, argv, argc) ||
                     84:                      oneof(fs->fs_spec, argv, argc)))
                     85:                        continue;
                     86:                errs += quotaonoff(fs, offmode);
                     87:        }
                     88:        endfsent();
                     89:        for (i = 0; i < argc; i++)
                     90:                if ((done & (1 << i)) == 0)
                     91:                        fprintf(stderr, "%s not found in /etc/fstab\n",
                     92:                                argv[i]);
                     93:        exit(errs);
                     94: }
                     95: 
                     96: quotaonoff(fs, offmode)
                     97:        register struct fstab *fs;
                     98:        int offmode;
                     99: {
                    100: 
                    101:        if (strcmp(fs->fs_file, "/") && readonly(fs))
                    102:                return (1);
                    103:        if (offmode) {
                    104:                if (setquota(fs->fs_spec, NULL) < 0)
                    105:                        goto bad;
                    106:                if (vflag)
                    107:                        printf("%s: quotas turned off\n", fs->fs_file);
                    108:                changemtab(fs, FSTAB_RW);
                    109:                return (0);
                    110:        }
                    111:        (void) sprintf(quotafile, "%s/%s", fs->fs_file, qfname);
                    112:        if (setquota(fs->fs_spec, quotafile) < 0)
                    113:                goto bad;
                    114:        if (vflag)
                    115:                printf("%s: quotas turned on\n", fs->fs_file);
                    116:        changemtab(fs, FSTAB_RQ);
                    117:        return (0);
                    118: bad:
                    119:        fprintf(stderr, "setquota: ");
                    120:        perror(fs->fs_spec);
                    121:        return (1);
                    122: }
                    123: 
                    124: oneof(target, list, n)
                    125:        char *target, *list[];
                    126:        register int n;
                    127: {
                    128:        register int i;
                    129: 
                    130:        for (i = 0; i < n; i++)
                    131:                if (strcmp(target, list[i]) == 0) {
                    132:                        done |= 1 << i;
                    133:                        return (1);
                    134:                }
                    135:        return (0);
                    136: }
                    137: 
                    138: changemtab(fs, type)
                    139:        register struct fstab *fs;
                    140:        char *type;
                    141: {
                    142:        register struct mtab *mp;
                    143:        register char *cp;
                    144: 
                    145:        cp = index(fs->fs_spec, '\0');
                    146:        while (*--cp == '/')
                    147:                *cp = '\0';
                    148:        cp = rindex(fs->fs_spec, '/');
                    149:        if (cp)
                    150:                cp++;
                    151:        else
                    152:                cp = fs->fs_spec;
                    153:        for (mp = mtab; mp < &mtab[NMOUNT]; mp++)
                    154:                if (strcmp(mp->m_dname, cp) == 0)
                    155:                        goto replace;
                    156:        for (mp = mtab; mp < &mtab[NMOUNT]; mp++)
                    157:                if (mp->m_path[0] == '\0')
                    158:                        goto replace;
                    159:        return;
                    160: replace:
                    161:        strcpy(mp->m_type, type);
                    162:        mp = mtab + NMOUNT - 1;
                    163:        while (mp > mtab && mp->m_path[0] == '\0')
                    164:                --mp;
                    165:        mf = creat("/etc/mtab", 0644);
                    166:        (void) write(mf, (char *)mtab, (mp - mtab + 1) * sizeof (struct mtab));
                    167:        close(mf);
                    168: }
                    169: 
                    170: /*
                    171:  * Verify file system is mounted and not readonly.
                    172:  */
                    173: readonly(fs)
                    174:        register struct fstab *fs;
                    175: {
                    176:        register struct mtab *mp;
                    177:        register char *cp;
                    178: 
                    179:        cp = index(fs->fs_spec, '\0');
                    180:        while (*--cp == '/')
                    181:                *cp = '\0';
                    182:        cp = rindex(fs->fs_spec, '/');
                    183:        if (cp)
                    184:                cp++;
                    185:        else
                    186:                cp = fs->fs_spec;
                    187:        for (mp = mtab; mp < mtab + NMOUNT; mp++) {
                    188:                if (mp->m_path[0] == '\0')
                    189:                        continue;
                    190:                if (strcmp(cp, mp->m_dname) == 0) {
                    191:                        if (strcmp(mp->m_type, FSTAB_RO) == 0) {
                    192:                                printf("%s: mounted read-only\n", fs->fs_file);
                    193:                                return (1);
                    194:                        }
                    195:                        return (0);
                    196:                }
                    197:        }
                    198:        printf("%s: not mounted\n", fs->fs_file);
                    199:        return (1);
                    200: }

unix.superglobalmegacorp.com

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