}
int cg_path_get_cgroupid(const char *path, uint64_t *ret) {
+ cg_file_handle fh = CG_FILE_HANDLE_INIT;
int mnt_id = -1;
assert(path);
assert(ret);
- union {
- struct file_handle f_handle;
- uint8_t space[offsetof(struct file_handle, f_handle) + sizeof(uint64_t)];
- } buf = {
- .f_handle.handle_bytes = sizeof(uint64_t),
- };
-
/* This is cgroupfs so we know the size of the handle, thus no need to loop around like
* name_to_handle_at_loop() does in mountpoint-util.c */
- if (name_to_handle_at(AT_FDCWD, path, &buf.f_handle, &mnt_id, 0) < 0)
+ if (name_to_handle_at(AT_FDCWD, path, &fh.file_handle, &mnt_id, 0) < 0)
return -errno;
- *ret = *(uint64_t *) buf.f_handle.f_handle;
-
+ *ret = CG_FILE_HANDLE_CGROUPID(fh);
return 0;
}
#pragma once
#include <dirent.h>
+#include <fcntl.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
const char* managed_oom_preference_to_string(ManagedOOMPreference a) _const_;
ManagedOOMPreference managed_oom_preference_from_string(const char *s) _pure_;
+
+/* The structure to pass to name_to_handle_at() on cgroupfs2 */
+typedef union {
+ struct file_handle file_handle;
+ uint8_t space[offsetof(struct file_handle, f_handle) + sizeof(uint64_t)];
+} cg_file_handle;
+
+#define CG_FILE_HANDLE_INIT { .file_handle.handle_bytes = sizeof(uint64_t) }
+#define CG_FILE_HANDLE_CGROUPID(fh) (*(uint64_t*) (fh).file_handle.f_handle)