/* Copyright (C) 2023 Pasha 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 . */ #include "cgroup_file_handle.h" #include #include #include #include #include #include #include #include #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; }