]>
Commit | Line | Data |
---|---|---|
e90fda06 JO |
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 | } |