Jiri Olsa | e90fda0 | 2012-01-27 15:34:22 +0100 | [diff] [blame] | 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]; |
| 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 | } |