diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Makefile.am | 17 | ||||
-rw-r--r-- | lib/cgroup_file_handle.c | 84 | ||||
-rw-r--r-- | lib/cgroup_file_handle.h | 23 |
3 files changed, 124 insertions, 0 deletions
diff --git a/lib/Makefile.am b/lib/Makefile.am new file mode 100644 index 0000000..f7c9705 --- /dev/null +++ b/lib/Makefile.am @@ -0,0 +1,17 @@ +# 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/>. + +noinst_LIBRARIES = libcgroupfilehandle.a +libcgroupfilehandle_a_SOURCES = cgroup_file_handle.c cgroup_file_handle.h 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; +} diff --git a/lib/cgroup_file_handle.h b/lib/cgroup_file_handle.h new file mode 100644 index 0000000..763f1d0 --- /dev/null +++ b/lib/cgroup_file_handle.h @@ -0,0 +1,23 @@ +/* + 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/>. +*/ + +#define _GNU_SOURCE +#include <stdio.h> + +#define CGROUP_FILE_HANDLE_BYTES 8 + +int get_cgroup_file_handle(const char *pathname, char *cgroupid); |