summaryrefslogtreecommitdiffstats
path: root/src/basic/namespace-util.c
diff options
context:
space:
mode:
authorMike Yuan <me@yhndnzj.com>2024-07-22 20:11:54 +0200
committerMike Yuan <me@yhndnzj.com>2024-07-23 19:30:54 +0200
commit86a3c1fd95b35f307789f311d5496088bada5e20 (patch)
tree97f396e3c850b16e8a55019ab90856240c030a41 /src/basic/namespace-util.c
parentnamespace-util: explicitly specify namespace_info[]'s size (diff)
downloadsystemd-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.c37
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;