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 
valid_mountpoint(const char * mount,long magic)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 */
find_mountpoint(const char * fstype,long magic,char * mountpoint,int len,const char * const * known_mountpoints)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 }
64