diff options
author | Mike Yuan <me@yhndnzj.com> | 2024-07-22 20:11:54 +0200 |
---|---|---|
committer | Mike Yuan <me@yhndnzj.com> | 2024-07-23 19:30:54 +0200 |
commit | 86a3c1fd95b35f307789f311d5496088bada5e20 (patch) | |
tree | 97f396e3c850b16e8a55019ab90856240c030a41 /src/basic/namespace-util.c | |
parent | namespace-util: explicitly specify namespace_info[]'s size (diff) | |
download | systemd-86a3c1fd95b35f307789f311d5496088bada5e20.tar.xz systemd-86a3c1fd95b35f307789f311d5496088bada5e20.zip |
namespace-util: introduce pidref_namespace_open()
Diffstat (limited to 'src/basic/namespace-util.c')
-rw-r--r-- | src/basic/namespace-util.c | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/src/basic/namespace-util.c b/src/basic/namespace-util.c index 739867672e..d9ad25fdd7 100644 --- a/src/basic/namespace-util.c +++ b/src/basic/namespace-util.c @@ -42,8 +42,8 @@ static NamespaceType clone_flag_to_namespace_type(unsigned long clone_flag) { return _NAMESPACE_TYPE_INVALID; } -int namespace_open( - pid_t pid, +int pidref_namespace_open( + const PidRef *pidref, int *ret_pidns_fd, int *ret_mntns_fd, int *ret_netns_fd, @@ -52,13 +52,14 @@ int namespace_open( _cleanup_close_ int pidns_fd = -EBADF, mntns_fd = -EBADF, netns_fd = -EBADF, userns_fd = -EBADF, root_fd = -EBADF; + int r; - assert(pid >= 0); + assert(pidref_is_set(pidref)); if (ret_pidns_fd) { const char *pidns; - pidns = pid_namespace_path(pid, NAMESPACE_PID); + pidns = pid_namespace_path(pidref->pid, NAMESPACE_PID); pidns_fd = open(pidns, O_RDONLY|O_NOCTTY|O_CLOEXEC); if (pidns_fd < 0) return -errno; @@ -67,7 +68,7 @@ int namespace_open( if (ret_mntns_fd) { const char *mntns; - mntns = pid_namespace_path(pid, NAMESPACE_MOUNT); + mntns = pid_namespace_path(pidref->pid, NAMESPACE_MOUNT); mntns_fd = open(mntns, O_RDONLY|O_NOCTTY|O_CLOEXEC); if (mntns_fd < 0) return -errno; @@ -76,7 +77,7 @@ int namespace_open( if (ret_netns_fd) { const char *netns; - netns = pid_namespace_path(pid, NAMESPACE_NET); + netns = pid_namespace_path(pidref->pid, NAMESPACE_NET); netns_fd = open(netns, O_RDONLY|O_NOCTTY|O_CLOEXEC); if (netns_fd < 0) return -errno; @@ -85,7 +86,7 @@ int namespace_open( if (ret_userns_fd) { const char *userns; - userns = pid_namespace_path(pid, NAMESPACE_USER); + userns = pid_namespace_path(pidref->pid, NAMESPACE_USER); userns_fd = open(userns, O_RDONLY|O_NOCTTY|O_CLOEXEC); if (userns_fd < 0 && errno != ENOENT) return -errno; @@ -94,12 +95,16 @@ int namespace_open( if (ret_root_fd) { const char *root; - root = procfs_file_alloca(pid, "root"); + root = procfs_file_alloca(pidref->pid, "root"); root_fd = open(root, O_RDONLY|O_NOCTTY|O_CLOEXEC|O_DIRECTORY); if (root_fd < 0) return -errno; } + r = pidref_verify(pidref); + if (r < 0) + return r; + if (ret_pidns_fd) *ret_pidns_fd = TAKE_FD(pidns_fd); @@ -118,6 +123,22 @@ int namespace_open( return 0; } +int namespace_open( + pid_t pid, + int *ret_pidns_fd, + int *ret_mntns_fd, + int *ret_netns_fd, + int *ret_userns_fd, + int *ret_root_fd) { + + assert(pid >= 0); + + if (pid == 0) + pid = getpid_cached(); + + return pidref_namespace_open(&PIDREF_MAKE_FROM_PID(pid), ret_pidns_fd, ret_mntns_fd, ret_netns_fd, ret_userns_fd, ret_root_fd); +} + int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int root_fd) { int r; |