123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- #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;
- }
|