| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- /* 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 */
|