Merge branch 'next' into for-linus
[firefly-linux-kernel-4.4.55.git] / tools / perf / util / sysfs.c
1
2 #include "util.h"
3 #include "sysfs.h"
4
5 static const char * const sysfs_known_mountpoints[] = {
6         "/sys",
7         0,
8 };
9
10 static int sysfs_found;
11 char sysfs_mountpoint[PATH_MAX + 1];
12
13 static int sysfs_valid_mountpoint(const char *sysfs)
14 {
15         struct statfs st_fs;
16
17         if (statfs(sysfs, &st_fs) < 0)
18                 return -ENOENT;
19         else if (st_fs.f_type != (long) SYSFS_MAGIC)
20                 return -ENOENT;
21
22         return 0;
23 }
24
25 const char *sysfs_find_mountpoint(void)
26 {
27         const char * const *ptr;
28         char type[100];
29         FILE *fp;
30
31         if (sysfs_found)
32                 return (const char *) sysfs_mountpoint;
33
34         ptr = sysfs_known_mountpoints;
35         while (*ptr) {
36                 if (sysfs_valid_mountpoint(*ptr) == 0) {
37                         sysfs_found = 1;
38                         strcpy(sysfs_mountpoint, *ptr);
39                         return sysfs_mountpoint;
40                 }
41                 ptr++;
42         }
43
44         /* give up and parse /proc/mounts */
45         fp = fopen("/proc/mounts", "r");
46         if (fp == NULL)
47                 return NULL;
48
49         while (!sysfs_found &&
50                fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n",
51                       sysfs_mountpoint, type) == 2) {
52
53                 if (strcmp(type, "sysfs") == 0)
54                         sysfs_found = 1;
55         }
56
57         fclose(fp);
58
59         return sysfs_found ? sysfs_mountpoint : NULL;
60 }