|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.