From: Karel Zak Date: Mon, 11 Nov 2024 11:45:00 +0000 (+0100) Subject: libmount: add mnt_table_find_[uniq]_id() function X-Git-Tag: v2.42-start~97^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b4cab6cc071034b7eff7dbc322300a83e2b49665;p=thirdparty%2Futil-linux.git libmount: add mnt_table_find_[uniq]_id() function Addresses: https://github.com/util-linux/util-linux/issues/3275 Signed-off-by: Karel Zak --- diff --git a/libmount/docs/libmount-sections.txt b/libmount/docs/libmount-sections.txt index 13259fa51..d2aa76ede 100644 --- a/libmount/docs/libmount-sections.txt +++ b/libmount/docs/libmount-sections.txt @@ -373,6 +373,7 @@ mnt_table_enable_noautofs mnt_table_fetch_listmount mnt_table_find_devno mnt_table_find_fs +mnt_table_find_id mnt_table_find_mountpoint mnt_table_find_next_fs mnt_table_find_pair @@ -381,6 +382,7 @@ mnt_table_find_srcpath mnt_table_find_tag mnt_table_find_target mnt_table_find_target_with_option +mnt_table_find_uniq_id mnt_table_first_fs mnt_table_get_cache mnt_table_get_intro_comment diff --git a/libmount/src/libmount.h.in b/libmount/src/libmount.h.in index 555c7be34..6779de7c6 100644 --- a/libmount/src/libmount.h.in +++ b/libmount/src/libmount.h.in @@ -681,6 +681,8 @@ extern struct libmnt_fs *mnt_table_find_pair(struct libmnt_table *tb, const char *target, int direction); extern struct libmnt_fs *mnt_table_find_devno(struct libmnt_table *tb, dev_t devno, int direction); +extern struct libmnt_fs *mnt_table_find_uniq_id(struct libmnt_table *tb, uint64_t id); +extern struct libmnt_fs *mnt_table_find_id(struct libmnt_table *tb, int id); extern int mnt_table_find_next_fs(struct libmnt_table *tb, struct libmnt_iter *itr, diff --git a/libmount/src/libmount.sym b/libmount/src/libmount.sym index d09b42635..8de169b6e 100644 --- a/libmount/src/libmount.sym +++ b/libmount/src/libmount.sym @@ -398,6 +398,8 @@ MOUNT_2_41 { mnt_statmnt_set_mask; mnt_table_enable_listmount; mnt_table_fetch_listmount; + mnt_table_find_id; + mnt_table_find_uniq_id; mnt_table_listmount_set_id; mnt_table_listmount_set_ns; mnt_table_listmount_set_stepsiz; diff --git a/libmount/src/tab.c b/libmount/src/tab.c index ba4eef850..8508715ea 100644 --- a/libmount/src/tab.c +++ b/libmount/src/tab.c @@ -1541,6 +1541,67 @@ struct libmnt_fs *mnt_table_find_devno(struct libmnt_table *tb, return NULL; } +/** + * mnt_table_find_id: + * @tb: mount table + * @id: classic mount ID + * + * See also mnt_id_from_path(). + * + * Returns: a tab entry or NULL. + * + * Since: 2.41 + */ +struct libmnt_fs *mnt_table_find_id(struct libmnt_table *tb, int id) +{ + struct libmnt_fs *fs = NULL; + struct libmnt_iter itr; + + if (!tb) + return NULL; + + DBG(TAB, ul_debugobj(tb, "lookup ID: %d", id)); + mnt_reset_iter(&itr, MNT_ITER_BACKWARD); + + while (mnt_table_next_fs(tb, &itr, &fs) == 0) { + if (mnt_fs_get_id(fs) == id) + return fs; + } + + return NULL; +} + +/** + * mnt_table_find_uniq_id: + * @tb: mount table + * @id: uniqie 64-bit mount ID + * + * See also mnt_id_from_path(). + * + * Returns: a tab entry or NULL. + * + * Since: 2.41 + */ +struct libmnt_fs *mnt_table_find_uniq_id(struct libmnt_table *tb, uint64_t id) +{ + struct libmnt_fs *fs = NULL; + struct libmnt_iter itr; + + if (!tb) + return NULL; + + DBG(TAB, ul_debugobj(tb, "lookup uniq-ID: %" PRIu64, id)); + mnt_reset_iter(&itr, MNT_ITER_BACKWARD); + + while (mnt_table_next_fs(tb, &itr, &fs) == 0) { + if (mnt_fs_get_uniq_id(fs) == id) + return fs; + } + + return NULL; +} + + static char *remove_mountpoint_from_path(const char *path, const char *mnt) { char *res; diff --git a/libmount/src/utils.c b/libmount/src/utils.c index a09037372..0601def97 100644 --- a/libmount/src/utils.c +++ b/libmount/src/utils.c @@ -319,8 +319,8 @@ int mnt_id_from_fd(int fd, uint64_t *uniq_id, int *id) /** * mnt_id_from_path: * @path: mountpoint - * @uniq_id: returns STATX_MNT_ID_UNIQUE - * @id: returns STATX_MNT_ID + * @uniq_id: returns STATX_MNT_ID_UNIQUE (optional) + * @id: returns STATX_MNT_ID (optional) * * Converts @path to ID. *