linux/tools/perf/util/sysfs.c
<<
>>
Prefs
   1
   2#include "util.h"
   3#include "sysfs.h"
   4
   5static const char * const sysfs_known_mountpoints[] = {
   6        "/sys",
   7        0,
   8};
   9
  10static int sysfs_found;
  11char sysfs_mountpoint[PATH_MAX + 1];
  12
  13static 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
  25const 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}
  61