Module Name: src Committed By: christos Date: Wed Sep 18 20:14:44 UTC 2019
Modified Files: src/bin/df: df.1 df.c Log Message: Print the wedge name with -W instead of mntfrom To generate a diff of this commit: cvs rdiff -u -r1.49 -r1.50 src/bin/df/df.1 cvs rdiff -u -r1.93 -r1.94 src/bin/df/df.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/bin/df/df.1 diff -u src/bin/df/df.1:1.49 src/bin/df/df.1:1.50 --- src/bin/df/df.1:1.49 Sun Aug 26 19:34:52 2018 +++ src/bin/df/df.1 Wed Sep 18 16:14:44 2019 @@ -1,4 +1,4 @@ -.\" $NetBSD: df.1,v 1.49 2018/08/26 23:34:52 sevan Exp $ +.\" $NetBSD: df.1,v 1.50 2019/09/18 20:14:44 christos Exp $ .\" .\" Copyright (c) 1989, 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" @(#)df.1 8.2 (Berkeley) 1/13/92 .\" -.Dd August 27, 2018 +.Dd September 18, 2019 .Dt DF 1 .Os .Sh NAME @@ -37,7 +37,7 @@ .Nd display free disk space .Sh SYNOPSIS .Nm -.Op Fl agln +.Op Fl aglnW .Op Fl Ghkm | Fl ihkm | Fl Pk .Op Fl t Ar type .Op Ar file | Ar file_system ... @@ -172,6 +172,12 @@ be taken. If a file system is given on the command line that is not of the specified type, a warning is issued and no information is given on that file system. +.It Fl W +Print the wedge name instead of the mounted from device for wedges. +The wedge name is prefixed with +.Dq NAME= +as in +.Xr fstab 5 . .El .Sh ENVIRONMENT .Bl -tag -width BLOCKSIZE Index: src/bin/df/df.c diff -u src/bin/df/df.c:1.93 src/bin/df/df.c:1.94 --- src/bin/df/df.c:1.93 Sun Aug 26 19:34:52 2018 +++ src/bin/df/df.c Wed Sep 18 16:14:44 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: df.c,v 1.93 2018/08/26 23:34:52 sevan Exp $ */ +/* $NetBSD: df.c,v 1.94 2019/09/18 20:14:44 christos Exp $ */ /* * Copyright (c) 1980, 1990, 1993, 1994 @@ -45,17 +45,20 @@ __COPYRIGHT( #if 0 static char sccsid[] = "@(#)df.c 8.7 (Berkeley) 4/2/94"; #else -__RCSID("$NetBSD: df.c,v 1.93 2018/08/26 23:34:52 sevan Exp $"); +__RCSID("$NetBSD: df.c,v 1.94 2019/09/18 20:14:44 christos Exp $"); #endif #endif /* not lint */ #include <sys/param.h> #include <sys/stat.h> #include <sys/mount.h> +#include <sys/disk.h> +#include <sys/ioctl.h> #include <assert.h> #include <err.h> #include <errno.h> +#include <stdbool.h> #include <fcntl.h> #include <locale.h> #include <util.h> @@ -66,15 +69,17 @@ __RCSID("$NetBSD: df.c,v 1.93 2018/08/26 #include <util.h> static char *getmntpt(const char *); -static void prtstat(struct statvfs *, int); +static void prtstat(const struct dkwedge_info *, const struct statvfs *, + int); static int selected(const char *, size_t); static void maketypelist(char *); static size_t regetmntinfo(struct statvfs **, size_t); __dead static void usage(void); +static struct dkwedge_info *getwedgeinfo(const struct statvfs *, size_t); static void prthumanval(int64_t, const char *); -static void prthuman(struct statvfs *, int64_t, int64_t); +static void prthuman(const struct statvfs *, int64_t, int64_t); -static int aflag, gflag, hflag, iflag, lflag, nflag, Pflag; +static int aflag, gflag, hflag, iflag, lflag, nflag, Pflag, Wflag; static long usize; static char **typelist; @@ -83,14 +88,15 @@ main(int argc, char *argv[]) { struct stat stbuf; struct statvfs *mntbuf; - long mntsize; - int ch, i, maxwidth, width; + struct dkwedge_info *wedge_info; + int ch, maxwidth, width; + size_t i, mntcount; char *mntpt; setprogname(argv[0]); (void)setlocale(LC_ALL, ""); - while ((ch = getopt(argc, argv, "aGghiklmnPt:")) != -1) + while ((ch = getopt(argc, argv, "aGghiklmnPt:W")) != -1) switch (ch) { case 'a': aflag = 1; @@ -126,6 +132,9 @@ main(int argc, char *argv[]) case 'P': Pflag = 1; break; + case 'W': + Wflag = 1; + break; case 't': if (typelist != NULL) errx(EXIT_FAILURE, @@ -154,17 +163,17 @@ main(int argc, char *argv[]) argc -= optind; argv += optind; - mntsize = getmntinfo(&mntbuf, MNT_NOWAIT); - if (mntsize == 0) + mntcount = getmntinfo(&mntbuf, MNT_NOWAIT); + if (mntcount == 0) err(EXIT_FAILURE, "retrieving information on mounted file systems"); if (*argv == NULL) { - mntsize = regetmntinfo(&mntbuf, mntsize); + mntcount = regetmntinfo(&mntbuf, mntcount); } else { - if ((mntbuf = malloc(argc * sizeof(*mntbuf))) == NULL) + if ((mntbuf = calloc(argc, sizeof(*mntbuf))) == NULL) err(EXIT_FAILURE, "can't allocate statvfs array"); - mntsize = 0; + mntcount = 0; for (/*EMPTY*/; *argv != NULL; argv++) { if (stat(*argv, &stbuf) < 0) { if ((mntpt = getmntpt(*argv)) == 0) { @@ -180,46 +189,50 @@ main(int argc, char *argv[]) * Statfs does not take a `wait' flag, so we cannot * implement nflag here. */ - if (!statvfs(mntpt, &mntbuf[mntsize])) + if (!statvfs(mntpt, &mntbuf[mntcount])) if (lflag && - (mntbuf[mntsize].f_flag & MNT_LOCAL) == 0) + (mntbuf[mntcount].f_flag & MNT_LOCAL) == 0) warnx("Warning: %s is not a local %s", *argv, "file system"); else if - (!selected(mntbuf[mntsize].f_fstypename, - sizeof(mntbuf[mntsize].f_fstypename))) + (!selected(mntbuf[mntcount].f_fstypename, + sizeof(mntbuf[mntcount].f_fstypename))) warnx("Warning: %s mounted as a %s %s", *argv, - mntbuf[mntsize].f_fstypename, + mntbuf[mntcount].f_fstypename, "file system"); else - ++mntsize; + ++mntcount; else warn("%s", *argv); } } + wedge_info = Wflag ? getwedgeinfo(mntbuf, mntcount) : NULL; + maxwidth = 0; - for (i = 0; i < mntsize; i++) { - width = (int)strlen(mntbuf[i].f_mntfromname); + for (i = 0; i < mntcount; i++) { + width = (int)strlen(Wflag && wedge_info[i].dkw_wname[0] ? + (const char *)wedge_info[i].dkw_wname : + mntbuf[i].f_mntfromname); if (width > maxwidth) maxwidth = width; } - for (i = 0; i < mntsize; i++) - prtstat(&mntbuf[i], maxwidth); + for (i = 0; i < mntcount; i++) + prtstat(&wedge_info[i], &mntbuf[i], maxwidth); return 0; } static char * getmntpt(const char *name) { - size_t mntsize, i; + size_t mntcount, i; struct statvfs *mntbuf; - mntsize = getmntinfo(&mntbuf, MNT_NOWAIT); - if (mntsize == 0) + mntcount = getmntinfo(&mntbuf, MNT_NOWAIT); + if (mntcount == 0) err(EXIT_FAILURE, "Can't get mount information"); - for (i = 0; i < mntsize; i++) { + for (i = 0; i < mntcount; i++) { if (!strcmp(mntbuf[i].f_mntfromname, name)) return mntbuf[i].f_mntonname; } @@ -268,7 +281,7 @@ maketypelist(char *fslist) ++nextcp; /* Build an array of that many types. */ - if ((av = typelist = malloc((i + 1) * sizeof(*av))) == NULL) + if ((av = typelist = calloc((i + 1), sizeof(*av))) == NULL) err(EXIT_FAILURE, "can't allocate type array"); av[0] = fslist; for (i = 1, nextcp = fslist; @@ -280,23 +293,50 @@ maketypelist(char *fslist) av[i] = NULL; } +static struct dkwedge_info * +getwedgeinfo(const struct statvfs *mntbuf, size_t mntcount) +{ + struct dkwedge_info *wi = calloc(mntcount, sizeof(*wi)); + char buf[1024]; + + if (wi == NULL) + err(EXIT_FAILURE, "can't allocate wedge info array"); + + for (size_t i = 0; i < mntcount; i++) { + const char *dname = mntbuf[i].f_mntfromname; + const char *rdn = strrchr(dname, '/'); + if (rdn == NULL) { + continue; + } + rdn++; + int fd = opendisk(rdn, O_RDONLY, buf, sizeof(buf), false); + if (fd == -1) + err(EXIT_FAILURE, "opendisk on `%s' failed", rdn); + if (ioctl(fd, DIOCGWEDGEINFO, &wi[i]) == -1) { + warn("DIOCGWEDGEINFO for `%s' failed", buf); + } + close(fd); + } + return wi; +} + /* * Make a pass over the filesystem info in ``mntbuf'' filtering out * filesystem types not in ``fsmask'' and possibly re-stating to get * current (not cached) info. Returns the new count of valid statvfs bufs. */ static size_t -regetmntinfo(struct statvfs **mntbufp, size_t mntsize) +regetmntinfo(struct statvfs **mntbufp, size_t mntcount) { size_t i, j; struct statvfs *mntbuf; if (!lflag && typelist == NULL && aflag) - return nflag ? mntsize : (size_t)getmntinfo(mntbufp, MNT_WAIT); + return nflag ? mntcount : (size_t)getmntinfo(mntbufp, MNT_WAIT); mntbuf = *mntbufp; j = 0; - for (i = 0; i < mntsize; i++) { + for (i = 0; i < mntcount; i++) { if (!aflag && (mntbuf[i].f_flag & MNT_IGNORE) != 0) continue; if (lflag && (mntbuf[i].f_flag & MNT_LOCAL) == 0) @@ -335,7 +375,7 @@ prthumanval(int64_t bytes, const char *p } static void -prthuman(struct statvfs *sfsp, int64_t used, int64_t bavail) +prthuman(const struct statvfs *sfsp, int64_t used, int64_t bavail) { prthumanval((int64_t)(sfsp->f_blocks * sfsp->f_frsize), " "); @@ -356,7 +396,8 @@ prthuman(struct statvfs *sfsp, int64_t u * Print out status about a filesystem. */ static void -prtstat(struct statvfs *sfsp, int maxwidth) +prtstat(const struct dkwedge_info *dkwp, const struct statvfs *sfsp, + int maxwidth) { static long blocksize; static int headerlen, timesthrough; @@ -366,6 +407,14 @@ prtstat(struct statvfs *sfsp, int maxwid int64_t used, availblks, inodes; int64_t bavail; char pb[64]; + char mntfromname[sizeof(sfsp->f_mntfromname)]; + + if (Wflag && dkwp->dkw_wname[0]) { + snprintf(mntfromname, sizeof(mntfromname), "NAME=%s", + (const char *)dkwp->dkw_wname); + } else { + strlcpy(mntfromname, sfsp->f_mntfromname, sizeof(mntfromname)); + } if (gflag) { /* @@ -378,7 +427,7 @@ prtstat(struct statvfs *sfsp, int maxwid * */ (void)printf("%10s (%-12s): %7ld block size %12ld frag size\n", - sfsp->f_mntonname, sfsp->f_mntfromname, + sfsp->f_mntonname, mntfromname, sfsp->f_bsize, /* On UFS/FFS systems this is * also called the "optimal * transfer block size" but it @@ -469,7 +518,7 @@ prtstat(struct statvfs *sfsp, int maxwid * <file system root> */ (void)printf("%s %" PRId64 " %" PRId64 " %" PRId64 " %s%% %s\n", - sfsp->f_mntfromname, + mntfromname, fsbtoblk(sfsp->f_blocks, sfsp->f_frsize, blocksize), fsbtoblk(used, sfsp->f_frsize, blocksize), fsbtoblk(bavail, sfsp->f_frsize, blocksize), @@ -484,7 +533,7 @@ prtstat(struct statvfs *sfsp, int maxwid return; } - (void)printf("%-*.*s ", maxwidth, maxwidth, sfsp->f_mntfromname); + (void)printf("%-*.*s ", maxwidth, maxwidth, mntfromname); if (hflag) prthuman(sfsp, used, bavail); @@ -512,7 +561,7 @@ usage(void) { (void)fprintf(stderr, - "Usage: %s [-agln] [-Ghkm|-ihkm|-Pk] [-t type] [file | " + "Usage: %s [-aglnW] [-Ghkm|-ihkm|-Pk] [-t type] [file | " "file_system ...]\n", getprogname()); exit(1);