ubase

suckless linux base utils
git clone git://git.suckless.org/ubase
Log | Files | Refs | README | LICENSE

commit f26a1449bfa18a6fbbe263f084df4e490772e9d3
parent 28795cffe22ee6a645e4763f6b9bd0e422dddb2a
Author: Mattias Andrée <maandree@kth.se>
Date:   Sat, 26 Mar 2016 12:58:37 +0100

Add pwdx(1)

Signed-off-by: Mattias Andrée <maandree@kth.se>

Diffstat:
MMakefile | 2++
MTODO | 1-
Apwdx.1 | 13+++++++++++++
Apwdx.c | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 66 insertions(+), 1 deletion(-)

diff --git a/Makefile b/Makefile @@ -70,6 +70,7 @@ BIN = \ pidof \ pivot_root \ ps \ + pwdx \ readahead \ respawn \ rmmod \ @@ -106,6 +107,7 @@ MAN1 = \ passwd.1 \ pidof.1 \ ps.1 \ + pwdx.1 \ respawn.1 \ stat.1 \ su.1 \ diff --git a/TODO b/TODO @@ -19,7 +19,6 @@ mkswap [-L] partprobe pmap ps (support for more options) -pwdx rfkill rmgroup rmuser diff --git a/pwdx.1 b/pwdx.1 @@ -0,0 +1,13 @@ +.Dd March 26, 2015 +.Dt PWDX 1 +.Os ubase +.Sh NAME +.Nm pwdx +.Nd print working directory of other processes +.Sh SYNOPSIS +.Nm +.Ar pid... +.Sh DESCRIPTION +.Nm +Prints the current working directory for each +.Ar pid . diff --git a/pwdx.c b/pwdx.c @@ -0,0 +1,51 @@ +/* See LICENSE file for copyright and license details. */ +#include <errno.h> +#include <limits.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +#include "util.h" + +static void +usage(void) +{ + eprintf("usage: %s pid...\n", argv0); +} + +int +main(int argc, char *argv[]) +{ + int ret = 0; + char path[PATH_MAX]; + char target[PATH_MAX + sizeof(" (deleted)")]; + ssize_t n; + + ARGBEGIN { + default: + usage(); + } ARGEND; + + if (argc == 0) + usage(); + + for (; argc > 0; argc--, argv++) { + n = snprintf(path, sizeof(path), "/proc/%s/cwd", *argv); + if (n < 0 || n > sizeof(path)) { + errno = ESRCH; + } else { + n = readlink(path, target, sizeof(target) - 1); + if (n >= 0) { + target[n] = '\0'; + printf("%s: %s\n", *argv, target); + continue; + } + } + if (errno == ENOENT) + errno = ESRCH; + weprintf("%s:", *argv); + ret = 1; + } + + return ret; +}