findmnt: improve --df output

* don't print pseudo-filesystems (except tmpfs)
 * add --all to disable built-in filters
 * don't overwrite --df --output=<list> with default columns

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2012-03-20 10:43:29 +01:00
parent 1e1df43ca2
commit cd4ed46f98
2 changed files with 32 additions and 8 deletions

View File

@ -47,11 +47,17 @@ The output is in the list format (see --list).
Search in Search in
.IR /proc/self/mountinfo . .IR /proc/self/mountinfo .
The output is in the tree-like format. This is the default. The output is in the tree-like format. This is the default.
.IP "\fB\-A, \-\-all\fP"
Disable all built-in filters and print all filesystems.
.IP "\fB\-a, \-\-ascii\fP"
Use ascii characters for tree formatting.
.IP "\fB\-c, \-\-canonicalize\fP" .IP "\fB\-c, \-\-canonicalize\fP"
Canonicalize all printed paths. Canonicalize all printed paths.
.IP "\fB\-D, \-\-df\fP" .IP "\fB\-D, \-\-df\fP"
Imitate the output of df(1). This option is equivalent to Imitate the output of df(1). This option is equivalent to
"-o SOURCE,FSTYPE,SIZE,USED,AVAIL,USE%,TARGET". "-o SOURCE,FSTYPE,SIZE,USED,AVAIL,USE%,TARGET", but excludes all
pseudo filesystem. Use \fB\-\-all\fP to print all filesystems.
.IP "\fB\-d, \-\-direction \fIword\fP" .IP "\fB\-d, \-\-direction \fIword\fP"
The search direction - The search direction -
.IR forward .IR forward
@ -148,8 +154,6 @@ available for umount and remount actions
Use key="value" output format. Use key="value" output format.
.IP "\fB\-r, \-\-raw\fP" .IP "\fB\-r, \-\-raw\fP"
Use raw output format. Use raw output format.
.IP "\fB\-a, \-\-ascii\fP"
Use ascii characters for tree formatting.
.IP "\fB\-t, \-\-types \fIlist\fP" .IP "\fB\-t, \-\-types \fIlist\fP"
Limit the set of printed filesystems. More than one type may be Limit the set of printed filesystems. More than one type may be
specified in a comma-separated list. The list of filesystem types can be specified in a comma-separated list. The list of filesystem types can be

View File

@ -51,7 +51,9 @@ enum {
FL_NOSWAPMATCH = (1 << 6), FL_NOSWAPMATCH = (1 << 6),
FL_NOFSROOT = (1 << 7), FL_NOFSROOT = (1 << 7),
FL_SUBMOUNTS = (1 << 8), FL_SUBMOUNTS = (1 << 8),
FL_POLL = (1 << 9) FL_POLL = (1 << 9),
FL_DF = (1 << 10),
FL_ALL = (1 << 11)
}; };
/* column IDs */ /* column IDs */
@ -192,6 +194,9 @@ static int is_tabdiff_column(int id)
*/ */
static int is_listall_mode(void) static int is_listall_mode(void)
{ {
if ((flags & FL_DF) && !(flags & FL_ALL))
return 0;
return (!get_match(COL_SOURCE) && return (!get_match(COL_SOURCE) &&
!get_match(COL_TARGET) && !get_match(COL_TARGET) &&
!get_match(COL_FSTYPE) && !get_match(COL_FSTYPE) &&
@ -638,6 +643,16 @@ static int match_func(struct libmnt_fs *fs,
if (m && !mnt_fs_match_options(fs, m)) if (m && !mnt_fs_match_options(fs, m))
return rc; return rc;
if ((flags & FL_DF) && !(flags & FL_ALL)) {
const char *type = mnt_fs_get_fstype(fs);
if (type && strstr(type, "tmpfs")) /* tmpfs is wanted */
return !rc;
if (mnt_fs_is_pseudofs(fs))
return rc;
}
return !rc; return !rc;
} }
@ -881,6 +896,7 @@ static void __attribute__((__noreturn__)) usage(FILE *out)
" -w, --timeout <num> upper limit in milliseconds that --poll will block\n\n")); " -w, --timeout <num> upper limit in milliseconds that --poll will block\n\n"));
fprintf(out, _( fprintf(out, _(
" -A, --all disable all built-in filters, print all filesystems\n"
" -a, --ascii use ASCII chars for tree formatting\n" " -a, --ascii use ASCII chars for tree formatting\n"
" -c, --canonicalize canonicalize printed paths\n" " -c, --canonicalize canonicalize printed paths\n"
" -D, --df imitate the output of df(1)\n" " -D, --df imitate the output of df(1)\n"
@ -930,13 +946,14 @@ int main(int argc, char *argv[])
struct libmnt_table *tb = NULL; struct libmnt_table *tb = NULL;
char **tabfiles = NULL; char **tabfiles = NULL;
int direction = MNT_ITER_FORWARD; int direction = MNT_ITER_FORWARD;
int i, c, rc = -1, timeout = -1, df_output = 0; int i, c, rc = -1, timeout = -1;
int ntabfiles = 0, tabtype = 0; int ntabfiles = 0, tabtype = 0;
/* table.h */ /* table.h */
struct tt *tt = NULL; struct tt *tt = NULL;
static const struct option longopts[] = { static const struct option longopts[] = {
{ "all", 0, 0, 'A' },
{ "ascii", 0, 0, 'a' }, { "ascii", 0, 0, 'a' },
{ "canonicalize", 0, 0, 'c' }, { "canonicalize", 0, 0, 'c' },
{ "direction", 1, 0, 'd' }, { "direction", 1, 0, 'd' },
@ -977,9 +994,12 @@ int main(int argc, char *argv[])
tt_flags |= TT_FL_TREE; tt_flags |= TT_FL_TREE;
while ((c = getopt_long(argc, argv, while ((c = getopt_long(argc, argv,
"acDd:ehifF:o:O:p::Pklmnrst:uvRS:T:w:", "AacDd:ehifF:o:O:p::Pklmnrst:uvRS:T:w:",
longopts, NULL)) != -1) { longopts, NULL)) != -1) {
switch(c) { switch(c) {
case 'A':
flags |= FL_ALL;
break;
case 'a': case 'a':
tt_flags |= TT_FL_ASCII; tt_flags |= TT_FL_ASCII;
break; break;
@ -988,7 +1008,7 @@ int main(int argc, char *argv[])
break; break;
case 'D': case 'D':
tt_flags &= ~TT_FL_TREE; tt_flags &= ~TT_FL_TREE;
df_output = 1; flags |= FL_DF;
break; break;
case 'd': case 'd':
if (!strcmp(optarg, "forward")) if (!strcmp(optarg, "forward"))
@ -1099,7 +1119,7 @@ int main(int argc, char *argv[])
} }
} }
if (df_output) { if (!ncolumns && (flags & FL_DF)) {
columns[ncolumns++] = COL_SOURCE; columns[ncolumns++] = COL_SOURCE;
columns[ncolumns++] = COL_FSTYPE; columns[ncolumns++] = COL_FSTYPE;
columns[ncolumns++] = COL_SIZE; columns[ncolumns++] = COL_SIZE;