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); > > } > > > > > >