diff options
author | Dave Reisner | 2012-04-26 02:30:52 +0200 |
---|---|---|
committer | Karel Zak | 2012-04-26 09:38:07 +0200 |
commit | b215d8e9a71ca8d22df6111ddc9d28bd896febb1 (patch) | |
tree | a20078fbe2302d167a96ee3eec61fa4920a1d9be /misc-utils/findmnt.c | |
parent | libmount: expose mnt_get_mountpoint as external API (diff) | |
download | kernel-qcow2-util-linux-b215d8e9a71ca8d22df6111ddc9d28bd896febb1.tar.gz kernel-qcow2-util-linux-b215d8e9a71ca8d22df6111ddc9d28bd896febb1.tar.xz kernel-qcow2-util-linux-b215d8e9a71ca8d22df6111ddc9d28bd896febb1.zip |
findmnt: add match_by_file to do within-device matching
Use the newly exported mnt_get_mountpoint to determine the device that a
given file resides on, in case the supplied source or target is not
explicitly a mount point.
http://www.spinics.net/lists/util-linux-ng/msg06081.html
Signed-off-by: Dave Reisner <dreisner@archlinux.org>
Diffstat (limited to 'misc-utils/findmnt.c')
-rw-r--r-- | misc-utils/findmnt.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/misc-utils/findmnt.c b/misc-utils/findmnt.c index cc71a6028..9db167f51 100644 --- a/misc-utils/findmnt.c +++ b/misc-utils/findmnt.c @@ -661,6 +661,30 @@ static int tab_is_tree(struct libmnt_table *tb) return rc; } +static int match_by_file(const char *name, struct libmnt_fs *fs, + int (*match_fn)(struct libmnt_fs*, const char*, struct libmnt_cache*)) +{ + char *resolved, *mountpoint; + int match; + + /* match exactly by name */ + if (match_fn(fs, name, cache)) + return 1; + + /* maybe its a file within a mountpoint */ + resolved = mnt_resolve_path(name, cache); + if (resolved) { + mountpoint = mnt_get_mountpoint(resolved); + if (mountpoint) { + match = match_fn(fs, mountpoint, cache); + free(mountpoint); + return match; + } + } + + return 0; +} + /* filter function for libmount (mnt_table_find_next_fs()) */ static int match_func(struct libmnt_fs *fs, void *data __attribute__ ((__unused__))) @@ -670,11 +694,11 @@ static int match_func(struct libmnt_fs *fs, void *md; m = get_match(COL_TARGET); - if (m && !mnt_fs_match_target(fs, m, cache)) + if (m && !match_by_file(m, fs, mnt_fs_match_target)) return rc; m = get_match(COL_SOURCE); - if (m && !mnt_fs_match_source(fs, m, cache)) + if (m && !match_by_file(m, fs, mnt_fs_match_source)) return rc; m = get_match(COL_FSTYPE); |