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