Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.14-rc3 119 lines 2.0 kB view raw
1 2/* TODO merge/factor into tools/lib/lk/debugfs.c */ 3 4#include "util.h" 5#include "util/fs.h" 6 7static const char * const sysfs__fs_known_mountpoints[] = { 8 "/sys", 9 0, 10}; 11 12static const char * const procfs__known_mountpoints[] = { 13 "/proc", 14 0, 15}; 16 17struct fs { 18 const char *name; 19 const char * const *mounts; 20 char path[PATH_MAX + 1]; 21 bool found; 22 long magic; 23}; 24 25enum { 26 FS__SYSFS = 0, 27 FS__PROCFS = 1, 28}; 29 30static struct fs fs__entries[] = { 31 [FS__SYSFS] = { 32 .name = "sysfs", 33 .mounts = sysfs__fs_known_mountpoints, 34 .magic = SYSFS_MAGIC, 35 }, 36 [FS__PROCFS] = { 37 .name = "proc", 38 .mounts = procfs__known_mountpoints, 39 .magic = PROC_SUPER_MAGIC, 40 }, 41}; 42 43static bool fs__read_mounts(struct fs *fs) 44{ 45 bool found = false; 46 char type[100]; 47 FILE *fp; 48 49 fp = fopen("/proc/mounts", "r"); 50 if (fp == NULL) 51 return NULL; 52 53 while (!found && 54 fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n", 55 fs->path, type) == 2) { 56 57 if (strcmp(type, fs->name) == 0) 58 found = true; 59 } 60 61 fclose(fp); 62 return fs->found = found; 63} 64 65static int fs__valid_mount(const char *fs, long magic) 66{ 67 struct statfs st_fs; 68 69 if (statfs(fs, &st_fs) < 0) 70 return -ENOENT; 71 else if (st_fs.f_type != magic) 72 return -ENOENT; 73 74 return 0; 75} 76 77static bool fs__check_mounts(struct fs *fs) 78{ 79 const char * const *ptr; 80 81 ptr = fs->mounts; 82 while (*ptr) { 83 if (fs__valid_mount(*ptr, fs->magic) == 0) { 84 fs->found = true; 85 strcpy(fs->path, *ptr); 86 return true; 87 } 88 ptr++; 89 } 90 91 return false; 92} 93 94static const char *fs__get_mountpoint(struct fs *fs) 95{ 96 if (fs__check_mounts(fs)) 97 return fs->path; 98 99 return fs__read_mounts(fs) ? fs->path : NULL; 100} 101 102static const char *fs__mountpoint(int idx) 103{ 104 struct fs *fs = &fs__entries[idx]; 105 106 if (fs->found) 107 return (const char *)fs->path; 108 109 return fs__get_mountpoint(fs); 110} 111 112#define FS__MOUNTPOINT(name, idx) \ 113const char *name##__mountpoint(void) \ 114{ \ 115 return fs__mountpoint(idx); \ 116} 117 118FS__MOUNTPOINT(sysfs, FS__SYSFS); 119FS__MOUNTPOINT(procfs, FS__PROCFS);