xref: /csrg-svn/usr.sbin/quotaon/quotaon.c (revision 12723)
112662Smckusick #ifndef lint
2*12723Smckusick static char sccsid[] = "@(#)quotaon.c	4.3 (Berkeley, Melbourne) 05/25/83";
312662Smckusick #endif
412662Smckusick /*
512670Smckusick  * Turn quota on/off for a filesystem.
612670Smckusick  *
712670Smckusick  * 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 */
15*12723Smckusick int	done;
1612662Smckusick 
1712670Smckusick char *qfname = "quotas";
1812670Smckusick char quotafile[MAXPATHLEN + 1];
1912670Smckusick 
2012662Smckusick main(argc, argv)
2112670Smckusick 	int argc;
2212662Smckusick 	char **argv;
2312662Smckusick {
2412662Smckusick 	register struct fstab *fs;
2512670Smckusick 	char *whoami, *rindex();
26*12723Smckusick 	int offmode = 0, errs = 0, i;
2712662Smckusick 
2812670Smckusick 	whoami = rindex(*argv, '/') + 1;
2912670Smckusick 	if (whoami == (char *)1)
3012670Smckusick 		whoami = *argv;
3112670Smckusick 	if (strcmp(whoami, "quotaoff") == 0)
3212670Smckusick 		offmode++;
3312670Smckusick 	else if (strcmp(whoami, "quotaon") != 0) {
3412670Smckusick 		fprintf(stderr, "Name must be quotaon or quotaoff not %s\n",
3512670Smckusick 			whoami);
3612670Smckusick 		exit(1);
3712670Smckusick 	}
3812662Smckusick again:
3912662Smckusick 	argc--, argv++;
4012662Smckusick 	if (argc > 0 && strcmp(*argv, "-v") == 0) {
4112662Smckusick 		vflag++;
4212662Smckusick 		goto again;
4312662Smckusick 	}
4412662Smckusick 	if (argc > 0 && strcmp(*argv, "-a") == 0) {
4512662Smckusick 		aflag++;
4612662Smckusick 		goto again;
4712662Smckusick 	}
4812670Smckusick 	if (argc <= 0 && !aflag) {
4912670Smckusick 		fprintf(stderr, "Usage:\n\t%s [-v] -a\n\t%s [-v] filesys ...\n",
5012670Smckusick 			whoami, whoami);
5112662Smckusick 		exit(1);
5212662Smckusick 	}
5312662Smckusick 	setfsent();
5412662Smckusick 	while ((fs = getfsent()) != NULL) {
55*12723Smckusick 		if (aflag &&
56*12723Smckusick 		    (fs->fs_type == 0 || strcmp(fs->fs_type, "rq") != 0))
5712662Smckusick 			continue;
58*12723Smckusick 		if (!aflag &&
59*12723Smckusick 		    !(oneof(fs->fs_file, argv, argc) ||
60*12723Smckusick 		      oneof(fs->fs_spec, argv, argc)))
6112662Smckusick 			continue;
6212670Smckusick 		if (offmode) {
6312670Smckusick 			if (setquota(fs->fs_spec, NULL) < 0) {
6412670Smckusick 				fprintf(stderr, "setquota: ");
6512670Smckusick 				perror(fs->fs_spec);
6612670Smckusick 				errs++;
6712670Smckusick 				continue;
6812670Smckusick 			}
6912670Smckusick 			if (vflag)
7012670Smckusick 				printf("%s: quotas turned off\n", fs->fs_file);
7112670Smckusick 			continue;
7212670Smckusick 		}
7312670Smckusick 		(void) sprintf(quotafile, "%s/%s", fs->fs_file, qfname);
7412670Smckusick 		if (setquota(fs->fs_spec, quotafile) < 0) {
7512662Smckusick 			fprintf(stderr, "setquota: ");
7612662Smckusick 			perror(fs->fs_spec);
7712670Smckusick 			errs++;
7812670Smckusick 			continue;
7912662Smckusick 		}
8012670Smckusick 		if (vflag)
8112670Smckusick 			printf("%s: quotas turned on\n", fs->fs_file);
8212662Smckusick 	}
8312662Smckusick 	endfsent();
84*12723Smckusick 	for (i = 0; i < argc; i++)
85*12723Smckusick 		if ((done & (1 << i)) == 0)
86*12723Smckusick 			fprintf(stderr, "%s not found in /etc/fstab\n",
87*12723Smckusick 				argv[i]);
8812670Smckusick 	exit(errs);
8912662Smckusick }
9012662Smckusick 
9112662Smckusick oneof(target, list, n)
9212662Smckusick 	char *target, *list[];
9312662Smckusick 	register int n;
9412662Smckusick {
9512662Smckusick 	register int i;
9612662Smckusick 
9712662Smckusick 	for (i = 0; i < n; i++)
98*12723Smckusick 		if (strcmp(target, list[i]) == 0) {
99*12723Smckusick 			done |= 1 << i;
10012662Smckusick 			return (1);
101*12723Smckusick 		}
10212662Smckusick 	return (0);
10312662Smckusick }
104