| /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
| #pragma once |
| |
| #include <stdio.h> |
| |
| /* This needs to be after sys/mount.h */ |
| #include <libmount.h> |
| |
| #include "macro.h" |
| |
| DEFINE_TRIVIAL_CLEANUP_FUNC(struct libmnt_table*, mnt_free_table); |
| DEFINE_TRIVIAL_CLEANUP_FUNC(struct libmnt_iter*, mnt_free_iter); |
| |
| static inline 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; |
| } |