linux/tools/lib/api/fs/findfs.c
<<
>>
Prefs
   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