On Wed, 19.11.14 11:01, Jakub Filak (jfi...@redhat.com) wrote: > /proc/[pid]/cwd and /proc/[pid]/root are symliks to corresponding > directories
Looks good! Applied this one already! Thanks! > > The added functions returns values of that symlinks. > --- > src/shared/util.c | 39 +++++++++++++++++++++++++++++++++++---- > src/shared/util.h | 2 ++ > src/test/test-util.c | 13 ++++++++++++- > 3 files changed, 49 insertions(+), 5 deletions(-) > > diff --git a/src/shared/util.c b/src/shared/util.c > index eeced47..0166052 100644 > --- a/src/shared/util.c > +++ b/src/shared/util.c > @@ -797,19 +797,30 @@ int get_process_capeff(pid_t pid, char **capeff) { > return get_status_field(p, "\nCapEff:", capeff); > } > > +static int get_process_link_contents(const char *proc_file, char **name) { > + int r; > + > + assert(proc_file); > + assert(name); > + > + r = readlink_malloc(proc_file, name); > + if (r < 0) > + return r == -ENOENT ? -ESRCH : r; > + > + return 0; > +} > + > int get_process_exe(pid_t pid, char **name) { > const char *p; > char *d; > int r; > > assert(pid >= 0); > - assert(name); > > p = procfs_file_alloca(pid, "exe"); > - > - r = readlink_malloc(p, name); > + r = get_process_link_contents(p, name); > if (r < 0) > - return r == -ENOENT ? -ESRCH : r; > + return r; > > d = endswith(*name, " (deleted)"); > if (d) > @@ -861,6 +872,26 @@ int get_process_gid(pid_t pid, gid_t *gid) { > return get_process_id(pid, "Gid:", gid); > } > > +int get_process_cwd(pid_t pid, char **cwd) { > + const char *p; > + > + assert(pid >= 0); > + > + p = procfs_file_alloca(pid, "cwd"); > + > + return get_process_link_contents(p, cwd); > +} > + > +int get_process_root(pid_t pid, char **root) { > + const char *p; > + > + assert(pid >= 0); > + > + p = procfs_file_alloca(pid, "root"); > + > + return get_process_link_contents(p, root); > +} > + > char *strnappend(const char *s, const char *suffix, size_t b) { > size_t a; > char *r; > diff --git a/src/shared/util.h b/src/shared/util.h > index 835fee4..fc59481 100644 > --- a/src/shared/util.h > +++ b/src/shared/util.h > @@ -295,6 +295,8 @@ int get_process_exe(pid_t pid, char **name); > int get_process_uid(pid_t pid, uid_t *uid); > int get_process_gid(pid_t pid, gid_t *gid); > int get_process_capeff(pid_t pid, char **capeff); > +int get_process_cwd(pid_t pid, char **cwd); > +int get_process_root(pid_t pid, char **root); > > char hexchar(int x) _const_; > int unhexchar(char c) _const_; > diff --git a/src/test/test-util.c b/src/test/test-util.c > index 01b0192..7bf8ff6 100644 > --- a/src/test/test-util.c > +++ b/src/test/test-util.c > @@ -490,13 +490,14 @@ static void test_u64log2(void) { > > static void test_get_process_comm(void) { > struct stat st; > - _cleanup_free_ char *a = NULL, *c = NULL, *d = NULL, *f = NULL, *i = > NULL; > + _cleanup_free_ char *a = NULL, *c = NULL, *d = NULL, *f = NULL, *i = > NULL, *cwd = NULL, *root = NULL; > unsigned long long b; > pid_t e; > uid_t u; > gid_t g; > dev_t h; > int r; > + pid_t me; > > if (stat("/proc/1/comm", &st) == 0) { > assert_se(get_process_comm(1, &a) >= 0); > @@ -532,6 +533,16 @@ static void test_get_process_comm(void) { > log_info("pid1 gid: "GID_FMT, g); > assert_se(g == 0); > > + me = getpid(); > + > + r = get_process_cwd(me, &cwd); > + assert_se(r >= 0 || r == -EACCES); > + log_info("pid1 cwd: '%s'", cwd); > + > + r = get_process_root(me, &root); > + assert_se(r >= 0 || r == -EACCES); > + log_info("pid1 root: '%s'", root); > + > assert_se(get_ctty_devnr(1, &h) == -ENOENT); > > getenv_for_pid(1, "PATH", &i); > -- > 1.8.3.1 > > _______________________________________________ > systemd-devel mailing list > systemd-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/systemd-devel Lennart -- Lennart Poettering, Red Hat _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel