static int check_ns_file(char *ns_file) { int pid, ret, proc_dir; if (!check_int_str(ns_file)) { pid = atoi(ns_file); if (pid <= 0) { pr_perror("Invalid join_ns pid %s", ns_file); return -1; } proc_dir = open_pid_proc(pid); if (proc_dir < 0) { pr_perror("Invalid join_ns pid: /proc/%s not found", ns_file); return -1; } return 0; } ret = access(ns_file, 0); if (ret < 0) { pr_perror("Can't access join-ns file: %s", ns_file); return -1; } return 0; }
static unsigned int __get_ns_id(int pid, struct ns_desc *nd, protobuf_c_boolean *supported, struct ns_id **ns) { int proc_dir; unsigned int kid; char ns_path[10]; struct stat st; proc_dir = open_pid_proc(pid); if (proc_dir < 0) return 0; sprintf(ns_path, "ns/%s", nd->str); if (fstatat(proc_dir, ns_path, &st, 0)) { if (errno == ENOENT) { /* The namespace is unsupported */ kid = 0; goto out; } pr_perror("Unable to stat %s", ns_path); return -1; } kid = st.st_ino; BUG_ON(!kid); out: if (supported) *supported = kid != 0; return generate_ns_id(pid, kid, nd, ns); }
int do_open_proc(pid_t pid, int flags, const char *fmt, ...) { char path[128]; va_list args; int dirfd = open_pid_proc(pid); if (dirfd < 0) return -1; va_start(args, fmt); vsnprintf(path, sizeof(path), fmt, args); va_end(args); return openat(dirfd, path, flags); }
static unsigned int get_ns_id(int pid, struct ns_desc *nd) { int proc_dir, ret; unsigned int kid; char ns_path[10], ns_id[32]; proc_dir = open_pid_proc(pid); if (proc_dir < 0) return 0; sprintf(ns_path, "ns/%s", nd->str); ret = readlinkat(proc_dir, ns_path, ns_id, sizeof(ns_id)); if (ret < 0) { pr_perror("Can't readlink ns link"); return 0; } kid = parse_ns_link(ns_id, ret, nd); BUG_ON(!kid); return generate_ns_id(pid, kid, nd); }