diff --git a/misc-utils/findmnt.8 b/misc-utils/findmnt.8 index 69bae954f..f92bffd31 100644 --- a/misc-utils/findmnt.8 +++ b/misc-utils/findmnt.8 @@ -85,6 +85,12 @@ option and the option \fB\-\-submounts\fP is not used or if more that one source file (the option \fB\-F\fP) is specified. .IP "\fB\-v, \-\-nofsroot\fP" Do not print a [/dir] in the SOURCE column for bind-mounts or btrfs subvolumes. +.IP "\fB\-N, \-\-task \fItid\fP" +Use alternative namespace /proc//mountinfo rather than the default +/proc/self/mountinfo. If the option is specified more than once than tree-like +output is disabled (see the \fB\-\-list\fP option). See also +.BR unshare (1) +command. .IP "\fB\-n, \-\-noheadings\fP" Do not print a header line. .IP "\fB\-u, \-\-notruncate\fP" diff --git a/misc-utils/findmnt.c b/misc-utils/findmnt.c index 75f7eb761..1ef812cee 100644 --- a/misc-utils/findmnt.c +++ b/misc-utils/findmnt.c @@ -629,6 +629,14 @@ static char **append_tabfile(char **files, int *nfiles, char *filename) return files; } +static char **append_pid_tabfile(char **files, int *nfiles, pid_t pid) +{ + char *path = NULL; + + xasprintf(&path, "/proc/%d/mountinfo", (int) pid); + return append_tabfile(files, nfiles, path); +} + /* calls libmount fstab/mtab/mountinfo parser */ static struct libmnt_table *parse_tabfiles(char **files, int nfiles, @@ -987,6 +995,7 @@ static void __attribute__((__noreturn__)) usage(FILE *out) fprintf(out, _( " -i, --invert invert the sense of matching\n" " -l, --list use list format output\n" + " -N, --task use alternative namespace (/proc//mountinfo file)\n" " -n, --noheadings don't print column headings\n" " -u, --notruncate don't truncate text in columns\n")); fprintf(out, _( @@ -1030,12 +1039,14 @@ int main(int argc, char *argv[]) EXCL_FSTAB, EXCL_KERNEL, EXCL_MTAB, + EXCL_TASK, EXCL_RAW, EXCL_LIST, EXCL_PAIRS }; int excl_fmk = EXCL_NONE; + int excl_fmN = EXCL_NONE; int excl_rlP = EXCL_NONE; /* table.h */ @@ -1067,6 +1078,7 @@ int main(int argc, char *argv[]) { "submounts", 0, 0, 'R' }, { "source", 1, 0, 'S' }, { "tab-file", 1, 0, 'F' }, + { "task", 1, 0, 'N' }, { "target", 1, 0, 'T' }, { "timeout", 1, 0, 'w' }, { "version", 0, 0, 'V' }, @@ -1085,7 +1097,7 @@ int main(int argc, char *argv[]) tt_flags |= TT_FL_TREE; while ((c = getopt_long(argc, argv, - "AacDd:ehifF:o:O:p::Pklmnrst:uvRS:T:w:V", + "AacDd:ehifF:o:O:p::PklmnN:rst:uvRS:T:w:V", longopts, NULL)) != -1) { switch(c) { case 'A': @@ -1156,11 +1168,13 @@ int main(int argc, char *argv[]) break; case 'm': /* mtab */ exclusive_option(&excl_fmk, EXCL_MTAB, "--{fstab,mtab,kernel}"); + exclusive_option(&excl_fmN, EXCL_MTAB, "--{fstab,mtab,task}"); tabtype = TABTYPE_MTAB; tt_flags &= ~TT_FL_TREE; break; case 's': /* fstab */ exclusive_option(&excl_fmk, EXCL_FSTAB, "--{fstab,mtab,kernel}"); + exclusive_option(&excl_fmN, EXCL_FSTAB, "--{fstab,mtab,task}"); tabtype = TABTYPE_FSTAB; tt_flags &= ~TT_FL_TREE; break; @@ -1183,6 +1197,13 @@ int main(int argc, char *argv[]) case 'n': tt_flags |= TT_FL_NOHEADINGS; break; + case 'N': + exclusive_option(&excl_fmN, EXCL_KERNEL, "--{fstab,mtab,task}"); + tabtype = TABTYPE_KERNEL; + tabfiles = append_pid_tabfile(tabfiles, &ntabfiles, + strtou32_or_err(optarg, + _("invalid TID argument"))); + break; case 'v': flags |= FL_NOFSROOT; break;