get rid of use of mtab.h
[unix-history] / usr / src / usr.sbin / quotaon / quotaon.c
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef lint
char copyright[] =
"@(#) Copyright (c) 1980 Regents of the University of California.\n\
All rights reserved.\n";
#endif /* not lint */
#ifndef lint
static char sccsid[] = "@(#)quotaon.c 5.6 (Berkeley) %G%";
#endif /* not lint */
/*
* Turn quota on/off for a filesystem.
*/
#include <sys/param.h>
#include <sys/file.h>
#include <sys/mount.h>
#include <stdio.h>
#include <fstab.h>
int vflag; /* verbose */
int aflag; /* all file systems */
int done;
char *qfname = "quotas";
char quotafile[MAXPATHLEN + 1];
char *index(), *rindex();
main(argc, argv)
int argc;
char **argv;
{
register struct fstab *fs;
char *whoami, *rindex();
int offmode = 0, errs = 0, i;
whoami = rindex(*argv, '/') + 1;
if (whoami == (char *)1)
whoami = *argv;
if (strcmp(whoami, "quotaoff") == 0)
offmode++;
else if (strcmp(whoami, "quotaon") != 0) {
fprintf(stderr, "Name must be quotaon or quotaoff not %s\n",
whoami);
exit(1);
}
again:
argc--, argv++;
if (argc > 0 && strcmp(*argv, "-v") == 0) {
vflag++;
goto again;
}
if (argc > 0 && strcmp(*argv, "-a") == 0) {
aflag++;
goto again;
}
if (argc <= 0 && !aflag) {
fprintf(stderr, "Usage:\n\t%s [-v] -a\n\t%s [-v] filesys ...\n",
whoami, whoami);
exit(1);
}
setfsent();
while ((fs = getfsent()) != NULL) {
if (aflag &&
(fs->fs_type == 0 || strcmp(fs->fs_type, "rq") != 0))
continue;
if (!aflag &&
!(oneof(fs->fs_file, argv, argc) ||
oneof(fs->fs_spec, argv, argc)))
continue;
errs += quotaonoff(fs, offmode);
}
endfsent();
for (i = 0; i < argc; i++)
if ((done & (1 << i)) == 0)
fprintf(stderr, "%s not found in fstab\n",
argv[i]);
exit(errs);
}
quotaonoff(fs, offmode)
register struct fstab *fs;
int offmode;
{
if (strcmp(fs->fs_file, "/") && readonly(fs))
return (1);
if (offmode) {
if (setquota(fs->fs_spec, NULL) < 0)
goto bad;
if (vflag)
printf("%s: quotas turned off\n", fs->fs_file);
return (0);
}
(void) sprintf(quotafile, "%s/%s", fs->fs_file, qfname);
if (setquota(fs->fs_spec, quotafile) < 0)
goto bad;
if (vflag)
printf("%s: quotas turned on\n", fs->fs_file);
return (0);
bad:
fprintf(stderr, "setquota: ");
perror(fs->fs_spec);
return (1);
}
oneof(target, list, n)
char *target, *list[];
register int n;
{
register int i;
for (i = 0; i < n; i++)
if (strcmp(target, list[i]) == 0) {
done |= 1 << i;
return (1);
}
return (0);
}
/*
* Verify file system is mounted and not readonly.
*/
readonly(fs)
register struct fstab *fs;
{
struct statfs fsbuf;
if (statfs(fs->fs_file, &fsbuf) < 0 ||
strcmp(fsbuf.f_mntonname, fs->fs_file) ||
strcmp(fsbuf.f_mntfromname, fs->fs_spec)) {
printf("%s: not mounted\n", fs->fs_file);
return (1);
}
if (fsbuf.f_flags & M_RDONLY) {
printf("%s: mounted read-only\n", fs->fs_file);
return (1);
}
return (0);
}