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 12int 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 */ 25const 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