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