From d197ed96ed10826d0879bca2610aa62edd76df02 Mon Sep 17 00:00:00 2001 From: Kirill Tkhai Date: Wed, 31 May 2017 20:53:13 +0300 Subject: [PATCH] ns: Add possibility to read a ns by alternative name in __get_ns_id() This is need for "/proc/[pid]/ns/pid_for_children_ns", which is a pid namespace with not standard file name. Also pass "alternative" parameter to generate_ns_id(). v2: Enlarge buffer size Signed-off-by: Kirill Tkhai Signed-off-by: Andrei Vagin --- criu/include/namespaces.h | 1 + criu/namespaces.c | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/criu/include/namespaces.h b/criu/include/namespaces.h index 5e7cbc2e6..e9f09d1e3 100644 --- a/criu/include/namespaces.h +++ b/criu/include/namespaces.h @@ -56,6 +56,7 @@ struct ns_desc { unsigned int cflag; char *str; + char *alt_str; size_t len; }; diff --git a/criu/namespaces.c b/criu/namespaces.c index 5b0b3117a..0776e3e00 100644 --- a/criu/namespaces.c +++ b/criu/namespaces.c @@ -410,7 +410,7 @@ int walk_namespaces(struct ns_desc *nd, int (*cb)(struct ns_id *, void *), void } static unsigned int generate_ns_id(int pid, unsigned int kid, struct ns_desc *nd, - struct ns_id **ns_ret) + struct ns_id **ns_ret, bool alternative) { struct ns_id *nsid; enum ns_type type; @@ -456,18 +456,19 @@ found: return nsid->id; } -static unsigned int __get_ns_id(int pid, struct ns_desc *nd, protobuf_c_boolean *supported, struct ns_id **ns) +static unsigned int __get_ns_id(int pid, struct ns_desc *nd, bool alternative, + protobuf_c_boolean *supported, struct ns_id **ns) { int proc_dir; unsigned int kid; - char ns_path[10]; + char ns_path[32]; struct stat st; proc_dir = open_pid_proc(pid); if (proc_dir < 0) return 0; - snprintf(ns_path, sizeof(ns_path), "ns/%s", nd->str); + snprintf(ns_path, sizeof(ns_path), "ns/%s", !alternative ? nd->str : nd->alt_str); if (fstatat(proc_dir, ns_path, &st, 0)) { if (errno == ENOENT) { @@ -484,12 +485,12 @@ static unsigned int __get_ns_id(int pid, struct ns_desc *nd, protobuf_c_boolean out: if (supported) *supported = kid != 0; - return generate_ns_id(pid, kid, nd, ns); + return generate_ns_id(pid, kid, nd, ns, alternative); } static unsigned int get_ns_id(int pid, struct ns_desc *nd, protobuf_c_boolean *supported) { - return __get_ns_id(pid, nd, supported, NULL); + return __get_ns_id(pid, nd, false, supported, NULL); } int dump_one_ns_file(int lfd, u32 id, const struct fd_parms *p) @@ -699,7 +700,8 @@ int predump_task_ns_ids(struct pstree_item *item) { int pid = item->pid->real; - if (!__get_ns_id(pid, &net_ns_desc, NULL, &dmpi(item)->netns)) + if (!__get_ns_id(pid, &net_ns_desc, false, + NULL, &dmpi(item)->netns)) return -1; if (!get_ns_id(pid, &mnt_ns_desc, NULL)) @@ -735,7 +737,8 @@ int dump_task_ns_ids(struct pstree_item *item) return 0; ids->has_net_ns_id = true; - ids->net_ns_id = __get_ns_id(pid, &net_ns_desc, NULL, &dmpi(item)->netns); + ids->net_ns_id = __get_ns_id(pid, &net_ns_desc, false, + NULL, &dmpi(item)->netns); if (!ids->net_ns_id) { pr_err("Can't make netns id\n"); return -1;