/* SPDX-License-Identifier: LGPL-2.1-or-later */ #include #include "libmount-util.h" int libmount_parse( const char *path, FILE *source, struct libmnt_table **ret_table, struct libmnt_iter **ret_iter) { _cleanup_(mnt_free_tablep) struct libmnt_table *table = NULL; _cleanup_(mnt_free_iterp) struct libmnt_iter *iter = NULL; int r; /* Older libmount seems to require this. */ assert(!source || path); table = mnt_new_table(); iter = mnt_new_iter(MNT_ITER_FORWARD); if (!table || !iter) return -ENOMEM; /* If source or path are specified, we use on the functions which ignore utab. * Only if both are empty, we use mnt_table_parse_mtab(). */ if (source) r = mnt_table_parse_stream(table, source, path); else if (path) r = mnt_table_parse_file(table, path); else r = mnt_table_parse_mtab(table, NULL); if (r < 0) return r; *ret_table = TAKE_PTR(table); *ret_iter = TAKE_PTR(iter); return 0; } int libmount_is_leaf( struct libmnt_table *table, struct libmnt_fs *fs) { int r; _cleanup_(mnt_free_iterp) struct libmnt_iter *iter_children = NULL; iter_children = mnt_new_iter(MNT_ITER_FORWARD); if (!iter_children) return log_oom(); /* We care only whether it exists, it is unused */ _unused_ struct libmnt_fs *child; r = mnt_table_next_child_fs(table, iter_children, fs, &child); if (r < 0) return r; return r == 1; }