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 sysfs_valid_mountpoint(const char * sysfs)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 sysfs_find_mountpoint(void)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