Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
sysfs.c
Go to the documentation of this file.
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;
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 }