78 lines · 1.7 KB · C
RawDownload
#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <stdbool.h>#include <sys/vfs.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/mount.h>#include <linux/kernel.h> #include "tracefs.h" #ifndef TRACEFS_DEFAULT_PATH#define TRACEFS_DEFAULT_PATH		"/sys/kernel/tracing"#endif char tracefs_mountpoint[PATH_MAX + 1] = TRACEFS_DEFAULT_PATH; static const char * const tracefs_known_mountpoints[] = {	TRACEFS_DEFAULT_PATH,	"/sys/kernel/debug/tracing",	"/tracing",	"/trace",	0,}; static bool tracefs_found; bool tracefs_configured(void){	return tracefs_find_mountpoint() != NULL;} /* find the path to the mounted tracefs */const char *tracefs_find_mountpoint(void){	const char *ret; 	if (tracefs_found)		return (const char *)tracefs_mountpoint; 	ret = find_mountpoint("tracefs", (long) TRACEFS_MAGIC,			      tracefs_mountpoint, PATH_MAX + 1,			      tracefs_known_mountpoints); 	if (ret)		tracefs_found = true; 	return ret;} /* mount the tracefs somewhere if it's not mounted */char *tracefs_mount(const char *mountpoint){	/* see if it's already mounted */	if (tracefs_find_mountpoint())		goto out; 	/* if not mounted and no argument */	if (mountpoint == NULL) {		/* see if environment variable set */		mountpoint = getenv(PERF_TRACEFS_ENVIRONMENT);		/* if no environment variable, use default */		if (mountpoint == NULL)			mountpoint = TRACEFS_DEFAULT_PATH;	} 	if (mount(NULL, mountpoint, "tracefs", 0, NULL) < 0)		return NULL; 	/* save the mountpoint */	tracefs_found = true;	strncpy(tracefs_mountpoint, mountpoint, sizeof(tracefs_mountpoint));out:	return tracefs_mountpoint;}