Linux Audio

Check our new training course

Loading...
 1
 2#include "util.h"
 3#include "sysfs.h"
 4
 5static const char * const sysfs_known_mountpoints[] = {
 6	"/sys",
 7	0,
 8};
 9
10static int sysfs_found;
11char sysfs_mountpoint[PATH_MAX];
12
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
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}