aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile.am17
-rw-r--r--lib/cgroup_file_handle.c84
-rw-r--r--lib/cgroup_file_handle.h23
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);