brintos

brintos / linux-shallow public Read only

0
0
Text · 2.1 KiB · e1c3c06 Raw
115 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2 3#ifndef _USER_EVENTS_SELFTESTS_H4#define _USER_EVENTS_SELFTESTS_H5 6#include <sys/stat.h>7#include <sys/types.h>8#include <sys/mount.h>9#include <unistd.h>10#include <errno.h>11 12#include "../kselftest.h"13 14static inline void tracefs_unmount(void)15{16	umount("/sys/kernel/tracing");17}18 19static inline bool tracefs_enabled(char **message, bool *fail, bool *umount)20{21	struct stat buf;22	int ret;23 24	*message = "";25	*fail = false;26	*umount = false;27 28	/* Ensure tracefs is installed */29	ret = stat("/sys/kernel/tracing", &buf);30 31	if (ret == -1) {32		*message = "Tracefs is not installed";33		return false;34	}35 36	/* Ensure mounted tracefs */37	ret = stat("/sys/kernel/tracing/README", &buf);38 39	if (ret == -1 && errno == ENOENT) {40		if (mount(NULL, "/sys/kernel/tracing", "tracefs", 0, NULL) != 0) {41			*message = "Cannot mount tracefs";42			*fail = true;43			return false;44		}45 46		*umount = true;47 48		ret = stat("/sys/kernel/tracing/README", &buf);49	}50 51	if (ret == -1) {52		*message = "Cannot access tracefs";53		*fail = true;54		return false;55	}56 57	return true;58}59 60static inline bool user_events_enabled(char **message, bool *fail, bool *umount)61{62	struct stat buf;63	int ret;64 65	*message = "";66	*fail = false;67	*umount = false;68 69	if (getuid() != 0) {70		*message = "Must be run as root";71		*fail = true;72		return false;73	}74 75	if (!tracefs_enabled(message, fail, umount))76		return false;77 78	/* Ensure user_events is installed */79	ret = stat("/sys/kernel/tracing/user_events_data", &buf);80 81	if (ret == -1) {82		switch (errno) {83		case ENOENT:84			*message = "user_events is not installed";85			return false;86 87		default:88			*message = "Cannot access user_events_data";89			*fail = true;90			return false;91		}92	}93 94	return true;95}96 97#define USER_EVENT_FIXTURE_SETUP(statement, umount) do { \98	char *message; \99	bool fail; \100	if (!user_events_enabled(&message, &fail, &(umount))) { \101		if (fail) { \102			TH_LOG("Setup failed due to: %s", message); \103			ASSERT_FALSE(fail); \104		} \105		SKIP(statement, "Skipping due to: %s", message); \106	} \107} while (0)108 109#define USER_EVENT_FIXTURE_TEARDOWN(umount) do { \110	if ((umount))  \111		tracefs_unmount(); \112} while (0)113 114#endif /* _USER_EVENTS_SELFTESTS_H */115