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