/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _USER_EVENTS_SELFTESTS_H #define _USER_EVENTS_SELFTESTS_H #include <sys/stat.h> #include <sys/types.h> #include <sys/mount.h> #include <unistd.h> #include <errno.h> #include "../kselftest.h" static inline void tracefs_unmount(void) { umount("/sys/kernel/tracing"); } static inline bool tracefs_enabled(char **message, bool *fail, bool *umount) { struct stat buf; int ret; *message = ""; *fail = false; *umount = false; /* Ensure tracefs is installed */ ret = stat("/sys/kernel/tracing", &buf); if (ret == -1) { *message = "Tracefs is not installed"; return false; } /* Ensure mounted tracefs */ ret = stat("/sys/kernel/tracing/README", &buf); if (ret == -1 && errno == ENOENT) { if (mount(NULL, "/sys/kernel/tracing", "tracefs", 0, NULL) != 0) { *message = "Cannot mount tracefs"; *fail = true; return false; } *umount = true; ret = stat("/sys/kernel/tracing/README", &buf); } if (ret == -1) { *message = "Cannot access tracefs"; *fail = true; return false; } return true; } static inline bool user_events_enabled(char **message, bool *fail, bool *umount) { struct stat buf; int ret; *message = ""; *fail = false; *umount = false; if (getuid() != 0) { *message = "Must be run as root"; *fail = true; return false; } if (!tracefs_enabled(message, fail, umount)) return false; /* Ensure user_events is installed */ ret = stat("/sys/kernel/tracing/user_events_data", &buf); if (ret == -1) { switch (errno) { case ENOENT: *message = "user_events is not installed"; return false; default: *message = "Cannot access user_events_data"; *fail = true; return false; } } return true; } #define USER_EVENT_FIXTURE_SETUP(statement, umount) do { \ char *message; \ bool fail; \ if (!user_events_enabled(&message, &fail, &(umount))) { \ if (fail) { \ TH_LOG("Setup failed due to: %s", message); \ ASSERT_FALSE(fail); \ } \ SKIP(statement, "Skipping due to: %s", message); \ } \ } while (0) #define USER_EVENT_FIXTURE_TEARDOWN(umount) do { \ if ((umount)) \ tracefs_unmount(); \ } while (0) #endif /* _USER_EVENTS_SELFTESTS_H */