Module Name:    src
Committed By:   kre
Date:           Sat Aug  3 05:27:58 UTC 2024

Modified Files:
        src/bin/df: df.1 df.c

Log Message:
Add -M and -q options to df(1).

-q suppresses warning output (rather than redirecting stderr, which
also buries error messages, which -q does not).

-M requires each arg given to be the name of a mount point, and
issues a warning, and ignores the arg, if it is not.   This allows
scripts (etc) to have a whole list of places for which to produce df
output, while only listing the ones that are actually mounted (rather
than simply listing the filesystem containing the mount point instead -
perhaps several times).  (If there are no args, -M is a no-op).

If the options aren't given, nothing alters.


To generate a diff of this commit:
cvs rdiff -u -r1.59 -r1.60 src/bin/df/df.1
cvs rdiff -u -r1.102 -r1.103 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.59 src/bin/df/df.1:1.60
--- src/bin/df/df.1:1.59	Sat Aug  3 04:04:54 2024
+++ src/bin/df/df.1	Sat Aug  3 05:27:58 2024
@@ -1,4 +1,4 @@
-.\" $NetBSD: df.1,v 1.59 2024/08/03 04:04:54 kre Exp $
+.\" $NetBSD: df.1,v 1.60 2024/08/03 05:27:58 kre 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 8, 2022
+.Dd August 3, 2024
 .Dt DF 1
 .Os
 .Sh NAME
@@ -37,7 +37,7 @@
 .Nd display free disk space
 .Sh SYNOPSIS
 .Nm
-.Op Fl aclnW
+.Op Fl aclMnqW
 .Op Fl G | Fl bkP | Fl bfgHhikmN
 .Op Fl t Ar type
 .Oo Ar file | Ar file_system Oc Ns ...
@@ -173,6 +173,23 @@ Display statistics only about mounted fi
 flag set.
 If a non-local file system is given as an argument, a
 warning is issued and no information is given on that file system.
+.It Fl M
+Each
+.Ar file
+.Pq or Ar file_system
+specified as an argument must give a path to a mount point
+in the tree, at which a file system is currently mounted.
+Information for that mounted file system is, if not otherwise
+excluded, provided.
+If a
+.Ar file
+which does not name a mount point is specified,
+a warning is issued,
+and no information is given for the file system on which that
+.Ar file
+resides (unless some other
+.Ar file
+names its mount point).
 .It Fl m
 The
 .Fl m
@@ -217,6 +234,8 @@ option may not be specified with
 and the
 .Ar blksize
 is required to be 512 or 1024.
+.It Fl q
+Suppress all warning output.
 .It Fl t Ar type
 Is used to indicate the actions should only be taken on
 file systems of the specified type.

Index: src/bin/df/df.c
diff -u src/bin/df/df.c:1.102 src/bin/df/df.c:1.103
--- src/bin/df/df.c:1.102	Mon Dec 18 08:27:24 2023
+++ src/bin/df/df.c	Sat Aug  3 05:27:58 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: df.c,v 1.102 2023/12/18 08:27:24 kre Exp $ */
+/*	$NetBSD: df.c,v 1.103 2024/08/03 05:27:58 kre Exp $ */
 
 /*
  * Copyright (c) 1980, 1990, 1993, 1994
@@ -45,7 +45,7 @@ __COPYRIGHT(
 #if 0
 static char sccsid[] = "@(#)df.c	8.7 (Berkeley) 4/2/94";
 #else
-__RCSID("$NetBSD: df.c,v 1.102 2023/12/18 08:27:24 kre Exp $");
+__RCSID("$NetBSD: df.c,v 1.103 2024/08/03 05:27:58 kre Exp $");
 #endif
 #endif /* not lint */
 
@@ -77,7 +77,7 @@ static void	 prthumanval(int64_t, int);
 static void	 prthuman(const struct statvfs *, int64_t, int64_t);
 
 static int	 aflag, cflag, fflag, gflag, hflag, iflag, lflag;
-static int	 Nflag, nflag, Pflag, Wflag;
+static int	 Mflag, Nflag, nflag, Pflag, qflag, Wflag;
 static long	 usize;
 static char	**typelist;
 static size_t	 mntcount;
@@ -88,6 +88,9 @@ static int blksize_width = WIDTH_BLKSIZE
 
 static int fudgeunits = 0;
 
+#define	streq(a, b)	(strcmp((a), (b)) == 0)
+#define	warnq(args)	do { if (!qflag) warnx args; } while (0)
+
 int
 main(int argc, char *argv[])
 {
@@ -100,7 +103,7 @@ main(int argc, char *argv[])
 	setprogname(argv[0]);
 	(void)setlocale(LC_ALL, "");
 
-	while ((ch = getopt(argc, argv, "abcfGgHhiklmNnPt:W")) != -1)
+	while ((ch = getopt(argc, argv, "abcfGgHhiklMmNnPqt:W")) != -1)
 		switch (ch) {
 		case 'a':
 			aflag = 1;
@@ -139,6 +142,9 @@ main(int argc, char *argv[])
 		case 'l':
 			lflag = 1;
 			break;
+		case 'M':
+			Mflag = 1;
+			break;
 		case 'm':
 			hflag = 0;
 			usize = 1024 * 1024;
@@ -152,6 +158,9 @@ main(int argc, char *argv[])
 		case 'P':
 			Pflag = 1;
 			break;
+		case 'q':
+			qflag = 1;
+			break;
 		case 'W':
 			Wflag = 1;
 			break;
@@ -203,7 +212,8 @@ main(int argc, char *argv[])
 		for (/*EMPTY*/; *argv != NULL; argv++) {
 			if (stat(*argv, &stbuf) < 0) {
 				if ((mntpt = getmntpt(*argv)) == 0) {
-					warn("%s", *argv);
+					if (!qflag)
+						warn("%s", *argv);
 					continue;
 				}
 			} else if (S_ISBLK(stbuf.st_mode)) {
@@ -211,25 +221,30 @@ main(int argc, char *argv[])
 					mntpt = *argv;
 			} else
 				mntpt = *argv;
+
 			/*
 			 * Statfs does not take a `wait' flag, so we cannot
 			 * implement nflag here.
 			 */
-			if (!statvfs(mntpt, &mntbuf[mntcount]))
-				if (lflag &&
+			if (!statvfs(mntpt, &mntbuf[mntcount])) {
+				if (Mflag &&
+				    !streq(mntpt, mntbuf[mntcount].f_mntonname))
+					warnq(("%s is not a mount point",
+					    mntpt));
+				else if (lflag &&
 				    (mntbuf[mntcount].f_flag & MNT_LOCAL) == 0)
-					warnx("Warning: %s is not a local %s",
-					    *argv, "file system");
+					warnq(("Warning: %s is not a local %s",
+					    *argv, "file system"));
 				else if
 				    (!selected(mntbuf[mntcount].f_fstypename,
 					sizeof(mntbuf[mntcount].f_fstypename)))
-					warnx("Warning: %s mounted as a %s %s",
+					warnq(("Warning: %s mounted as a %s %s",
 					    *argv,
 					    mntbuf[mntcount].f_fstypename,
-					    "file system");
+					    "file system"));
 				else
 					++mntcount;
-			else
+			} else if (!qflag)
 				warn("%s", *argv);
 		}
 	}
@@ -277,7 +292,7 @@ getmntpt(const char *name)
 	if (count == 0)
 		err(EXIT_FAILURE, "Can't get mount information");
 	for (i = 0; i < count; i++) {
-		if (!strcmp(mntbuf[i].f_mntfromname, name))
+		if (streq(mntbuf[i].f_mntfromname, name))
 			return mntbuf[i].f_mntonname;
 	}
 	return 0;
@@ -628,7 +643,7 @@ usage(void)
 {
 
 	(void)fprintf(stderr,
-	    "Usage: %s [-aclnW] [-G|-bkP|-bfgHhikmN] [-t type] [file | "
+	    "Usage: %s [-aclMnqW] [-G|-bkP|-bfgHhikmN] [-t type] [file | "
 	    "file_system]...\n",
 	    getprogname());
 	exit(1);

Reply via email to