xref: /csrg-svn/usr.sbin/quotaon/quotaon.c (revision 12670)
112662Smckusick #ifndef lint
2*12670Smckusick static char sccsid[] = "@(#)quotaon.c	4.2 (Berkeley, Melbourne) 05/22/83";
312662Smckusick #endif
412662Smckusick /*
5*12670Smckusick  * Turn quota on/off for a filesystem.
6*12670Smckusick  *
7*12670Smckusick  * NEED TO REFLECT CURRENT STATUS IN MTAB.
812662Smckusick  */
912662Smckusick #include <sys/param.h>
1012662Smckusick #include <stdio.h>
1112662Smckusick #include <fstab.h>
1212662Smckusick 
1312662Smckusick int	vflag;		/* verbose */
1412662Smckusick int	aflag;		/* all file systems */
1512662Smckusick 
16*12670Smckusick char *qfname = "quotas";
17*12670Smckusick char quotafile[MAXPATHLEN + 1];
18*12670Smckusick 
1912662Smckusick main(argc, argv)
20*12670Smckusick 	int argc;
2112662Smckusick 	char **argv;
2212662Smckusick {
2312662Smckusick 	register struct fstab *fs;
24*12670Smckusick 	char *whoami, *rindex();
25*12670Smckusick 	int offmode = 0, errs = 0;
2612662Smckusick 
27*12670Smckusick 	whoami = rindex(*argv, '/') + 1;
28*12670Smckusick 	if (whoami == (char *)1)
29*12670Smckusick 		whoami = *argv;
30*12670Smckusick 	if (strcmp(whoami, "quotaoff") == 0)
31*12670Smckusick 		offmode++;
32*12670Smckusick 	else if (strcmp(whoami, "quotaon") != 0) {
33*12670Smckusick 		fprintf(stderr, "Name must be quotaon or quotaoff not %s\n",
34*12670Smckusick 			whoami);
35*12670Smckusick 		exit(1);
36*12670Smckusick 	}
3712662Smckusick again:
3812662Smckusick 	argc--, argv++;
3912662Smckusick 	if (argc > 0 && strcmp(*argv, "-v") == 0) {
4012662Smckusick 		vflag++;
4112662Smckusick 		goto again;
4212662Smckusick 	}
4312662Smckusick 	if (argc > 0 && strcmp(*argv, "-a") == 0) {
4412662Smckusick 		aflag++;
4512662Smckusick 		goto again;
4612662Smckusick 	}
47*12670Smckusick 	if (argc <= 0 && !aflag) {
48*12670Smckusick 		fprintf(stderr, "Usage:\n\t%s [-v] -a\n\t%s [-v] filesys ...\n",
49*12670Smckusick 			whoami, whoami);
5012662Smckusick 		exit(1);
5112662Smckusick 	}
5212662Smckusick 	setfsent();
5312662Smckusick 	while ((fs = getfsent()) != NULL) {
54*12670Smckusick 		if (fs->fs_type == 0)
5512662Smckusick 			continue;
56*12670Smckusick 		if (aflag && strcmp(fs->fs_type, "rq") != 0)
5712662Smckusick 			continue;
5812662Smckusick 		if (!aflag && !oneof(fs->fs_file, argv, argc))
5912662Smckusick 			continue;
60*12670Smckusick 		if (offmode) {
61*12670Smckusick 			if (setquota(fs->fs_spec, NULL) < 0) {
62*12670Smckusick 				fprintf(stderr, "setquota: ");
63*12670Smckusick 				perror(fs->fs_spec);
64*12670Smckusick 				errs++;
65*12670Smckusick 				continue;
66*12670Smckusick 			}
67*12670Smckusick 			if (vflag)
68*12670Smckusick 				printf("%s: quotas turned off\n", fs->fs_file);
69*12670Smckusick 			continue;
70*12670Smckusick 		}
71*12670Smckusick 		(void) sprintf(quotafile, "%s/%s", fs->fs_file, qfname);
72*12670Smckusick 		if (setquota(fs->fs_spec, quotafile) < 0) {
7312662Smckusick 			fprintf(stderr, "setquota: ");
7412662Smckusick 			perror(fs->fs_spec);
75*12670Smckusick 			errs++;
76*12670Smckusick 			continue;
7712662Smckusick 		}
78*12670Smckusick 		if (vflag)
79*12670Smckusick 			printf("%s: quotas turned on\n", fs->fs_file);
8012662Smckusick 	}
8112662Smckusick 	endfsent();
82*12670Smckusick 	exit(errs);
8312662Smckusick }
8412662Smckusick 
8512662Smckusick oneof(target, list, n)
8612662Smckusick 	char *target, *list[];
8712662Smckusick 	register int n;
8812662Smckusick {
8912662Smckusick 	register int i;
9012662Smckusick 
9112662Smckusick 	for (i = 0; i < n; i++)
9212662Smckusick 		if (strcmp(target, list[i]) == 0)
9312662Smckusick 			return (1);
9412662Smckusick 	return (0);
9512662Smckusick }
96