* [PATCH 1/2] libmount: expose mnt_get_mountpoint as external API @ 2012-04-26 0:30 Dave Reisner 2012-04-26 0:30 ` [PATCH 2/2] findmnt: add match_by_file to do within-device matching Dave Reisner 0 siblings, 1 reply; 6+ messages in thread From: Dave Reisner @ 2012-04-26 0:30 UTC (permalink / raw) To: util-linux; +Cc: Dave Reisner --- libmount/src/libmount.h.in | 1 + libmount/src/libmount.sym | 1 + libmount/src/mountP.h | 1 - libmount/src/utils.c | 9 +++++++++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/libmount/src/libmount.h.in b/libmount/src/libmount.h.in index 5c5edbb..e11c0c0 100644 --- a/libmount/src/libmount.h.in +++ b/libmount/src/libmount.h.in @@ -146,6 +146,7 @@ extern const char *mnt_get_fstab_path(void); extern const char *mnt_get_swaps_path(void); extern const char *mnt_get_mtab_path(void); extern int mnt_has_regular_mtab(const char **mtab, int *writable); +extern char *mnt_get_mountpoint(const char *path); /* cache.c */ extern struct libmnt_cache *mnt_new_cache(void); diff --git a/libmount/src/libmount.sym b/libmount/src/libmount.sym index ca7a305..d4d5b84 100644 --- a/libmount/src/libmount.sym +++ b/libmount/src/libmount.sym @@ -237,6 +237,7 @@ global: mnt_context_is_nohelpers; mnt_table_find_devno; mnt_table_parse_swaps; + mnt_get_mountpoint; mnt_get_swaps_path; mnt_fs_get_swaptype; mnt_fs_get_size; diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h index ee5e94f..c7d378e 100644 --- a/libmount/src/mountP.h +++ b/libmount/src/mountP.h @@ -139,7 +139,6 @@ extern int mnt_get_uid(const char *username, uid_t *uid); extern int mnt_get_gid(const char *groupname, gid_t *gid); extern int mnt_in_group(gid_t gid); -extern char *mnt_get_mountpoint(const char *path); extern char *mnt_get_fs_root(const char *path, const char *mountpoint); extern int mnt_open_uniq_filename(const char *filename, char **name); extern int mnt_has_regular_utab(const char **utab, int *writable); diff --git a/libmount/src/utils.c b/libmount/src/utils.c index e740d83..b824edc 100644 --- a/libmount/src/utils.c +++ b/libmount/src/utils.c @@ -785,6 +785,15 @@ int mnt_open_uniq_filename(const char *filename, char **name) return fd < 0 ? -errno : fd; } +/** + * mnt_get_mountpoint: + * @path: pathname + * + * This function finds the mountpoint that a given path resides in. @path + * should be canonicalized. The returned pointer should be freed by the caller. + * + * Returns: target of mounted device or NULL on error + */ char *mnt_get_mountpoint(const char *path) { char *mnt = strdup(path); -- 1.7.10 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2] findmnt: add match_by_file to do within-device matching 2012-04-26 0:30 [PATCH 1/2] libmount: expose mnt_get_mountpoint as external API Dave Reisner @ 2012-04-26 0:30 ` Dave Reisner 2012-04-26 2:16 ` Dave Reisner 0 siblings, 1 reply; 6+ messages in thread From: Dave Reisner @ 2012-04-26 0:30 UTC (permalink / raw) To: util-linux; +Cc: Dave Reisner 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> --- misc-utils/findmnt.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/misc-utils/findmnt.c b/misc-utils/findmnt.c index cc71a60..9db167f 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); -- 1.7.10 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] findmnt: add match_by_file to do within-device matching 2012-04-26 0:30 ` [PATCH 2/2] findmnt: add match_by_file to do within-device matching Dave Reisner @ 2012-04-26 2:16 ` Dave Reisner 2012-04-26 7:46 ` Karel Zak 2012-04-27 12:28 ` Karel Zak 0 siblings, 2 replies; 6+ messages in thread From: Dave Reisner @ 2012-04-26 2:16 UTC (permalink / raw) To: util-linux On Wed, Apr 25, 2012 at 08:30:52PM -0400, Dave Reisner wrote: > 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> > --- On second thought, this isn't good -- it'll return results even when you're searching with --fstab (which is completely undesirable, imo). > misc-utils/findmnt.c | 28 ++++++++++++++++++++++++++-- > 1 file changed, 26 insertions(+), 2 deletions(-) > > diff --git a/misc-utils/findmnt.c b/misc-utils/findmnt.c > index cc71a60..9db167f 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); > -- > 1.7.10 > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] findmnt: add match_by_file to do within-device matching 2012-04-26 2:16 ` Dave Reisner @ 2012-04-26 7:46 ` Karel Zak 2012-04-26 10:45 ` Dave Reisner 2012-04-27 12:28 ` Karel Zak 1 sibling, 1 reply; 6+ messages in thread From: Karel Zak @ 2012-04-26 7:46 UTC (permalink / raw) To: util-linux On Wed, Apr 25, 2012 at 10:16:51PM -0400, Dave Reisner wrote: > On Wed, Apr 25, 2012 at 08:30:52PM -0400, Dave Reisner wrote: > > 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> > > --- > > On second thought, this isn't good -- it'll return results even when > you're searching with --fstab (which is completely undesirable, imo). I'll fix it, that's easy. Thanks. > > 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)) why we need this functionality for SOURCE too? Karel -- Karel Zak <kzak@redhat.com> http://karelzak.blogspot.com ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] findmnt: add match_by_file to do within-device matching 2012-04-26 7:46 ` Karel Zak @ 2012-04-26 10:45 ` Dave Reisner 0 siblings, 0 replies; 6+ messages in thread From: Dave Reisner @ 2012-04-26 10:45 UTC (permalink / raw) To: Karel Zak; +Cc: util-linux [-- Attachment #1: Type: text/plain, Size: 1448 bytes --] On Apr 26, 2012 3:47 AM, "Karel Zak" <kzak@redhat.com> wrote: > > On Wed, Apr 25, 2012 at 10:16:51PM -0400, Dave Reisner wrote: > > On Wed, Apr 25, 2012 at 08:30:52PM -0400, Dave Reisner wrote: > > > 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> > > > --- > > > > On second thought, this isn't good -- it'll return results even when > > you're searching with --fstab (which is completely undesirable, imo). > > I'll fix it, that's easy. Thanks. > > > > 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)) > > why we need this functionality for SOURCE too? Ah. Silly of me. We definitely don't need this. > > Karel > > -- > Karel Zak <kzak@redhat.com> > http://karelzak.blogspot.com > -- > To unsubscribe from this list: send the line "unsubscribe util-linux" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html [-- Attachment #2: Type: text/html, Size: 2311 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] findmnt: add match_by_file to do within-device matching 2012-04-26 2:16 ` Dave Reisner 2012-04-26 7:46 ` Karel Zak @ 2012-04-27 12:28 ` Karel Zak 1 sibling, 0 replies; 6+ messages in thread From: Karel Zak @ 2012-04-27 12:28 UTC (permalink / raw) To: util-linux On Wed, Apr 25, 2012 at 10:16:51PM -0400, Dave Reisner wrote: > On Wed, Apr 25, 2012 at 08:30:52PM -0400, Dave Reisner wrote: > > 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> > > --- > > On second thought, this isn't good -- it'll return results even when > you're searching with --fstab (which is completely undesirable, imo). I have restricted the functionality ;-( - search with --kernel (this is default) - target has to be explicitly defined by --target option or if the source is explicitly defined by MAJ:MIN, UUID=, ... This restriction is required because findmnt(8) (like mount(8)) allows findmnt <device>|<mountpoint> and for example without this restriction, command findmnt /dev/sdb1 returns info about /dev tmpfs (because mnt_get_mountpoint() returns "/dev" as a mountpoint for path "/dev/sdb1" ;-) Note that source for mount(2) syscall could be whatever, including regular file, directory or any random string. All depends on filesystem driver(s). It means that we cannot make any decision about findmnt arguments if --target or --source are not explicitly given. Examples: $ findmnt /home/kzak/Pictures/ [nothing] $ findmnt --target /home/kzak/Pictures TARGET SOURCE FSTYPE OPTIONS /home/kzak /dev/mapper/luks-10d813de-fa82-4f67-a86c-23d5d0e7c30e ext4 rw,relat Karel -- Karel Zak <kzak@redhat.com> http://karelzak.blogspot.com ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2012-04-27 12:28 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-04-26 0:30 [PATCH 1/2] libmount: expose mnt_get_mountpoint as external API Dave Reisner 2012-04-26 0:30 ` [PATCH 2/2] findmnt: add match_by_file to do within-device matching Dave Reisner 2012-04-26 2:16 ` Dave Reisner 2012-04-26 7:46 ` Karel Zak 2012-04-26 10:45 ` Dave Reisner 2012-04-27 12:28 ` Karel Zak
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox