From: Mike Yuan Date: Tue, 19 Nov 2024 20:13:05 +0000 (+0100) Subject: cgroup-util: introduce generic cg_path_from_cgroupid() helper X-Git-Tag: v258-rc1~1704^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f1ba5c900b7e67b0b593ceaa2e1448373951a784;p=thirdparty%2Fsystemd.git cgroup-util: introduce generic cg_path_from_cgroupid() helper Taken from nsresourced/userns-registry.c userns_destroy_cgroup() --- diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c index 8247b0c25fc..50f1f0e4df2 100644 --- a/src/basic/cgroup-util.c +++ b/src/basic/cgroup-util.c @@ -68,6 +68,27 @@ int cg_cgroupid_open(int cgroupfs_fd, uint64_t id) { return RET_NERRNO(open_by_handle_at(cgroupfs_fd, &fh.file_handle, O_DIRECTORY|O_CLOEXEC)); } +int cg_path_from_cgroupid(int cgroupfs_fd, uint64_t id, char **ret) { + _cleanup_close_ int cgfd = -EBADF; + int r; + + cgfd = cg_cgroupid_open(cgroupfs_fd, id); + if (cgfd < 0) + return cgfd; + + _cleanup_free_ char *path = NULL; + r = fd_get_path(cgfd, &path); + if (r < 0) + return r; + + if (!path_startswith(path, "/sys/fs/cgroup/")) + return -EXDEV; /* recognizable error */ + + if (ret) + *ret = TAKE_PTR(path); + return 0; +} + int cg_get_cgroupid_at(int dfd, const char *path, uint64_t *ret) { cg_file_handle fh = CG_FILE_HANDLE_INIT; int mnt_id; diff --git a/src/basic/cgroup-util.h b/src/basic/cgroup-util.h index d471aee0c3a..49c3ea31386 100644 --- a/src/basic/cgroup-util.h +++ b/src/basic/cgroup-util.h @@ -183,6 +183,7 @@ typedef enum CGroupUnified { int cg_path_open(const char *controller, const char *path); int cg_cgroupid_open(int fsfd, uint64_t id); +int cg_path_from_cgroupid(int cgroupfs_fd, uint64_t id, char **ret); int cg_get_cgroupid_at(int dfd, const char *path, uint64_t *ret); static inline int cg_path_get_cgroupid(const char *path, uint64_t *ret) { return cg_get_cgroupid_at(AT_FDCWD, path, ret);