Page MenuHomeFreeBSD

D33748.id101021.diff
No OneTemporary

D33748.id101021.diff

diff --git a/bin/df/Makefile b/bin/df/Makefile
--- a/bin/df/Makefile
+++ b/bin/df/Makefile
@@ -2,13 +2,9 @@
# $FreeBSD$
PACKAGE=runtime
-MOUNT= ${SRCTOP}/sbin/mount
-.PATH: ${MOUNT}
PROG= df
-SRCS= df.c vfslist.c
-
-CFLAGS+= -I${MOUNT}
+SRCS= df.c
LIBADD= xo util
diff --git a/bin/df/df.1 b/bin/df/df.1
--- a/bin/df/df.1
+++ b/bin/df/df.1
@@ -118,6 +118,9 @@
specification from the environment.
.It Fl l
Only display information about locally-mounted file systems.
+If used in combination with the
+.Fl t Ar type
+option, non-local file systems selected by that option will be excluded.
.It Fl m
Use 1048576 byte (1 Mebibyte) blocks rather than the default.
This overrides any
@@ -142,7 +145,7 @@
The
.Fl k
option overrides this option.
-.It Fl t
+.It Fl t Ar type
Only print out statistics for file systems of the specified types.
More than one type may be specified in a comma separated list.
The list of file system types can be prefixed with
@@ -150,6 +153,9 @@
to specify the file system types for which action should
.Em not
be taken.
+If used in combination with the
+.Fl l
+option, non-local file systems will be excluded from the list.
For example, the
.Nm
command:
diff --git a/bin/df/df.c b/bin/df/df.c
--- a/bin/df/df.c
+++ b/bin/df/df.c
@@ -64,8 +64,6 @@
#include <unistd.h>
#include <libxo/xo.h>
-#include "extern.h"
-
#define UNITS_SI 1
#define UNITS_2 2
@@ -88,7 +86,7 @@
static void prthumanval(const char *, int64_t);
static intmax_t fsbtoblk(int64_t, uint64_t, u_long);
static void prtstat(struct statfs *, struct maxwidths *);
-static size_t regetmntinfo(struct statfs **, long, const char **);
+static size_t regetmntinfo(struct statfs **, long, const char **, const char **);
static void update_maxwidths(struct maxwidths *, const struct statfs *);
static void usage(void);
@@ -107,6 +105,54 @@
{ NULL, no_argument, NULL, 0 },
};
+static int skipvfs_l, skipvfs_t;
+
+static int
+checkvfsname(const char *vfsname, const char **vfslist, int skip)
+{
+
+ if (vfslist == NULL)
+ return (0);
+ while (*vfslist != NULL) {
+ if (strcmp(vfsname, *vfslist) == 0)
+ return (skip);
+ ++vfslist;
+ }
+ return (!skip);
+}
+
+static const char **
+makevfslist(char *fslist, int *skip)
+{
+ const char **av;
+ int i;
+ char *nextcp;
+
+ if (fslist == NULL)
+ return (NULL);
+ *skip = 0;
+ if (fslist[0] == 'n' && fslist[1] == 'o') {
+ fslist += 2;
+ *skip = 1;
+ }
+ for (i = 0, nextcp = fslist; *nextcp; nextcp++)
+ if (*nextcp == ',')
+ i++;
+ if ((av = malloc((size_t)(i + 2) * sizeof(char *))) == NULL) {
+ warnx("malloc failed");
+ return (NULL);
+ }
+ nextcp = fslist;
+ i = 0;
+ av[i++] = nextcp;
+ while ((nextcp = strchr(nextcp, ',')) != NULL) {
+ *nextcp++ = '\0';
+ av[i++] = nextcp;
+ }
+ av[i++] = NULL;
+ return (av);
+}
+
int
main(int argc, char *argv[])
{
@@ -115,7 +161,7 @@
struct maxwidths maxwidths;
struct statfs *mntbuf;
char *mntpt;
- const char **vfslist;
+ const char **vfslist_l, **vfslist_t;
int i, mntsize;
int ch, rv;
@@ -124,7 +170,10 @@
memset(&totalbuf, 0, sizeof(totalbuf));
totalbuf.f_bsize = DEV_BSIZE;
strlcpy(totalbuf.f_mntfromname, "total", MNAMELEN);
- vfslist = NULL;
+ vfslist_l = NULL;
+ skipvfs_l = 0;
+ vfslist_t = NULL;
+ skipvfs_t = 0;
argc = xo_parse_args(argc, argv);
if (argc < 0)
@@ -175,9 +224,7 @@
/* Ignore duplicate -l */
if (lflag)
break;
- if (vfslist != NULL)
- xo_errx(1, "-l and -t are mutually exclusive.");
- vfslist = makevfslist(makenetvfslist());
+ vfslist_l = makevfslist(makenetvfslist(), &skipvfs_l);
lflag = 1;
break;
case 'm':
@@ -188,11 +235,9 @@
nflag = 1;
break;
case 't':
- if (lflag)
- xo_errx(1, "-l and -t are mutually exclusive.");
- if (vfslist != NULL)
+ if (vfslist_t != NULL)
xo_errx(1, "only one -t option may be specified");
- vfslist = makevfslist(optarg);
+ vfslist_t = makevfslist(optarg, &skipvfs_t);
break;
case 'T':
Tflag = 1;
@@ -211,7 +256,7 @@
if (!*argv) {
/* everything (modulo -t) */
mntsize = getmntinfo(&mntbuf, MNT_NOWAIT);
- mntsize = regetmntinfo(&mntbuf, mntsize, vfslist);
+ mntsize = regetmntinfo(&mntbuf, mntsize, vfslist_l, vfslist_t);
} else {
/* just the filesystems specified on the command line */
mntbuf = malloc(argc * sizeof(*mntbuf));
@@ -259,7 +304,8 @@
* list a mount point that does not match the other args
* we've been given (-l, -t, etc.).
*/
- if (checkvfsname(statfsbuf.f_fstypename, vfslist)) {
+ if (checkvfsname(statfsbuf.f_fstypename, vfslist_l, skipvfs_l) ||
+ checkvfsname(statfsbuf.f_fstypename, vfslist_t, skipvfs_t)) {
rv = 1;
continue;
}
@@ -309,21 +355,24 @@
/*
* Make a pass over the file system info in ``mntbuf'' filtering out
- * file system types not in vfslist and possibly re-stating to get
+ * file system types not in vfslist_{l,t} and possibly re-stating to get
* current (not cached) info. Returns the new count of valid statfs bufs.
*/
static size_t
-regetmntinfo(struct statfs **mntbufp, long mntsize, const char **vfslist)
+regetmntinfo(struct statfs **mntbufp, long mntsize, const char **vfslist_l,
+ const char **vfslist_t)
{
int error, i, j;
struct statfs *mntbuf;
- if (vfslist == NULL)
+ if (vfslist_l == NULL && vfslist_t == NULL)
return (nflag ? mntsize : getmntinfo(mntbufp, MNT_WAIT));
mntbuf = *mntbufp;
for (j = 0, i = 0; i < mntsize; i++) {
- if (checkvfsname(mntbuf[i].f_fstypename, vfslist))
+ if (vfslist_l && checkvfsname(mntbuf[i].f_fstypename, vfslist_l, skipvfs_l))
+ continue;
+ if (vfslist_t && checkvfsname(mntbuf[i].f_fstypename, vfslist_t, skipvfs_t))
continue;
/*
* XXX statfs(2) can fail for various reasons. It may be

File Metadata

Mime Type
text/plain
Expires
Sun, Feb 16, 4:52 AM (11 h, 43 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16669352
Default Alt Text
D33748.id101021.diff (5 KB)

Event Timeline