From: Karel Zak Date: Mon, 22 Mar 2021 10:24:49 +0000 (+0100) Subject: libmount: add mnt_table_over_fs() X-Git-Tag: v2.37-rc1~53 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a6055682811bac0dc5c6219bfde03c53290ad142;p=thirdparty%2Futil-linux.git libmount: add mnt_table_over_fs() The function returns the first over-mount for specified filesystem. Signed-off-by: Karel Zak --- diff --git a/libmount/docs/libmount-sections.txt b/libmount/docs/libmount-sections.txt index 911dc0a0f0..89b2b1e8ba 100644 --- a/libmount/docs/libmount-sections.txt +++ b/libmount/docs/libmount-sections.txt @@ -365,6 +365,7 @@ mnt_table_last_fs mnt_table_move_fs mnt_table_next_child_fs mnt_table_next_fs +mnt_table_over_fs mnt_table_parse_dir mnt_table_parse_file mnt_table_parse_fstab diff --git a/libmount/src/libmount.h.in b/libmount/src/libmount.h.in index b7b278d0e3..2d4d044e95 100644 --- a/libmount/src/libmount.h.in +++ b/libmount/src/libmount.h.in @@ -570,6 +570,8 @@ extern int mnt_table_move_fs(struct libmnt_table *src, struct libmnt_table *dst, extern int mnt_table_remove_fs(struct libmnt_table *tb, struct libmnt_fs *fs); extern int mnt_table_first_fs(struct libmnt_table *tb, struct libmnt_fs **fs); extern int mnt_table_last_fs(struct libmnt_table *tb, struct libmnt_fs **fs); +extern int mnt_table_over_fs(struct libmnt_table *tb, struct libmnt_fs *parent, + struct libmnt_fs **child); extern int mnt_table_next_fs(struct libmnt_table *tb, struct libmnt_iter *itr, struct libmnt_fs **fs); extern int mnt_table_next_child_fs(struct libmnt_table *tb, struct libmnt_iter *itr, diff --git a/libmount/src/libmount.sym b/libmount/src/libmount.sym index e98e44b9c6..85e89ad020 100644 --- a/libmount/src/libmount.sym +++ b/libmount/src/libmount.sym @@ -359,4 +359,5 @@ MOUNT_2_35 { MOUNT_2_37 { mnt_fs_get_vfs_options_all; + mnt_table_over_fs; } MOUNT_2_35; diff --git a/libmount/src/tab.c b/libmount/src/tab.c index e91254a712..465708f618 100644 --- a/libmount/src/tab.c +++ b/libmount/src/tab.c @@ -706,6 +706,55 @@ int mnt_table_next_child_fs(struct libmnt_table *tb, struct libmnt_iter *itr, return 0; } +/** + * mnt_table_over_fs: + * @tb: tab pointer + * @parent: pointer to parental FS + * @child: returns pointer to FS which over-mounting parent + * + * This function returns by @child the first filesystenm which is over-mounted + * on @parent. It means the mountpoint of @child is the same as for @parent and + * parent->id is the same as child->parent_id. + * + * Note that you need to call this function in loop until it returns 1 to get + * the highest filesystem. + * + * Example: + * + * + * while (mnt_table_over_fs(tb, cur, &over) == 0) { + * printf("%s overmounted by %d\n", mnt_fs_get_target(cur), mnt_fs_get_id(over)); + * cur = over; + * } + * + * + * + * Returns: 0 on success, negative number in case of error or 1 at the end of list. + */ +int mnt_table_over_fs(struct libmnt_table *tb, struct libmnt_fs *parent, + struct libmnt_fs **child) +{ + struct libmnt_iter itr; + int id; + const char *tgt; + + if (!tb || !parent || !is_mountinfo(tb)) + return -EINVAL; + + mnt_reset_iter(&itr, MNT_ITER_FORWARD); + id = mnt_fs_get_id(parent); + tgt = mnt_fs_get_target(parent); + + while (mnt_table_next_fs(tb, &itr, child) == 0) { + if (mnt_fs_get_parent_id(*child) == id && + mnt_fs_streq_target(*child, tgt) == 1) + return 0; + } + + *child = NULL; + return 1; /* nothing */ +} + /** * mnt_table_next_fs: * @tb: tab pointer