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