diff options
author | Pasha <pasha@member.fsf.org> | 2023-07-17 20:05:02 +0000 |
---|---|---|
committer | Pasha <pasha@member.fsf.org> | 2023-07-17 20:05:02 +0000 |
commit | 1a13003efe953b88b34fcadef536bb09859bad34 (patch) | |
tree | 847fbf10983d549f2ba5cca20145707a11364a22 /lib/cgroup_file_handle.c | |
download | containercgroup-1a13003efe953b88b34fcadef536bb09859bad34.tar.gz containercgroup-1a13003efe953b88b34fcadef536bb09859bad34.tar.bz2 |
initial release
Diffstat (limited to 'lib/cgroup_file_handle.c')
-rw-r--r-- | lib/cgroup_file_handle.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/lib/cgroup_file_handle.c b/lib/cgroup_file_handle.c new file mode 100644 index 0000000..7097b10 --- /dev/null +++ b/lib/cgroup_file_handle.c @@ -0,0 +1,84 @@ +/* + Copyright (C) 2023 Pasha <pasha@bell01.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. +*/ + +#include "cgroup_file_handle.h" +#include <errno.h> +#include <fcntl.h> +#include <linux/magic.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/vfs.h> + +#ifndef CGROUP_SUPER_MAGIC +#define CGROUP_SUPER_MAGIC 0x27e0eb +#endif + +#ifndef CGROUP2_SUPER_MAGIC +#define CGROUP2_SUPER_MAGIC 0x63677270 +#endif + +int get_cgroup_file_handle(const char *pathname, char *cgroupfhp) { + struct statfs sfs; + int mount_id, fhsize, flags, dirfd, ret, err; + struct file_handle *fhp; + + err = 1; + ret = 0; + + err = statfs(pathname, &sfs); + if (err != 0) { + fprintf(stderr, "statfs on %s failed: %s\n", pathname, strerror(errno)); + return ret; + } + + if ((sfs.f_type != (typeof(sfs.f_type))CGROUP2_SUPER_MAGIC)) { + fprintf(stderr, "%s is not cgroup2 mount.\n", pathname); + return ret; + } + + fhsize = sizeof(*fhp); + fhp = malloc(fhsize); + if (!fhp) { + fprintf(stderr, "Cannot allocate memory for get_cgroup_file_handle(...)\n"); + return ret; + } + + flags = 0; + dirfd = AT_FDCWD; + fhp->handle_bytes = CGROUP_FILE_HANDLE_BYTES; + err = name_to_handle_at(dirfd, pathname, (struct file_handle *)fhp, &mount_id, + flags); + if (err != 0) { + fprintf(stderr, "name_to_handle_at failed: %s\n", strerror(errno)); + goto clean_exit; + } + + if (fhp->handle_bytes != CGROUP_FILE_HANDLE_BYTES) { + fprintf(stderr, "Unexpected handle size: %d. \n", fhp->handle_bytes); + goto clean_exit; + } + + memcpy(cgroupfhp, fhp->f_handle, + sizeof(unsigned char) * CGROUP_FILE_HANDLE_BYTES); + ret = 1; + +clean_exit: + free(fhp); + return ret; +} |