diff options
-rw-r--r-- | sys-utils/umount.8 | 4 | ||||
-rw-r--r-- | sys-utils/umount.c | 24 |
2 files changed, 25 insertions, 3 deletions
diff --git a/sys-utils/umount.8 b/sys-utils/umount.8 index f09b1eae6..ff6ce2429 100644 --- a/sys-utils/umount.8 +++ b/sys-utils/umount.8 @@ -130,7 +130,9 @@ server or a network partition. Remounts of the share will not be possible. .TP .BR \-N , " \-\-namespace " \fIns Perform umount in namespace specified by \fIns\fR. -\fIns\fR is typically in form \fI/proc/[pid]/ns/mnt\fR. +\fIns\fR is either PID of process running in that namespace +or special file representing that namespace. +See \fBnamespaces\fR(7) for more information. .TP .BR \-n , " \-\-no\-mtab" Unmount without writing in diff --git a/sys-utils/umount.c b/sys-utils/umount.c index 991adf760..244080598 100644 --- a/sys-utils/umount.c +++ b/sys-utils/umount.c @@ -398,6 +398,19 @@ static char *sanitize_path(const char *path) return p; } +static pid_t parse_pid(const char *str) +{ + char *end; + pid_t ret; + + errno = 0; + ret = strtoul(str, &end, 10); + + if (ret < 0 || errno || end == str || (end && *end)) + return 0; + return ret; +} + int main(int argc, char **argv) { int c, rc = 0, all = 0, recursive = 0, alltargets = 0; @@ -512,8 +525,15 @@ int main(int argc, char **argv) print_version(); break; case 'N': - if (mnt_context_set_target_ns(cxt, optarg)) - err(MNT_EX_SYSERR, _("failed to set target namespace")); + { + char path[PATH_MAX]; + pid_t pid = parse_pid(optarg); + + if (pid) + snprintf(path, sizeof(path), "/proc/%i/ns/mnt", pid); + + if (mnt_context_set_target_ns(cxt, pid ? path : optarg)) + err(MNT_EX_SYSERR, _("failed to set target namespace to %s"), pid ? path : optarg); break; } default: |