On Sat, 2021-01-23 at 20:37 +1100, Jonathan Gray wrote:
> On Fri, Jan 22, 2021 at 11:11:27PM -0600, Katherine Rohl wrote:
> > I noticed that large disk volumes cause problems with the formatting of
> > numerical columns in df(1), particularly when using -i. Here's a patch
> > that pads out their width a bit and raises the maximum width of
> > numerical columns before fields start running into each other.
> >
> > I also added support for the -T argument, which is present in many
> > other df(1) implementations and shows the filesystem's type.
>
> The type is already available in the output of mount(8). Flags being
> available elsewhere isn't normally a good reason to add them here.
Hmm, that's fair. I was thinking about it increasing the
portability of scripts that rely on the -T option between BSDs
after running into that issue recently.
>
> >
> > POSIX-style -P output is not affected by this since it has a specific
> > format. The affected flags don't support -P anyway.
> >
> > I believe this follows the KNF style (at least that's what my editor
> > says) but if there are any problems please let me know.
>
> Your mail client has line wrapped the patch. If you can disable that
> for future patches it would make them easier to apply.
Ah, apologies. I thought I had disabled this in my client.
>
> >
> > diff --git bin/df/df.1 bin/df/df.1
> > index 89dd51aac8d..4a9a549c492 100644
> > --- bin/df/df.1
> > +++ bin/df/df.1
> > @@ -100,6 +100,10 @@ with the possibly stale statistics that were
> > previously obtained.
> > .It Fl P
> > Print out information in a stricter format designed to be parsed
> > by portable scripts.
> > +.It Fl T
> > +Include the filesystem type. This option is incompatible with the
> > +.Fl P
> > +option.
> > .It Fl t Ar type
> > Indicate the actions should only be taken on
> > file systems of the specified
> > diff --git bin/df/df.c bin/df/df.c
> > index fd51f906f89..427d774e802 100644
> > --- bin/df/df.c
> > +++ bin/df/df.c
> > @@ -63,7 +63,7 @@ extern int e2fs_df(int, char *, struct statfs
> > *);
> > extern int ffs_df(int, char *, struct statfs *);
> > static int raw_df(char *, struct statfs *);
> >
> > -int hflag, iflag, kflag, lflag, nflag, Pflag;
> > +int hflag, iflag, kflag, lflag, nflag, Pflag, Tflag;
> > char **typelist = NULL;
> >
> > int
> > @@ -79,7 +79,7 @@ main(int argc, char *argv[])
> > if (pledge("stdio rpath", NULL) == -1)
> > err(1, "pledge");
> >
> > - while ((ch = getopt(argc, argv, "hiklnPt:")) != -1)
> > + while ((ch = getopt(argc, argv, "hiklnPTt:")) != -1)
> > switch (ch) {
> > case 'h':
> > hflag = 1;
> > @@ -106,14 +106,17 @@ main(int argc, char *argv[])
> > errx(1, "only one -t option may be
> > specified.");
> > maketypelist(optarg);
> > break;
> > + case 'T':
> > + Tflag = 1;
> > + break;
> > default:
> > usage();
> > }
> > argc -= optind;
> > argv += optind;
> >
> > - if ((iflag || hflag) && Pflag) {
> > - warnx("-h and -i are incompatible with -P");
> > + if ((iflag || hflag || Tflag) && Pflag) {
> > + warnx("-h, -i, and -T are incompatible with -P");
> > usage();
> > }
> >
> > @@ -159,13 +162,17 @@ main(int argc, char *argv[])
> > }
> >
> > if (mntsize) {
> > - maxwidth = 11;
> > + maxwidth = 13;
> > for (i = 0; i < mntsize; i++) {
> > width = strlen(mntbuf[i].f_mntfromname);
> > if (width > maxwidth)
> > maxwidth = width;
> > + if (Tflag) {
> > + width =
> > strlen(mntbuf[i].f_fstypename);
> > + if (width > maxwidth)
> > + maxwidth = width;
> > + }
> > }
> > -
> > if (Pflag)
> > posixprint(mntbuf, mntsize, maxwidth);
> > else
> > @@ -189,6 +196,20 @@ getmntpt(char *name)
> > return (0);
> > }
> >
> > +char *
> > +getfsname(char *name)
> > +{
> > + long mntsize, i;
> > + struct statfs *mntbuf;
> > +
> > + mntsize = getmntinfo(&mntbuf, MNT_NOWAIT);
> > + for (i = 0; i < mntsize; i++) {
> > + if (!strcmp(mntbuf[i].f_mntfromname, name))
> > + return (mntbuf[i].f_fstypename);
> > + }
> > + return (0);
> > +}
> > +
> > static enum { IN_LIST, NOT_IN_LIST } which;
> >
> > static int
> > @@ -319,20 +340,23 @@ prtstat(struct statfs *sfsp, int maxwidth, int
> > headerlen, int blocksize)
> > if (hflag)
> > prthuman(sfsp, used);
> > else
> > - (void)printf(" %*llu %9llu %9lld", headerlen,
> > + (void)printf(" %*llu %10llu %10lld", headerlen,
> > fsbtoblk(sfsp->f_blocks, sfsp->f_bsize,
> > blocksize),
> > fsbtoblk(used, sfsp->f_bsize, blocksize),
> > fsbtoblk(sfsp->f_bavail, sfsp->f_bsize,
> > blocksize));
> > (void)printf(" %5.0f%%",
> > availblks == 0 ? 100.0 : (double)used / (double)availblks
> > * 100.0);
> > + if (Tflag) {
> > + (void)printf(" %4s", sfsp->f_fstypename);
> > + }
> > if (iflag) {
> > inodes = sfsp->f_files;
> > used = inodes - sfsp->f_ffree;
> > - (void)printf(" %7llu %7llu %5.0f%% ", used, sfsp-
> > > f_ffree,
> > + (void)printf(" %9llu %9llu %5.0f%% ", used, sfsp-
> > > f_ffree,
> > inodes == 0 ? 100.0 : (double)used / (double)inodes
> > * 100.0);
> > } else
> > (void)printf(" ");
> > - (void)printf(" %s\n", sfsp->f_mntonname);
> > + (void)printf(" %s\n", sfsp->f_mntonname);
> > }
> >
> > /*
> > @@ -359,12 +383,14 @@ bsdprint(struct statfs *mntbuf, long mntsize, int
> > maxwidth)
> > headerlen = strlen(header);
> > } else
> > header = getbsize(&headerlen, &blocksize);
> > - (void)printf("%-*.*s %s Used Avail Capacity",
> > + (void)printf("%-*.*s %s Used Avail
> > Capacity",
> > maxwidth, maxwidth, "Filesystem",
> > header);
> > }
> > + if (Tflag)
> > + (void)printf(" Type ");
> > if (iflag)
> > - (void)printf(" iused ifree %%iused");
> > - (void)printf(" Mounted on\n");
> > + (void)printf(" iused ifree %%iused ");
> > + (void)printf(" Mounted on\n");
> >
> >
> > for (i = 0; i < mntsize; i++)
> > @@ -455,7 +481,7 @@ static __dead void
> > usage(void)
> > {
> > (void)fprintf(stderr,
> > - "usage: %s [-hiklnP] [-t type] [[file | file_system]
> > ...]\n",
> > + "usage: %s [-hiklnPT] [-t type] [[file | file_system]
> > ...]\n",
> > getprogname());
> > exit(1);
> > }
> >
> >
> >