diff options
Diffstat (limited to 'tools/perf/util/sysfs.c')
| -rw-r--r-- | tools/perf/util/sysfs.c | 60 | 
1 files changed, 60 insertions, 0 deletions
| diff --git a/tools/perf/util/sysfs.c b/tools/perf/util/sysfs.c new file mode 100644 index 000000000000..48c6902e749f --- /dev/null +++ b/tools/perf/util/sysfs.c @@ -0,0 +1,60 @@ + +#include "util.h" +#include "sysfs.h" + +static const char * const sysfs_known_mountpoints[] = { +	"/sys", +	0, +}; + +static int sysfs_found; +char sysfs_mountpoint[PATH_MAX]; + +static int sysfs_valid_mountpoint(const char *sysfs) +{ +	struct statfs st_fs; + +	if (statfs(sysfs, &st_fs) < 0) +		return -ENOENT; +	else if (st_fs.f_type != (long) SYSFS_MAGIC) +		return -ENOENT; + +	return 0; +} + +const char *sysfs_find_mountpoint(void) +{ +	const char * const *ptr; +	char type[100]; +	FILE *fp; + +	if (sysfs_found) +		return (const char *) sysfs_mountpoint; + +	ptr = sysfs_known_mountpoints; +	while (*ptr) { +		if (sysfs_valid_mountpoint(*ptr) == 0) { +			sysfs_found = 1; +			strcpy(sysfs_mountpoint, *ptr); +			return sysfs_mountpoint; +		} +		ptr++; +	} + +	/* give up and parse /proc/mounts */ +	fp = fopen("/proc/mounts", "r"); +	if (fp == NULL) +		return NULL; + +	while (!sysfs_found && +	       fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n", +		      sysfs_mountpoint, type) == 2) { + +		if (strcmp(type, "sysfs") == 0) +			sysfs_found = 1; +	} + +	fclose(fp); + +	return sysfs_found ? sysfs_mountpoint : NULL; +} | 
