diff options
author | Steven Rostedt (Red Hat) <rostedt@goodmis.org> | 2015-02-02 14:35:03 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-02-07 07:51:34 -0500 |
commit | cde164aee9e0343831467035eb96dd5506742648 (patch) | |
tree | 8353fdc346aa319d7b88990ea007b22be9a372f3 /tools/lib/api/fs/findfs.c | |
parent | 5693c92660970851e95f769ff27397f5098a6296 (diff) |
tools lib fs: Add helper to find mounted file systems
In preparation for adding tracefs for perf to use, create a findfs
helper utility that find_debugfs uses instead of hard coding the search
in the code. This will allow for a find_tracefs to be used as well.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/r/20150202193552.735023362@goodmis.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/lib/api/fs/findfs.c')
-rw-r--r-- | tools/lib/api/fs/findfs.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/tools/lib/api/fs/findfs.c b/tools/lib/api/fs/findfs.c new file mode 100644 index 000000000000..49946cb6d7af --- /dev/null +++ b/tools/lib/api/fs/findfs.c | |||
@@ -0,0 +1,63 @@ | |||
1 | #include <errno.h> | ||
2 | #include <stdio.h> | ||
3 | #include <stdlib.h> | ||
4 | #include <string.h> | ||
5 | #include <stdbool.h> | ||
6 | #include <sys/vfs.h> | ||
7 | |||
8 | #include "findfs.h" | ||
9 | |||
10 | /* verify that a mountpoint is actually the type we want */ | ||
11 | |||
12 | int valid_mountpoint(const char *mount, long magic) | ||
13 | { | ||
14 | struct statfs st_fs; | ||
15 | |||
16 | if (statfs(mount, &st_fs) < 0) | ||
17 | return -ENOENT; | ||
18 | else if ((long)st_fs.f_type != magic) | ||
19 | return -ENOENT; | ||
20 | |||
21 | return 0; | ||
22 | } | ||
23 | |||
24 | /* find the path to a mounted file system */ | ||
25 | const char *find_mountpoint(const char *fstype, long magic, | ||
26 | char *mountpoint, int len, | ||
27 | const char * const *known_mountpoints) | ||
28 | { | ||
29 | const char * const *ptr; | ||
30 | char format[128]; | ||
31 | char type[100]; | ||
32 | FILE *fp; | ||
33 | |||
34 | if (known_mountpoints) { | ||
35 | ptr = known_mountpoints; | ||
36 | while (*ptr) { | ||
37 | if (valid_mountpoint(*ptr, magic) == 0) { | ||
38 | strncpy(mountpoint, *ptr, len - 1); | ||
39 | mountpoint[len-1] = 0; | ||
40 | return mountpoint; | ||
41 | } | ||
42 | ptr++; | ||
43 | } | ||
44 | } | ||
45 | |||
46 | /* give up and parse /proc/mounts */ | ||
47 | fp = fopen("/proc/mounts", "r"); | ||
48 | if (fp == NULL) | ||
49 | return NULL; | ||
50 | |||
51 | snprintf(format, 128, "%%*s %%%ds %%99s %%*s %%*d %%*d\n", len); | ||
52 | |||
53 | while (fscanf(fp, format, mountpoint, type) == 2) { | ||
54 | if (strcmp(type, fstype) == 0) | ||
55 | break; | ||
56 | } | ||
57 | fclose(fp); | ||
58 | |||
59 | if (strcmp(type, fstype) != 0) | ||
60 | return NULL; | ||
61 | |||
62 | return mountpoint; | ||
63 | } | ||