Annotation of 43BSDTahoe/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.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted
                      6:  * provided that the above copyright notice and this paragraph are
                      7:  * duplicated in all such forms and that any documentation,
                      8:  * advertising materials, and other materials related to such
                      9:  * distribution and use acknowledge that the software was developed
                     10:  * by the University of California, Berkeley.  The name of the
                     11:  * University may not be used to endorse or promote products derived
                     12:  * from this software without specific prior written permission.
                     13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     16:  */
                     17: 
                     18: #ifndef lint
                     19: char copyright[] =
                     20: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
                     21:  All rights reserved.\n";
                     22: #endif /* not lint */
                     23: 
                     24: #ifndef lint
                     25: static char sccsid[] = "@(#)quotaon.c  5.4 (Berkeley) 6/18/88";
                     26: #endif /* not lint */
                     27: 
                     28: /*
                     29:  * Turn quota on/off for a filesystem.
                     30:  */
                     31: #include <sys/param.h>
                     32: #include <sys/file.h>
                     33: #include <stdio.h>
                     34: #include <fstab.h>
                     35: #include <mtab.h>
                     36: 
                     37: struct mtab mtab[NMOUNT];
                     38: 
                     39: int    vflag;          /* verbose */
                     40: int    aflag;          /* all file systems */
                     41: int    done;
                     42: int    mf;
                     43: 
                     44: char   *qfname = "quotas";
                     45: char   quotafile[MAXPATHLEN + 1];
                     46: char   *index(), *rindex();
                     47: 
                     48: main(argc, argv)
                     49:        int argc;
                     50:        char **argv;
                     51: {
                     52:        register struct fstab *fs;
                     53:        char *whoami, *rindex();
                     54:        int offmode = 0, errs = 0, i;
                     55: 
                     56:        whoami = rindex(*argv, '/') + 1;
                     57:        if (whoami == (char *)1)
                     58:                whoami = *argv;
                     59:        if (strcmp(whoami, "quotaoff") == 0)
                     60:                offmode++;
                     61:        else if (strcmp(whoami, "quotaon") != 0) {
                     62:                fprintf(stderr, "Name must be quotaon or quotaoff not %s\n",
                     63:                        whoami);
                     64:                exit(1);
                     65:        }
                     66: again:
                     67:        argc--, argv++;
                     68:        if (argc > 0 && strcmp(*argv, "-v") == 0) {
                     69:                vflag++;
                     70:                goto again;
                     71:        }
                     72:        if (argc > 0 && strcmp(*argv, "-a") == 0) {
                     73:                aflag++;
                     74:                goto again;
                     75:        }
                     76:        if (argc <= 0 && !aflag) {
                     77:                fprintf(stderr, "Usage:\n\t%s [-v] -a\n\t%s [-v] filesys ...\n",
                     78:                        whoami, whoami);
                     79:                exit(1);
                     80:        }
                     81:        mf = open("/etc/mtab", O_RDONLY);
                     82:        if (mf < 0) {
                     83:                perror("/etc/mtab");
                     84:                exit(1);
                     85:        }
                     86:        (void) read(mf, (char *)mtab, sizeof (mtab));
                     87:        close(mf);
                     88:        setfsent();
                     89:        while ((fs = getfsent()) != NULL) {
                     90:                if (aflag &&
                     91:                    (fs->fs_type == 0 || strcmp(fs->fs_type, "rq") != 0))
                     92:                        continue;
                     93:                if (!aflag &&
                     94:                    !(oneof(fs->fs_file, argv, argc) ||
                     95:                      oneof(fs->fs_spec, argv, argc)))
                     96:                        continue;
                     97:                errs += quotaonoff(fs, offmode);
                     98:        }
                     99:        endfsent();
                    100:        for (i = 0; i < argc; i++)
                    101:                if ((done & (1 << i)) == 0)
                    102:                        fprintf(stderr, "%s not found in /etc/fstab\n",
                    103:                                argv[i]);
                    104:        exit(errs);
                    105: }
                    106: 
                    107: quotaonoff(fs, offmode)
                    108:        register struct fstab *fs;
                    109:        int offmode;
                    110: {
                    111: 
                    112:        if (strcmp(fs->fs_file, "/") && readonly(fs))
                    113:                return (1);
                    114:        if (offmode) {
                    115:                if (setquota(fs->fs_spec, NULL) < 0)
                    116:                        goto bad;
                    117:                if (vflag)
                    118:                        printf("%s: quotas turned off\n", fs->fs_file);
                    119:                changemtab(fs, FSTAB_RW);
                    120:                return (0);
                    121:        }
                    122:        (void) sprintf(quotafile, "%s/%s", fs->fs_file, qfname);
                    123:        if (setquota(fs->fs_spec, quotafile) < 0)
                    124:                goto bad;
                    125:        if (vflag)
                    126:                printf("%s: quotas turned on\n", fs->fs_file);
                    127:        changemtab(fs, FSTAB_RQ);
                    128:        return (0);
                    129: bad:
                    130:        fprintf(stderr, "setquota: ");
                    131:        perror(fs->fs_spec);
                    132:        return (1);
                    133: }
                    134: 
                    135: oneof(target, list, n)
                    136:        char *target, *list[];
                    137:        register int n;
                    138: {
                    139:        register int i;
                    140: 
                    141:        for (i = 0; i < n; i++)
                    142:                if (strcmp(target, list[i]) == 0) {
                    143:                        done |= 1 << i;
                    144:                        return (1);
                    145:                }
                    146:        return (0);
                    147: }
                    148: 
                    149: changemtab(fs, type)
                    150:        register struct fstab *fs;
                    151:        char *type;
                    152: {
                    153:        register struct mtab *mp;
                    154:        register char *cp;
                    155: 
                    156:        cp = index(fs->fs_spec, '\0');
                    157:        while (*--cp == '/')
                    158:                *cp = '\0';
                    159:        cp = rindex(fs->fs_spec, '/');
                    160:        if (cp)
                    161:                cp++;
                    162:        else
                    163:                cp = fs->fs_spec;
                    164:        for (mp = mtab; mp < &mtab[NMOUNT]; mp++)
                    165:                if (strcmp(mp->m_dname, cp) == 0)
                    166:                        goto replace;
                    167:        for (mp = mtab; mp < &mtab[NMOUNT]; mp++)
                    168:                if (mp->m_path[0] == '\0')
                    169:                        goto replace;
                    170:        return;
                    171: replace:
                    172:        strcpy(mp->m_type, type);
                    173:        mp = mtab + NMOUNT - 1;
                    174:        while (mp > mtab && mp->m_path[0] == '\0')
                    175:                --mp;
                    176:        mf = creat("/etc/mtab", 0644);
                    177:        (void) write(mf, (char *)mtab, (mp - mtab + 1) * sizeof (struct mtab));
                    178:        close(mf);
                    179: }
                    180: 
                    181: /*
                    182:  * Verify file system is mounted and not readonly.
                    183:  */
                    184: readonly(fs)
                    185:        register struct fstab *fs;
                    186: {
                    187:        register struct mtab *mp;
                    188:        register char *cp;
                    189: 
                    190:        cp = index(fs->fs_spec, '\0');
                    191:        while (*--cp == '/')
                    192:                *cp = '\0';
                    193:        cp = rindex(fs->fs_spec, '/');
                    194:        if (cp)
                    195:                cp++;
                    196:        else
                    197:                cp = fs->fs_spec;
                    198:        for (mp = mtab; mp < mtab + NMOUNT; mp++) {
                    199:                if (mp->m_path[0] == '\0')
                    200:                        continue;
                    201:                if (strcmp(cp, mp->m_dname) == 0) {
                    202:                        if (strcmp(mp->m_type, FSTAB_RO) == 0) {
                    203:                                printf("%s: mounted read-only\n", fs->fs_file);
                    204:                                return (1);
                    205:                        }
                    206:                        return (0);
                    207:                }
                    208:        }
                    209:        printf("%s: not mounted\n", fs->fs_file);
                    210:        return (1);
                    211: }

unix.superglobalmegacorp.com

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