Subject: extra sprintf in quota(1), missing MNT_QUOTAS in mntopts.h (#303) Index: mount/mntopts.h,ucb/quota.c 2.11BSD Description: mount(8) complains about illegal option "quotas" if the new style fstab(5) format is used and quotas are enabled. quota(1) always reports "no quota" even if quotas are enabled and a quota has been assigned to a user id. Repeat-By: Have an entry of the form: /dev/ra0f /user ufs rw,quotas 1 4 present in /etc/fstab. Note the error from 'mount'. Have quotas enabled and assigned for a user. Use 'quota' and note that the response is "Disk quotas for ... (none)" Fix: The first problem was caused by paying too much attention to the compatibility mode in the parsing of /etc/fstab. The old "rq" would be correctly handled but the newer "quotas" option was inadvertently omitted. Oops ;-) In the second case too much code was cut and pasted - the 'hasquota' routine generated the correct pathname. The calling routine then prepended the mount point name resulting in the quota file being called something like "/users/users/quotas" which didn't exist, thus no quotas were ever reported. Cut where indicated, saving to a file (/tmp/303) and then: patch -p0 < /tmp/303 cd /usr/src/etc/mount make make install make clean cd /usr/src/ucb make quota install -s -m 4755 quota /usr/ucb/quota ------------------------------cut here------------------------------ *** /usr/src/etc/mount/mntopts.h.old Wed Jan 24 23:32:57 1996 --- /usr/src/etc/mount/mntopts.h Wed Feb 7 22:58:58 1996 *************** *** 30,36 **** * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ! * @(#)mntopts.h 8.3.1 (2.11BSD) 1996/1/16 */ struct mntopt { --- 30,36 ---- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ! * @(#)mntopts.h 8.3.2 (2.11BSD) 1996/2/7 */ struct mntopt { *************** *** 46,51 **** --- 46,52 ---- #define MOPT_NOSUID { "suid", 1, MNT_NOSUID } #define MOPT_RDONLY { "rdonly", 0, MNT_RDONLY } #define MOPT_SYNC { "sync", 0, MNT_SYNCHRONOUS } + #define MOPT_QUOTAS { "quotas", 0, 0 } /* Control flags. */ #define MOPT_FORCE { "force", 1, MNT_FORCE } *************** *** 56,69 **** #define MOPT_RW { "rw", 1, MNT_RDONLY } #define MOPT_RQ { "rq", 1, MNT_RDONLY } #define MOPT_FSTAB_COMPAT \ MOPT_RO, \ MOPT_RW, \ ! MOPT_RQ /* Standard options which all mounts can understand. */ #define MOPT_STDOPTS \ MOPT_FSTAB_COMPAT, \ MOPT_NODEV, \ MOPT_NOEXEC, \ MOPT_NOSUID, \ --- 57,77 ---- #define MOPT_RW { "rw", 1, MNT_RDONLY } #define MOPT_RQ { "rq", 1, MNT_RDONLY } + /* Ignored options (used for control in fstab) */ + #define MOPT_AUTO { "auto", } + #define MOPT_NOAUTO { "na", } + #define MOPT_FSTAB_COMPAT \ MOPT_RO, \ MOPT_RW, \ ! MOPT_RQ, \ ! MOPT_NOAUTO, \ ! MOPT_AUTO /* Standard options which all mounts can understand. */ #define MOPT_STDOPTS \ MOPT_FSTAB_COMPAT, \ + MOPT_QUOTAS, \ MOPT_NODEV, \ MOPT_NOEXEC, \ MOPT_NOSUID, \ *** /usr/src/ucb/quota.c.old Sun Jan 21 17:40:15 1996 --- /usr/src/ucb/quota.c Wed Feb 7 23:27:08 1996 *************** *** 9,15 **** "@(#) Copyright (c) 1980 Regents of the University of California.\n\ All rights reserved.\n"; ! static char sccsid[] = "@(#)quota.c 5.4.2 (2.11BSD GTE) 1996/1/21"; #endif /* --- 9,15 ---- "@(#) Copyright (c) 1980 Regents of the University of California.\n\ All rights reserved.\n"; ! static char sccsid[] = "@(#)quota.c 5.4.3 (2.11BSD GTE) 1996/2/7"; #endif /* *************** *** 113,119 **** char *qfpathname; struct dqblk dqblk; int myuid, fd; ! char qfilename[MAXPATHLEN + 1], iwarn[8], dwarn[8]; myuid = getuid(); if (uid != myuid && myuid != 0) { --- 113,119 ---- char *qfpathname; struct dqblk dqblk; int myuid, fd; ! char iwarn[8], dwarn[8]; myuid = getuid(); if (uid != myuid && myuid != 0) { *************** *** 130,136 **** if (stat(fs->fs_spec, &statb) < 0) continue; msgi = msgb = (char *) 0; - (void) sprintf(qfilename, "%s/%s", fs->fs_file, qfpathname); /* * This check for the quota file being in the filesystem to which the quotas * belong is silly but the kernel enforces it. When the kernel is fixed the --- 130,135 ---- *************** *** 137,146 **** * check can be removed. */ fsdev = statb.st_rdev; ! if (stat(qfilename, &statb) < 0 || statb.st_dev != fsdev) continue; if (quota(Q_GETDLIM, uid, fsdev, (caddr_t)&dqblk)) { ! fd = open(qfilename, O_RDONLY); if (fd < 0) continue; (void) lseek(fd, (off_t)(uid * sizeof (dqblk)), L_SET); --- 136,145 ---- * check can be removed. */ fsdev = statb.st_rdev; ! if (stat(qfpathname, &statb) < 0 || statb.st_dev != fsdev) continue; if (quota(Q_GETDLIM, uid, fsdev, (caddr_t)&dqblk)) { ! fd = open(qfpathname, O_RDONLY); if (fd < 0) continue; (void) lseek(fd, (off_t)(uid * sizeof (dqblk)), L_SET); *************** *** 163,169 **** default: /* ERROR */ fprintf(stderr, "quota: read error in "); ! perror(qfilename); (void) close(fd); continue; } --- 162,168 ---- default: /* ERROR */ fprintf(stderr, "quota: read error in "); ! perror(qfpathname); (void) close(fd); continue; } *** /VERSION.old Wed Feb 7 20:16:05 1996 --- /VERSION Wed Feb 7 23:29:24 1996 *************** *** 1,4 **** ! Current Patch Level: 302 2.11 BSD ============ --- 1,4 ---- ! Current Patch Level: 303 2.11 BSD ============