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

This commit is contained in:
mckusick 2009-02-05 14:06:43 +00:00
parent 21c39c52ce
commit be3f4e53a7
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;
}