| #include "util.h" | |
| #include "sysfs.h" | |
| static const char * const sysfs_known_mountpoints[] = { | |
| "/sys", | |
| 0, | |
| }; | |
| static int sysfs_found; | |
| char sysfs_mountpoint[PATH_MAX + 1]; | |
| 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; | |
| } |