Re: [systemd-devel] [PATCH 2/4] util: add functions getting proc status, maps, limits, cgroup
On Thu, 2014-11-20 at 14:36 +0100, Lennart Poettering wrote: On Wed, 19.11.14 11:01, Jakub Filak (jfi...@redhat.com) wrote: --- src/shared/util.c| 13 + src/shared/util.h| 4 src/test/test-util.c | 17 + 3 files changed, 34 insertions(+) diff --git a/src/shared/util.c b/src/shared/util.c index 0166052..d62d90c 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -892,6 +892,19 @@ int get_process_root(pid_t pid, char **root) { return get_process_link_contents(p, root); } +#define DEFINE_FN_GET_PROCESS_FULL_FILE(name) \ +int get_process_##name(pid_t pid, char **name) { \ +const char *p; \ +assert(pid = 0); \ +p = procfs_file_alloca(pid, #name); \ +return read_full_file(p, name, /*size*/NULL); \ +} + +DEFINE_FN_GET_PROCESS_FULL_FILE(status) +DEFINE_FN_GET_PROCESS_FULL_FILE(maps) +DEFINE_FN_GET_PROCESS_FULL_FILE(limits) +DEFINE_FN_GET_PROCESS_FULL_FILE(cgroup) + Please use functions instead of macros wherever that works. Maybe it is sufficient to just provide a single function for all four cases that takes an extra argument for the file name to read? Maybe: int get_process_proc_file(pid_t pid, const char *filename, char **ret) Or so? Given that the files in question are generally just read and passed on as is without processing them any further I think it is Ok to just provide a single bulk call that covers all four cases instead of four individual ones. Hope that makes sense? It definitely make sense. I actually wanted to introduce 'get_process_proc_file()' function, but I didn't do that because 'procfs_file_alloca' is a macro and its last argument must be a string literal, so I couldn't use the following construction: p = procfs_file_alloca(pid, filename); I forgot to mention this fact in the commit message. New version will arrive soon. Thanks for the review! Jakub ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel
Re: [systemd-devel] [PATCH 2/4] util: add functions getting proc status, maps, limits, cgroup
On Wed, 19.11.14 11:01, Jakub Filak (jfi...@redhat.com) wrote: --- src/shared/util.c| 13 + src/shared/util.h| 4 src/test/test-util.c | 17 + 3 files changed, 34 insertions(+) diff --git a/src/shared/util.c b/src/shared/util.c index 0166052..d62d90c 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -892,6 +892,19 @@ int get_process_root(pid_t pid, char **root) { return get_process_link_contents(p, root); } +#define DEFINE_FN_GET_PROCESS_FULL_FILE(name) \ +int get_process_##name(pid_t pid, char **name) { \ +const char *p; \ +assert(pid = 0); \ +p = procfs_file_alloca(pid, #name); \ +return read_full_file(p, name, /*size*/NULL); \ +} + +DEFINE_FN_GET_PROCESS_FULL_FILE(status) +DEFINE_FN_GET_PROCESS_FULL_FILE(maps) +DEFINE_FN_GET_PROCESS_FULL_FILE(limits) +DEFINE_FN_GET_PROCESS_FULL_FILE(cgroup) + Please use functions instead of macros wherever that works. Maybe it is sufficient to just provide a single function for all four cases that takes an extra argument for the file name to read? Maybe: int get_process_proc_file(pid_t pid, const char *filename, char **ret) Or so? Given that the files in question are generally just read and passed on as is without processing them any further I think it is Ok to just provide a single bulk call that covers all four cases instead of four individual ones. Hope that makes sense? Lennart -- Lennart Poettering, Red Hat ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel
[systemd-devel] [PATCH 2/4] util: add functions getting proc status, maps, limits, cgroup
--- src/shared/util.c| 13 + src/shared/util.h| 4 src/test/test-util.c | 17 + 3 files changed, 34 insertions(+) diff --git a/src/shared/util.c b/src/shared/util.c index 0166052..d62d90c 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -892,6 +892,19 @@ int get_process_root(pid_t pid, char **root) { return get_process_link_contents(p, root); } +#define DEFINE_FN_GET_PROCESS_FULL_FILE(name) \ +int get_process_##name(pid_t pid, char **name) { \ +const char *p; \ +assert(pid = 0); \ +p = procfs_file_alloca(pid, #name); \ +return read_full_file(p, name, /*size*/NULL); \ +} + +DEFINE_FN_GET_PROCESS_FULL_FILE(status) +DEFINE_FN_GET_PROCESS_FULL_FILE(maps) +DEFINE_FN_GET_PROCESS_FULL_FILE(limits) +DEFINE_FN_GET_PROCESS_FULL_FILE(cgroup) + 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 fc59481..2c9e4fe 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -297,6 +297,10 @@ 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); +int get_process_status(pid_t pid, char **status); +int get_process_maps(pid_t pid, char **maps); +int get_process_limits(pid_t pid, char **limits); +int get_process_cgroup(pid_t pid, char **cgroup); 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 7bf8ff6..f7c0210 100644 --- a/src/test/test-util.c +++ b/src/test/test-util.c @@ -491,6 +491,7 @@ 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, *cwd = NULL, *root = NULL; +_cleanup_free_ char *s = NULL, *l = NULL, *m = NULL, *cg = NULL; unsigned long long b; pid_t e; uid_t u; @@ -543,6 +544,22 @@ static void test_get_process_comm(void) { assert_se(r = 0 || r == -EACCES); log_info(pid1 root: '%s', root); +r = get_process_status(me, s); +assert_se(r = 0 || r == -EACCES); +log_info(pid1 strlen(status): '%zd', strlen(s)); + +r = get_process_maps(me, m); +assert_se(r = 0 || r == -EACCES); +log_info(pid1 strlen(maps): '%zd', strlen(m)); + +r = get_process_limits(me, l); +assert_se(r = 0 || r == -EACCES); +log_info(pid1 strlen(limits): '%zd', strlen(l)); + +r = get_process_cgroup(me, cg); +assert_se(r = 0 || r == -EACCES); +log_info(pid1 strlen(cgroup): '%zd', strlen(cg)); + 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