install correct aliases file
[unix-history] / usr / src / usr.sbin / edquota / edquota.c
index ea45aa9..f37fe82 100644 (file)
@@ -1,6 +1,29 @@
+/*
+ * 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
 #ifndef lint
-static char sccsid[] = "@(#)edquota.c  4.5 (Berkeley, from Melbourne) %G%";
-#endif
+static char sccsid[] = "@(#)edquota.c  5.6 (Berkeley) %G%";
+#endif /* not lint */
 
 /*
  * Disk quota editor.
 
 /*
  * Disk quota editor.
@@ -100,11 +123,11 @@ getentry(name)
 
 editit()
 {
 
 editit()
 {
-       register pid, xpid;
-       int stat, omask;
+       register int pid, xpid;
+       long omask;
+       int stat;
 
 
-#define        mask(s) (1<<((s)-1))
-       omask = sigblock(mask(SIGINT)|mask(SIGQUIT)|mask(SIGHUP));
+       omask = sigblock(sigmask(SIGINT)|sigmask(SIGQUIT)|sigmask(SIGHUP));
  top:
        if ((pid = fork()) < 0) {
                extern errno;
  top:
        if ((pid = fork()) < 0) {
                extern errno;
@@ -161,8 +184,8 @@ getprivs(uid)
                fprintf(fd,
 "fs %s blocks (soft = %d, hard = %d) inodes (soft = %d, hard = %d)\n"
                        , dqf[i]
                fprintf(fd,
 "fs %s blocks (soft = %d, hard = %d) inodes (soft = %d, hard = %d)\n"
                        , dqf[i]
-                       , dq[i].dq_bsoftlimit / btodb(1024)
-                       , dq[i].dq_bhardlimit / btodb(1024)
+                       , dbtob(dq[i].dq_bsoftlimit) / 1024
+                       , dbtob(dq[i].dq_bhardlimit) / 1024
                        , dq[i].dq_isoftlimit
                        , dq[i].dq_ihardlimit
                );
                        , dq[i].dq_isoftlimit
                        , dq[i].dq_ihardlimit
                );
@@ -212,8 +235,8 @@ putprivs(uid)
                        fprintf(stderr, "%s: bad format\n", cp);
                        continue;
                }
                        fprintf(stderr, "%s: bad format\n", cp);
                        continue;
                }
-               dq[i].dq_bsoftlimit *= btodb(1024);
-               dq[i].dq_bhardlimit *= btodb(1024);
+               dq[i].dq_bsoftlimit = btodb(dq[i].dq_bsoftlimit * 1024);
+               dq[i].dq_bhardlimit = btodb(dq[i].dq_bhardlimit * 1024);
        }
        fclose(fd);
        n = i;
        }
        fclose(fd);
        n = i;
@@ -227,18 +250,6 @@ putprivs(uid)
                if (j >= NMOUNT)
                        continue;
                *odqf[j] = '\0';
                if (j >= NMOUNT)
                        continue;
                *odqf[j] = '\0';
-               if (dq[i].dq_isoftlimit == odq[j].dq_isoftlimit &&
-                   dq[i].dq_ihardlimit == odq[j].dq_ihardlimit &&
-                   dq[i].dq_bsoftlimit == odq[j].dq_bsoftlimit &&
-                   dq[i].dq_bhardlimit == odq[j].dq_bhardlimit) {
-                       for (j = i; j < NMOUNT; j++) {
-                               dq[j] = dq[j+1];
-                               strcpy(dqf[j], dqf[j+1]);
-                       }
-                       *dqf[j] = '\0';
-                       i--;
-                       continue;
-               }
                /*
                 * This isn't really good enough, it is quite likely
                 * to have changed while we have been away editing,
                /*
                 * This isn't really good enough, it is quite likely
                 * to have changed while we have been away editing,
@@ -318,13 +329,15 @@ getdiscq(uid, dq, dqf)
 {
        register struct fstab *fs;
        char qfilename[MAXPATHLEN + 1];
 {
        register struct fstab *fs;
        char qfilename[MAXPATHLEN + 1];
+       struct stat statb;
+       struct dqblk dqblk;
+       dev_t fsdev;
+       int fd;
+       static int warned = 0;
+       extern int errno;
 
        setfsent();
        while (fs = getfsent()) {
 
        setfsent();
        while (fs = getfsent()) {
-               struct  stat statb;
-               struct  dqblk dqblk;
-               dev_t   fsdev;
-
                if (stat(fs->fs_spec, &statb) < 0)
                        continue;
                fsdev = statb.st_rdev;
                if (stat(fs->fs_spec, &statb) < 0)
                        continue;
                fsdev = statb.st_rdev;
@@ -332,12 +345,31 @@ getdiscq(uid, dq, dqf)
                if (stat(qfilename, &statb) < 0 || statb.st_dev != fsdev)
                        continue;
                if (quota(Q_GETDLIM, uid, fsdev, &dqblk) != 0) {
                if (stat(qfilename, &statb) < 0 || statb.st_dev != fsdev)
                        continue;
                if (quota(Q_GETDLIM, uid, fsdev, &dqblk) != 0) {
-                       register fd = open(qfilename, O_RDONLY);
-
+                       if (errno == EINVAL && !warned) {
+                               warned++;
+                               fprintf(stderr, "Warning: %s\n",
+                                   "Quotas are not compiled into this kernel");
+                               sleep(3);
+                       }
+                       fd = open(qfilename, O_RDONLY);
                        if (fd < 0)
                                continue;
                        lseek(fd, (long)(uid * sizeof dqblk), L_SET);
                        if (fd < 0)
                                continue;
                        lseek(fd, (long)(uid * sizeof dqblk), L_SET);
-                       if (read(fd, &dqblk, sizeof dqblk) != sizeof (dqblk)) {
+                       switch (read(fd, &dqblk, sizeof dqblk)) {
+                       case 0:                 /* EOF */
+                               /*
+                                * Convert implicit 0 quota (EOF)
+                                * into an explicit one (zero'ed dqblk)
+                                */
+                               bzero((caddr_t)&dqblk, sizeof dqblk);
+                               break;
+
+                       case sizeof dqblk:      /* OK */
+                               break;
+
+                       default:                /* ERROR */
+                               fprintf(stderr, "edquota: read error in ");
+                               perror(qfilename);
                                close(fd);
                                continue;
                        }
                                close(fd);
                                continue;
                        }