BSD 4_4 release
[unix-history] / usr / src / usr.sbin / quotaon / quotaon.c
index 485281e..8eabd27 100644 (file)
@@ -1,31 +1,47 @@
 /*
 /*
- * Copyright (c) 1980, 1990 Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1980, 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  * This code is derived from software contributed to Berkeley by
  * Robert Elz at The University of Melbourne.
  *
  *
  * This code is derived from software contributed to Berkeley by
  * Robert Elz at The University of Melbourne.
  *
- * 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.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1980, 1990 Regents of the University of California.\n\
- All rights reserved.\n";
+static char copyright[] =
+"@(#) Copyright (c) 1980, 1990, 1993\n\
      The Regents of the University of California.  All rights reserved.\n";
 #endif /* not lint */
 
 #ifndef lint
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)quotaon.c  5.7 (Berkeley) %G%";
+static char sccsid[] = "@(#)quotaon.c  8.1 (Berkeley) 6/6/93";
 #endif /* not lint */
 
 /*
 #endif /* not lint */
 
 /*
@@ -34,10 +50,13 @@ static char sccsid[] = "@(#)quotaon.c       5.7 (Berkeley) %G%";
 #include <sys/param.h>
 #include <sys/file.h>
 #include <sys/mount.h>
 #include <sys/param.h>
 #include <sys/file.h>
 #include <sys/mount.h>
-#include <ufs/quota.h>
+#include <ufs/ufs/quota.h>
 #include <stdio.h>
 #include <fstab.h>
 
 #include <stdio.h>
 #include <fstab.h>
 
+char *qfname = QUOTAFILENAME;
+char *qfextension[] = INITQFNAMES;
+
 int    aflag;          /* all file systems */
 int    gflag;          /* operate on group quotas */
 int    uflag;          /* operate on user quotas */
 int    aflag;          /* all file systems */
 int    gflag;          /* operate on group quotas */
 int    uflag;          /* operate on user quotas */
@@ -48,7 +67,7 @@ main(argc, argv)
        char **argv;
 {
        register struct fstab *fs;
        char **argv;
 {
        register struct fstab *fs;
-       char ch, *whoami, *rindex();
+       char ch, *qfnp, *whoami, *rindex();
        long argnum, done = 0;
        int i, offmode = 0, errs = 0;
        extern char *optarg;
        long argnum, done = 0;
        int i, offmode = 0, errs = 0;
        extern char *optarg;
@@ -92,20 +111,23 @@ main(argc, argv)
        }
        setfsent();
        while ((fs = getfsent()) != NULL) {
        }
        setfsent();
        while ((fs = getfsent()) != NULL) {
+               if (strcmp(fs->fs_vfstype, "ufs") ||
+                   strcmp(fs->fs_type, FSTAB_RW))
+                       continue;
                if (aflag) {
                if (aflag) {
-                       if (gflag && hasquota(fs->fs_mntops, GRPQUOTA))
-                               errs += quotaonoff(fs, offmode, GRPQUOTA);
-                       if (uflag && hasquota(fs->fs_mntops, USRQUOTA))
-                               errs += quotaonoff(fs, offmode, USRQUOTA);
+                       if (gflag && hasquota(fs, GRPQUOTA, &qfnp))
+                               errs += quotaonoff(fs, offmode, GRPQUOTA, qfnp);
+                       if (uflag && hasquota(fs, USRQUOTA, &qfnp))
+                               errs += quotaonoff(fs, offmode, USRQUOTA, qfnp);
                        continue;
                }
                        continue;
                }
-               if ((argnum = oneof(fs->fs_file, argv, argc) >= 0) ||
+               if ((argnum = oneof(fs->fs_file, argv, argc)) >= 0 ||
                    (argnum = oneof(fs->fs_spec, argv, argc)) >= 0) {
                        done |= 1 << argnum;
                    (argnum = oneof(fs->fs_spec, argv, argc)) >= 0) {
                        done |= 1 << argnum;
-                       if (gflag && hasquota(fs->fs_mntops, GRPQUOTA))
-                               errs += quotaonoff(fs, offmode, GRPQUOTA);
-                       if (uflag && hasquota(fs->fs_mntops, USRQUOTA))
-                               errs += quotaonoff(fs, offmode, USRQUOTA);
+                       if (gflag && hasquota(fs, GRPQUOTA, &qfnp))
+                               errs += quotaonoff(fs, offmode, GRPQUOTA, qfnp);
+                       if (uflag && hasquota(fs, USRQUOTA, &qfnp))
+                               errs += quotaonoff(fs, offmode, USRQUOTA, qfnp);
                }
        }
        endfsent();
                }
        }
        endfsent();
@@ -125,33 +147,33 @@ usage(whoami)
        exit(1);
 }
 
        exit(1);
 }
 
-quotaonoff(fs, offmode, type)
+quotaonoff(fs, offmode, type, qfpathname)
        register struct fstab *fs;
        int offmode, type;
        register struct fstab *fs;
        int offmode, type;
+       char *qfpathname;
 {
 {
-       char    quotafile[MAXPATHLEN + 1];
 
        if (strcmp(fs->fs_file, "/") && readonly(fs))
                return (1);
        if (offmode) {
 
        if (strcmp(fs->fs_file, "/") && readonly(fs))
                return (1);
        if (offmode) {
-               if (quotactl(fs->fs_file, QCMD(Q_QUOTAOFF, type), 0, 0) < 0)
-                       goto bad;
+               if (quotactl(fs->fs_file, QCMD(Q_QUOTAOFF, type), 0, 0) < 0) {
+                       fprintf(stderr, "quotaoff: ");
+                       perror(fs->fs_file);
+                       return (1);
+               }
                if (vflag)
                        printf("%s: quotas turned off\n", fs->fs_file);
                return (0);
        }
                if (vflag)
                        printf("%s: quotas turned off\n", fs->fs_file);
                return (0);
        }
-       (void) sprintf(quotafile, "%s/%s.%s", fs->fs_file, qfname,
-           qfextension[type]);
-       if (quotactl(fs->fs_file, QCMD(Q_QUOTAON, type), 0, quotafile) < 0)
-               goto bad;
+       if (quotactl(fs->fs_file, QCMD(Q_QUOTAON, type), 0, qfpathname) < 0) {
+               fprintf(stderr, "quotaon: using %s on", qfpathname);
+               perror(fs->fs_file);
+               return (1);
+       }
        if (vflag)
                printf("%s: %s quotas turned on\n", fs->fs_file,
                    qfextension[type]);
        return (0);
        if (vflag)
                printf("%s: %s quotas turned on\n", fs->fs_file,
                    qfextension[type]);
        return (0);
-bad:
-       fprintf(stderr, "setquota: ");
-       perror(fs->fs_file);
-       return (1);
 }
 
 /*
 }
 
 /*
@@ -172,28 +194,39 @@ oneof(target, list, cnt)
 /*
  * Check to see if a particular quota is to be enabled.
  */
 /*
  * Check to see if a particular quota is to be enabled.
  */
-hasquota(options, type)
-       char *options;
+hasquota(fs, type, qfnamep)
+       register struct fstab *fs;
        int type;
        int type;
+       char **qfnamep;
 {
        register char *opt;
 {
        register char *opt;
-       char buf[BUFSIZ];
-       char *strtok();
+       char *cp, *index(), *strtok();
        static char initname, usrname[100], grpname[100];
        static char initname, usrname[100], grpname[100];
+       static char buf[BUFSIZ];
 
        if (!initname) {
                sprintf(usrname, "%s%s", qfextension[USRQUOTA], qfname);
                sprintf(grpname, "%s%s", qfextension[GRPQUOTA], qfname);
                initname = 1;
        }
 
        if (!initname) {
                sprintf(usrname, "%s%s", qfextension[USRQUOTA], qfname);
                sprintf(grpname, "%s%s", qfextension[GRPQUOTA], qfname);
                initname = 1;
        }
-       strcpy(buf, options);
+       strcpy(buf, fs->fs_mntops);
        for (opt = strtok(buf, ","); opt; opt = strtok(NULL, ",")) {
        for (opt = strtok(buf, ","); opt; opt = strtok(NULL, ",")) {
+               if (cp = index(opt, '='))
+                       *cp++ = '\0';
                if (type == USRQUOTA && strcmp(opt, usrname) == 0)
                if (type == USRQUOTA && strcmp(opt, usrname) == 0)
-                       return(1);
+                       break;
                if (type == GRPQUOTA && strcmp(opt, grpname) == 0)
                if (type == GRPQUOTA && strcmp(opt, grpname) == 0)
-                       return(1);
+                       break;
        }
        }
-       return (0);
+       if (!opt)
+               return (0);
+       if (cp) {
+               *qfnamep = cp;
+               return (1);
+       }
+       (void) sprintf(buf, "%s/%s.%s", fs->fs_file, qfname, qfextension[type]);
+       *qfnamep = buf;
+       return (1);
 }
 
 /*
 }
 
 /*
@@ -210,7 +243,7 @@ readonly(fs)
                printf("%s: not mounted\n", fs->fs_file);
                return (1);
        }
                printf("%s: not mounted\n", fs->fs_file);
                return (1);
        }
-       if (fsbuf.f_flags & M_RDONLY) {
+       if (fsbuf.f_flags & MNT_RDONLY) {
                printf("%s: mounted read-only\n", fs->fs_file);
                return (1);
        }
                printf("%s: mounted read-only\n", fs->fs_file);
                return (1);
        }