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: }

Defined functions

changemtab defined in line 138; used 2 times
main defined in line 37; never used
oneof defined in line 124; used 2 times
quotaonoff defined in line 96; used 1 times
  • in line 86
readonly defined in line 173; used 1 times

Defined variables

aflag defined in line 29; used 4 times
copyright defined in line 8; never used
done defined in line 30; used 2 times
mf defined in line 31; used 7 times
mtab defined in line 26; used 12 times
qfname defined in line 33; used 1 times
quotafile defined in line 34; used 2 times
sccsid defined in line 14; never used
vflag defined in line 28; used 3 times
Last modified: 1985-08-09
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1185
Valid CSS Valid XHTML 1.0 Strict