Updates to edquota based on feedback from Dag-Erling Smorgrav.

This commit is contained in:
Kirk McKusick 2009-02-05 14:06:43 +00:00
parent 08dc3a5e5c
commit b83b5d3b79
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/projects/quota64/; revision=188145
3 changed files with 67 additions and 41 deletions

View File

@ -4,7 +4,7 @@
PROG= edquota
MAN= edquota.8
CSTD= c99
CSTD= gnu99
WARNS?= 4
DPADD= ${LIBUTIL}

View File

@ -39,10 +39,9 @@
.Nd edit user quotas
.Sh SYNOPSIS
.Nm
.Op Fl u
.Op Fl uh
.Op Fl f Ar fspath
.Op Fl p Ar proto-username
.Op Fl h
.Ar username ...
.Nm
.Op Fl u
@ -54,9 +53,9 @@
.Ar username ...
.Nm
.Fl g
.Op Fl h
.Op Fl f Ar fspath
.Op Fl p Ar proto-groupname
.Op Fl h
.Ar groupname ...
.Nm
.Fl g
@ -100,8 +99,11 @@ specifies otherwise.
.Pp
The quotas may then be modified, new quotas added, etc.
Block quotas can be specified in bytes (B), kilobytes (K),
megabytes (M), terabytes (T), pedabytes (P), or exabytes (E).
megabytes (M), terabytes (T), petabytes (P), or exabytes (E).
If no units are specified, kilobytes are assumed.
Inode quotas can be specified in kiloinodes (K),
megainodes (M), terainodes (T), petainodes (P), or exainodes (E).
If no units are specified, the number of inodes specified are used.
If the
.Fl h
flag is specified, the editor will always display the
@ -170,8 +172,11 @@ and
values is omitted, it is assumed to be zero, therefore
indicating that no particular quota should be imposed.
Block quotas can be specified in bytes (B), kilobytes (K),
megabytes (M), terabytes (T), pedabytes (P), or exabytes (E).
megabytes (M), terabytes (T), petabytes (P), or exabytes (E).
If no units are specified, kilobytes are assumed.
Inode quotas can be specified in kiloinodes (K),
megainodes (M), terainodes (T), petainodes (P), or exainodes (E).
If no units are specified, the number of inodes specified are used.
.Pp
If invoked with the
.Fl f

View File

@ -158,13 +158,11 @@ main(int argc, char *argv[])
tflag++;
break;
case 'e':
if ((qup = malloc(sizeof(*qup) + BUFSIZ)) == NULL)
if ((qup = calloc(1, sizeof(*qup) + BUFSIZ)) == NULL)
errx(2, "out of memory");
bzero(qup, sizeof(*qup) + BUFSIZ);
i = 0;
oldoptarg = optarg;
for (cp = optarg; (cp = strsep(&optarg, ":")) != NULL;
i++) {
for (i = 0, cp = optarg;
(cp = strsep(&optarg, ":")) != NULL; i++) {
if (cp != oldoptarg)
*(cp - 1) = ':';
switch (i) {
@ -183,12 +181,14 @@ main(int argc, char *argv[])
cvtval(lim, *endpt);
continue;
case 3:
lim = strtoll(cp, &endpt, 10);
qup->dqblk.dqb_isoftlimit =
strtoll(cp, NULL, 10);
cvtval(lim, *endpt);
continue;
case 4:
lim = strtoll(cp, &endpt, 10);
qup->dqblk.dqb_ihardlimit =
strtoll(cp, NULL, 10);
cvtval(lim, *endpt);
continue;
default:
warnx("incorrect quota specification: "
@ -300,10 +300,10 @@ static void
usage(void)
{
fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
"usage: edquota [-u] [-f fspath] [-p username] [-h] username ...",
"usage: edquota [-uh] [-f fspath] [-p username] username ...",
" edquota [-u] -e fspath[:bslim[:bhlim[:islim[:ihlim]]]] [-e ...]",
" username ...",
" edquota -g [-f fspath] [-p groupname] [-h] groupname ...",
" edquota -g [-h] [-f fspath] [-p groupname] groupname ...",
" edquota -g -e fspath[:bslim[:bhlim[:islim[:ihlim]]]] [-e ...]",
" groupname ...",
" edquota [-u] -t [-f fspath]",
@ -536,14 +536,14 @@ writeprivs(struct quotause *quplist, int outfd, char *name, int quotatype)
char *
fmthumanval(int64_t blocks)
{
static char buf[7], numbuf[20];
static char numbuf[20];
if (hflag) {
humanize_number(buf, sizeof(buf) - (blocks < 0 ? 0 : 1),
humanize_number(numbuf, sizeof(numbuf) - (blocks < 0 ? 0 : 1),
dbtob(blocks), "", HN_AUTOSCALE, HN_NOSPACE);
return (buf);
return (numbuf);
}
snprintf(numbuf, 20, "%lluK", dbtokb(blocks));
snprintf(numbuf, sizeof(numbuf), "%lluk", dbtokb(blocks));
return(numbuf);
}
@ -555,9 +555,8 @@ readprivs(struct quotause *quplist, char *inname)
{
struct quotause *qup;
FILE *fd;
u_int64_t ihardlimit, isoftlimit, curinodes;
u_int64_t bhardlimit, bsoftlimit, curblocks;
char bhardunits, bsoftunits, curblockunits;
u_int64_t hardlimit, softlimit, curitems;
char hardunits, softunits, curitemunits;
int cnt;
char *cp;
struct dqblk dqblk;
@ -584,47 +583,66 @@ readprivs(struct quotause *quplist, char *inname)
}
cnt = sscanf(cp,
" in use: %llu%c, limits (soft = %llu%c, hard = %llu%c)",
&curblocks, &curblockunits, &bsoftlimit, &bsoftunits,
&bhardlimit, &bhardunits);
&curitems, &curitemunits, &softlimit, &softunits,
&hardlimit, &hardunits);
/*
* The next three check for old-style input formats.
*/
if (cnt != 6)
cnt = sscanf(cp,
" in use: %llu%c, limits (soft = %llu%c hard = %llu%c",
&curblocks, &curblockunits, &bsoftlimit,
&bsoftunits, &bhardlimit, &bhardunits);
&curitems, &curitemunits, &softlimit,
&softunits, &hardlimit, &hardunits);
if (cnt != 6)
cnt = sscanf(cp,
" in use: %llu%c, limits (soft = %llu%c hard = %llu%c)",
&curblocks, &curblockunits, &bsoftlimit,
&bsoftunits, &bhardlimit, &bhardunits);
&curitems, &curitemunits, &softlimit,
&softunits, &hardlimit, &hardunits);
if (cnt != 6)
cnt = sscanf(cp,
" in use: %llu%c, limits (soft = %llu%c, hard = %llu%c",
&curblocks, &curblockunits, &bsoftlimit,
&bsoftunits, &bhardlimit, &bhardunits);
&curitems, &curitemunits, &softlimit,
&softunits, &hardlimit, &hardunits);
if (cnt != 6) {
warnx("%s:%s: bad format", fsp, cp);
return (0);
}
dqblk.dqb_curblocks = cvtval(curblocks, curblockunits);
dqblk.dqb_bsoftlimit = cvtval(bsoftlimit, bsoftunits);
dqblk.dqb_bhardlimit = cvtval(bhardlimit, bhardunits);
dqblk.dqb_curblocks = cvtval(curitems, curitemunits);
dqblk.dqb_bsoftlimit = cvtval(softlimit, softunits);
dqblk.dqb_bhardlimit = cvtval(hardlimit, hardunits);
if ((cp = strtok(line2, "\n")) == NULL) {
warnx("%s: %s: bad format", fsp, line2);
return (0);
}
cnt = sscanf(cp,
"\tinodes in use: %llu, limits (soft = %llu, hard = %llu)",
&curinodes, &isoftlimit, &ihardlimit);
" in use: %llu%c, limits (soft = %llu%c, hard = %llu%c)",
&curitems, &curitemunits, &softlimit,
&softunits, &hardlimit, &hardunits);
/*
* The next three check for old-style input formats.
*/
if (cnt != 6)
cnt = sscanf(cp,
" in use: %llu%c, limits (soft = %llu%c hard = %llu%c",
&curitems, &curitemunits, &softlimit,
&softunits, &hardlimit, &hardunits);
if (cnt != 6)
cnt = sscanf(cp,
" in use: %llu%c, limits (soft = %llu%c hard = %llu%c)",
&curitems, &curitemunits, &softlimit,
&softunits, &hardlimit, &hardunits);
if (cnt != 6)
cnt = sscanf(cp,
" in use: %llu%c, limits (soft = %llu%c, hard = %llu%c",
&curitems, &curitemunits, &softlimit,
&softunits, &hardlimit, &hardunits);
if (cnt != 3) {
warnx("%s: %s: bad format", fsp, line2);
return (0);
}
dqblk.dqb_curinodes = curinodes;
dqblk.dqb_isoftlimit = isoftlimit;
dqblk.dqb_ihardlimit = ihardlimit;
dqblk.dqb_curinodes = cvtval(curitems, curitemunits);
dqblk.dqb_isoftlimit = cvtval(softlimit, softunits);
dqblk.dqb_ihardlimit = cvtval(hardlimit, hardunits);
for (qup = quplist; qup; qup = qup->next) {
if (strcmp(fsp, qup->fsname))
continue;
@ -651,8 +669,8 @@ readprivs(struct quotause *quplist, char *inname)
qup->dqblk.dqb_isoftlimit = dqblk.dqb_isoftlimit;
qup->dqblk.dqb_ihardlimit = dqblk.dqb_ihardlimit;
qup->flags |= FOUND;
/* No easy way to check change in curblocks */
if (dqblk.dqb_curinodes == qup->dqblk.dqb_curinodes)
if (dqblk.dqb_curblocks == qup->dqblk.dqb_curblocks &&
dqblk.dqb_curinodes == qup->dqblk.dqb_curinodes)
break;
warnx("%s: cannot change current allocation", fsp);
break;
@ -853,8 +871,11 @@ cvtval(u_int64_t limit, char units)
case 'e':
limit *= btodb(1152921504606846976);
break;
case ' ':
errx(2, "No space permitted between value and units\n");
break;
default:
warnx("%llu%c: unknown units, specify K, M, G, T, P, or E\n",
errx(2, "%llu%c: unknown units, specify K, M, G, T, P, or E\n",
limit, units);
break;
}