From owner-freebsd-standards Mon Apr 22 16: 5:44 2002 Delivered-To: freebsd-standards@freebsd.org Received: from treetop.robbins.dropbear.id.au (218.a.005.mel.iprimus.net.au [210.50.40.218]) by hub.freebsd.org (Postfix) with ESMTP id 9727137B507 for ; Mon, 22 Apr 2002 15:52:18 -0700 (PDT) Received: from treetop.robbins.dropbear.id.au (localhost [127.0.0.1]) by treetop.robbins.dropbear.id.au (8.12.2/8.12.2) with ESMTP id g3M7ooi1037883 for ; Mon, 22 Apr 2002 17:50:51 +1000 (EST) (envelope-from tim@treetop.robbins.dropbear.id.au) Received: (from tim@localhost) by treetop.robbins.dropbear.id.au (8.12.2/8.12.2/Submit) id g3M7omVH037882 for freebsd-standards@FreeBSD.ORG; Mon, 22 Apr 2002 17:50:49 +1000 (EST) Date: Mon, 22 Apr 2002 17:50:47 +1000 From: "Tim J. Robbins" To: freebsd-standards@FreeBSD.ORG Subject: df -t option Message-ID: <20020422175047.A37860@treetop.robbins.dropbear.id.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i Sender: owner-freebsd-standards@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG I've attached a patch that adds the XSI df -t option, but with a twist: it uses -T because we already have a -t. The output format is modelled after the Solaris output format, but uses the minimum field width possible like BSD df usually does. As I see it, we have three ways of attacking the problem of the conflicting -t option: a) Scrap support for our current `-t type' option in favour of the standard b) Support -t with and without arguments via some heuristics c) Add it as -T and document that fact I'm leaning towards (c), but I'd be interested to hear what others think, or whether there's a better way to solve the problem. Tim Index: df.1 =================================================================== RCS file: /home/ncvs/src/bin/df/df.1,v retrieving revision 1.26 diff -u -r1.26 df.1 --- df.1 2002/04/16 20:00:45 1.26 +++ df.1 2002/04/22 08:45:15 @@ -32,7 +32,7 @@ .\" @(#)df.1 8.3 (Berkeley) 5/8/95 .\" $FreeBSD: src/bin/df/df.1,v 1.26 2002/04/16 20:00:45 charnier Exp $ .\" -.Dd May 8, 1995 +.Dd April 22, 2002 .Dt DF 1 .Os .Sh NAME @@ -44,7 +44,7 @@ .Fl b | h | H | k | .Fl m | P .Oc -.Op Fl ailn +.Op Fl ailnT .Op Fl t Ar type .Op Ar file | filesystem ... .Sh DESCRIPTION @@ -114,6 +114,13 @@ Note that this overrides the .Ev BLOCKSIZE specification from the environment. +.It Fl T +Print information about the number of blocks and files (inodes) in use +and available. When +.Fl T +is specified, the presence of +.Fl h +is ignored. .It Fl t Only print out statistics for filesystems of the specified types. More than one type may be specified in a comma separated list. @@ -145,12 +152,6 @@ .Ev BLOCKSIZE is set, the block counts will be displayed in units of that size block. .El -.Sh BUGS -The -.Fl n -and -.Fl t -flags are ignored if a file or filesystem is specified. .Sh SEE ALSO .Xr lsvfs 1 , .Xr quota 1 , @@ -161,8 +162,28 @@ .Xr fstab 5 , .Xr mount 8 , .Xr quot 8 +.Sh STANDARDS +The +.Nm +utility conforms to +.St -p1003.1-2001 . +Due to a conflict with the existing +.Bx +.Nm +.Fl t +option, the +.Tn XSI +.Fl t +option is present as +.Fl T . .Sh HISTORY A .Nm command appeared in .At v1 . +.Sh BUGS +The +.Fl n +and +.Fl t +flags are ignored if a file or filesystem is specified. Index: df.c =================================================================== RCS file: /home/ncvs/src/bin/df/df.c,v retrieving revision 1.37 diff -u -r1.37 df.c --- df.c 2002/03/26 20:32:37 1.37 +++ df.c 2002/04/22 08:45:17 @@ -93,10 +93,12 @@ /* Maximum widths of various fields. */ struct maxwidths { + int mnton; int mntfrom; int total; int used; int avail; + int itotal; int iused; int ifree; }; @@ -117,14 +119,16 @@ char **makevfslist(char *); void prthuman(struct statfs *, long); void prthumanval(double); +void prt(struct statfs *, struct maxwidths *); void prtstat(struct statfs *, struct maxwidths *); +void prttot(struct statfs *, struct maxwidths *); long regetmntinfo(struct statfs **, long, char **); int ufs_df(char *, struct maxwidths *); unit_t unit_adjust(double *); void update_maxwidths(struct maxwidths *, struct statfs *); void usage(void); -int aflag = 0, hflag, iflag, nflag; +int aflag = 0, hflag, iflag, nflag, Tflag; struct ufs_args mdev; static __inline int imax(int a, int b) @@ -146,7 +150,7 @@ fstype = "ufs"; vfslist = NULL; - while ((ch = getopt(argc, argv, "abgHhiklmnPt:")) != -1) + while ((ch = getopt(argc, argv, "abgHhiklmnPTt:")) != -1) switch (ch) { case 'a': aflag = 1; @@ -188,6 +192,9 @@ case 'n': nflag = 1; break; + case 'T': + Tflag = 1; + break; case 't': if (vfslist != NULL) errx(1, "only one -t option may be specified"); @@ -216,7 +223,7 @@ } for (i = 0; i < mntsize; i++) { if (aflag || (mntbuf[i].f_flags & MNT_IGNORE) == 0) - prtstat(&mntbuf[i], &maxwidths); + prt(&mntbuf[i], &maxwidths); } exit(rv); } @@ -252,7 +259,7 @@ continue; } else if (statfs(mntpt, &statfsbuf) == 0) { statfsbuf.f_mntonname[0] = '\0'; - prtstat(&statfsbuf, &maxwidths); + prt(&statfsbuf, &maxwidths); } else { warn("%s", *argv); rv = 1; @@ -277,7 +284,7 @@ bzero(&maxwidths, sizeof(maxwidths)); update_maxwidths(&maxwidths, &statfsbuf); } - prtstat(&statfsbuf, &maxwidths); + prt(&statfsbuf, &maxwidths); } return (rv); } @@ -383,6 +390,18 @@ (num) / ((bs) / (fsbs)) : (num) * ((fsbs) / (bs))) /* + * Print out status in requested format. + */ +void +prt(struct statfs *sfsp, struct maxwidths *mwp) +{ + if (!Tflag) + prtstat(sfsp, mwp); + else + prttot(sfsp, mwp); +} + +/* * Print out status about a filesystem. */ void @@ -442,6 +461,36 @@ } /* + * Print out total allocated-space figures for filesystem (-T option). + */ +void +prttot(struct statfs *sfsp, struct maxwidths *mwp) +{ + static long blocksize; + static int timesthrough; + int bwidth, dummy, fwidth; + + if (blocksize == 0) + (void)getbsize(&dummy, &blocksize); + + if (++timesthrough == 1) + mwp->mntfrom = imax(mwp->mntfrom, strlen("total")); + + bwidth = imax(mwp->used, mwp->total); + fwidth = imax(mwp->iused, mwp->itotal); + + (void)printf("%-*s (%-*s): %*ld blocks %*ld files\n", + mwp->mnton, sfsp->f_mntonname, mwp->mntfrom, sfsp->f_mntfromname, + bwidth, fsbtoblk(sfsp->f_blocks - sfsp->f_bfree, sfsp->f_bsize, + blocksize), fwidth, sfsp->f_files - sfsp->f_ffree); + (void)printf("%-*s %*s: %*ld blocks %*ld files\n", + mwp->mnton, "", mwp->mntfrom, "total", bwidth, + fsbtoblk(sfsp->f_blocks, sfsp->f_bsize, blocksize), fwidth, + sfsp->f_files); +} + + +/* * Update the maximum field-width information in `mwp' based on * the filesystem specified by `sfsp'. */ @@ -454,6 +503,7 @@ if (blocksize == 0) getbsize(&dummy, &blocksize); + mwp->mnton = imax(mwp->mnton, strlen(sfsp->f_mntonname)); mwp->mntfrom = imax(mwp->mntfrom, strlen(sfsp->f_mntfromname)); mwp->total = imax(mwp->total, longwidth(fsbtoblk(sfsp->f_blocks, sfsp->f_bsize, blocksize))); @@ -461,6 +511,7 @@ sfsp->f_bfree, sfsp->f_bsize, blocksize))); mwp->avail = imax(mwp->avail, longwidth(fsbtoblk(sfsp->f_bavail, sfsp->f_bsize, blocksize))); + mwp->itotal = imax(mwp->itotal, longwidth(sfsp->f_files)); mwp->iused = imax(mwp->iused, longwidth(sfsp->f_files - sfsp->f_ffree)); mwp->ifree = imax(mwp->ifree, longwidth(sfsp->f_ffree)); @@ -536,7 +587,7 @@ mntpt = ""; memmove(&sfsp->f_mntonname[0], mntpt, (size_t)MNAMELEN); memmove(&sfsp->f_mntfromname[0], file, (size_t)MNAMELEN); - prtstat(sfsp, mwp); + prt(sfsp, mwp); (void)close(rfd); return (0); } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-standards" in the body of the message