Date: Tue, 25 Sep 2001 18:27:34 +0400 (MSD) From: Dmitry Morozovsky <marck@rinet.ru> To: FreeBSD-gnats-submit@freebsd.org Subject: bin/30816: usr.sbin/edquota new option [-f] Message-ID: <200109251427.f8PERYu64954@woozle.rinet.ru>
next in thread | raw e-mail | index | archive | help
>Number: 30816
>Category: bin
>Synopsis: usr.sbin/edquota new option [-f]
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Tue Sep 25 07:30:00 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator: Dmitry Morozovsky
>Release: FreeBSD 4.4-RC i386 (RELENG_4 various)
>Organization:
Cronyx Plus LLC
>Environment:
>Description:
Adding new filesystem to the existing system with enabled quotas may produce
problems with distributing quotas for existing user accounts on new filesystem.
Although edquota has option -p, it's virtually impossible to set quotas
on the filesystem created.
Solution would look as proposed: add `-f fspath' option to edquota to
restrict editable (or distributable via -p) filesystem list to single
filesystem. It look reasonable to specify fs either via special device or
via mountpoint path.
>How-To-Repeat:
Sample (real) situation: system with enabled quotas, mainly equal for all users,
but with some exceptions. New disk added, new filesystem created and mounted
Proto-user quotas has beed edited to reflect new usual needs. However, there's
no simple way to distribute this value for each of users of particular
UID range.
With -f functionality, it's rather simple (given fs mount to /ar2, proto uid is 5000, uid range is 5001-5999):
edquota -p 5000 -f /ar2 5001-5999
>Fix:
Index: edquota.8
===================================================================
RCS file: /home/ncvs/src/usr.sbin/edquota/edquota.8,v
retrieving revision 1.9.2.1
diff -u -r1.9.2.1 edquota.8
--- edquota.8 2000/12/08 15:28:04 1.9.2.1
+++ edquota.8 2001/09/24 18:19:51
@@ -44,18 +44,22 @@
.Sh SYNOPSIS
.Nm
.Op Fl u
+.Op Fl f Ar fspath
.Op Fl p Ar proto-username
.Ar username ...
.Nm
.Fl g
+.Op Fl f Ar fspath
.Op Fl p Ar proto-groupname
.Ar groupname ...
.Nm
.Fl t
.Op Fl u
+.Op Fl f Ar fspath
.Nm
.Fl t
.Fl g
+.Op Fl f Ar fspath
.Sh DESCRIPTION
.Nm Edquota
is a quota editor.
@@ -90,6 +94,15 @@
below).
The current usage information in the file is for informational purposes;
only the hard and soft limits can be changed.
+.Pp
+If the
+.Fl f
+option is specified,
+.Nm
+reads and edits quotas only for specified fylesystem. Parameter to
+.Fl f
+option may be either special device or mount point of the filesystem
+selected.
.Pp
On leaving the editor,
.Nm
Index: edquota.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/edquota/edquota.c,v
retrieving revision 1.9.2.1
diff -u -r1.9.2.1 edquota.c
--- edquota.c 2000/10/28 02:22:59 1.9.2.1
+++ edquota.c 2001/09/24 18:19:51
@@ -89,7 +89,7 @@
int editit __P((char *));
void freeprivs __P((struct quotause *));
int getentry __P((char *, int));
-struct quotause *getprivs __P((long, int));
+struct quotause *getprivs __P((long, int, char *));
int hasquota __P((struct fstab *, int, char **));
void putprivs __P((long, int, struct quotause *));
int readprivs __P((struct quotause *, char *));
@@ -109,6 +109,7 @@
register uid_t startuid, enduid;
char *protoname, *cp, ch;
int tflag = 0, pflag = 0;
+ char *fspath = NULL;
char buf[30];
if (argc < 2)
@@ -116,8 +117,11 @@
if (getuid())
errx(1, "permission denied");
quotatype = USRQUOTA;
- while ((ch = getopt(argc, argv, "ugtp:")) != -1) {
+ while ((ch = getopt(argc, argv, "ugtf:p:")) != -1) {
switch(ch) {
+ case 'f':
+ fspath = optarg;
+ break;
case 'p':
protoname = optarg;
pflag++;
@@ -140,7 +144,7 @@
if (pflag) {
if ((protoid = getentry(protoname, quotatype)) == -1)
exit(1);
- protoprivs = getprivs(protoid, quotatype);
+ protoprivs = getprivs(protoid, quotatype, fspath);
for (qup = protoprivs; qup; qup = qup->next) {
qup->dqblk.dqb_btime = 0;
qup->dqblk.dqb_itime = 0;
@@ -173,7 +177,7 @@
tmpfd = mkstemp(tmpfil);
fchown(tmpfd, getuid(), getgid());
if (tflag) {
- protoprivs = getprivs(0, quotatype);
+ protoprivs = getprivs(0, quotatype, fspath);
if (writetimes(protoprivs, tmpfd, quotatype) == 0)
exit(1);
if (editit(tmpfil) && readtimes(protoprivs, tmpfil))
@@ -186,7 +190,7 @@
for ( ; argc > 0; argc--, argv++) {
if ((id = getentry(*argv, quotatype)) == -1)
continue;
- curprivs = getprivs(id, quotatype);
+ curprivs = getprivs(id, quotatype, fspath);
if (writeprivs(curprivs, tmpfd, *argv, quotatype) == 0)
continue;
if (editit(tmpfil) && readprivs(curprivs, tmpfil))
@@ -202,10 +206,10 @@
usage()
{
fprintf(stderr, "%s\n%s\n%s\n%s\n",
- "usage: edquota [-u] [-p username] username ...",
- " edquota -g [-p groupname] groupname ...",
- " edquota [-u] -t",
- " edquota -g -t");
+ "usage: edquota [-u] [-f fspath] [-p username] username ...",
+ " edquota -g [-f fspath] [-p groupname] groupname ...",
+ " edquota [-u] -t [-f fspath]",
+ " edquota -g -t [-f fspath]");
exit(1);
}
@@ -247,9 +251,10 @@
* Collect the requested quota information.
*/
struct quotause *
-getprivs(id, quotatype)
+getprivs(id, quotatype, fspath)
register long id;
int quotatype;
+ char *fspath;
{
register struct fstab *fs;
register struct quotause *qup, *quptail;
@@ -262,6 +267,9 @@
quphead = (struct quotause *)0;
qcmd = QCMD(Q_GETQUOTA, quotatype);
while ((fs = getfsent())) {
+ if (fspath && *fspath && strcmp(fspath, fs->fs_spec) &&
+ strcmp(fspath, fs->fs_file))
+ continue;
if (strcmp(fs->fs_vfstype, "ufs"))
continue;
if (!hasquota(fs, quotatype, &qfpathname))
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200109251427.f8PERYu64954>
