diff options
author | Karel Zak <kzak@redhat.com> | 2013-08-20 14:35:13 +0200 |
---|---|---|
committer | Karel Zak <kzak@redhat.com> | 2013-08-20 14:35:13 +0200 |
commit | a2f17bb24ee7c3dd25639f78d5fd123161392e0c (patch) | |
tree | 1698c88363d887155b5054b8bfd1076dee3fe7c0 | |
parent | c643ad4d814f081aae19fd82acc1dd1a2aaf840d (diff) | |
download | util-linux-a2f17bb24ee7c3dd25639f78d5fd123161392e0c.tar.gz |
libmount: add mnt_table_is_empty(), improve table list usage
Currently you have to use mnt_table_remove_fs() + mnt_free_fs() to
destroy the list in the table. This is complicated in same situations.
This patch allows to use mnt_free_fs() only.
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r-- | libmount/docs/libmount-sections.txt | 1 | ||||
-rw-r--r-- | libmount/src/libmount.h.in | 1 | ||||
-rw-r--r-- | libmount/src/libmount.sym | 1 | ||||
-rw-r--r-- | libmount/src/mountP.h | 1 | ||||
-rw-r--r-- | libmount/src/tab.c | 36 | ||||
-rw-r--r-- | sys-utils/swapon.c | 6 |
6 files changed, 35 insertions, 11 deletions
diff --git a/libmount/docs/libmount-sections.txt b/libmount/docs/libmount-sections.txt index d5083216..f7004fcd 100644 --- a/libmount/docs/libmount-sections.txt +++ b/libmount/docs/libmount-sections.txt @@ -303,6 +303,7 @@ mnt_table_get_nents mnt_table_get_root_fs mnt_table_get_trailing_comment mnt_table_get_userdata +mnt_table_is_empty mnt_table_is_fs_mounted mnt_table_last_fs mnt_table_next_child_fs diff --git a/libmount/src/libmount.h.in b/libmount/src/libmount.h.in index 0a4f57a6..e09f472a 100644 --- a/libmount/src/libmount.h.in +++ b/libmount/src/libmount.h.in @@ -412,6 +412,7 @@ extern void mnt_free_table(struct libmnt_table *tb); extern int mnt_reset_table(struct libmnt_table *tb); extern int mnt_table_get_nents(struct libmnt_table *tb); +extern int mnt_table_is_empty(struct libmnt_table *tb); extern int mnt_table_set_userdata(struct libmnt_table *tb, void *data); extern void *mnt_table_get_userdata(struct libmnt_table *tb); diff --git a/libmount/src/libmount.sym b/libmount/src/libmount.sym index f9870e3c..be140000 100644 --- a/libmount/src/libmount.sym +++ b/libmount/src/libmount.sym @@ -269,6 +269,7 @@ global: mnt_table_get_intro_comment; mnt_table_get_trailing_comment; mnt_table_get_userdata; + mnt_table_is_empty; mnt_table_last_fs; mnt_table_replace_file; mnt_table_set_intro_comment; diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h index 1ba7d5c4..61b872ed 100644 --- a/libmount/src/mountP.h +++ b/libmount/src/mountP.h @@ -266,7 +266,6 @@ struct libmnt_fs { */ struct libmnt_table { int fmt; /* MNT_FMT_* file format */ - int nents; /* number of valid entries */ int comms; /* enable/disable comment parsing */ char *comm_intro; /* First comment in file */ char *comm_tail; /* Last comment in file */ diff --git a/libmount/src/tab.c b/libmount/src/tab.c index 2b258c7d..098bf368 100644 --- a/libmount/src/tab.c +++ b/libmount/src/tab.c @@ -92,7 +92,6 @@ int mnt_reset_table(struct libmnt_table *tb) mnt_free_fs(fs); } - tb->nents = 0; return 0; } @@ -123,8 +122,29 @@ void mnt_free_table(struct libmnt_table *tb) */ int mnt_table_get_nents(struct libmnt_table *tb) { + struct list_head *p; + int i = 0; + + assert(tb); + if (!tb) + return -EINVAL; + if (list_empty(&tb->ents)) + return 0; + list_for_each(p, &tb->ents) + i++; + return i; +} + +/** + * mnt_table_is_empty: + * @tb: pointer to tab + * + * Returns: 1 if the table is without filesystems, or 0. + */ +int mnt_table_is_empty(struct libmnt_table *tb) +{ assert(tb); - return tb ? tb->nents : 0; + return tb == NULL || list_empty(&tb->ents) ? 1 : 0; } /** @@ -372,7 +392,6 @@ int mnt_table_add_fs(struct libmnt_table *tb, struct libmnt_fs *fs) DBG(TAB, mnt_debug_h(tb, "add entry: %s %s", mnt_fs_get_source(fs), mnt_fs_get_target(fs))); - tb->nents++; return 0; } @@ -391,7 +410,6 @@ int mnt_table_remove_fs(struct libmnt_table *tb, struct libmnt_fs *fs) if (!tb || !fs) return -EINVAL; list_del(&fs->ents); - tb->nents--; return 0; } @@ -792,7 +810,7 @@ struct libmnt_fs *mnt_table_find_srcpath(struct libmnt_table *tb, const char *pa { struct libmnt_iter itr; struct libmnt_fs *fs = NULL; - int ntags = 0; + int ntags = 0, nents; char *cn; const char *p; @@ -818,8 +836,10 @@ struct libmnt_fs *mnt_table_find_srcpath(struct libmnt_table *tb, const char *pa DBG(TAB, mnt_debug_h(tb, "lookup canonical SRCPATH: '%s'", cn)); + nents = mnt_table_get_nents(tb); + /* canonicalized paths in struct libmnt_table */ - if (ntags < mnt_table_get_nents(tb)) { + if (ntags < nents) { mnt_reset_iter(&itr, direction); while(mnt_table_next_fs(tb, &itr, &fs) == 0) { if (mnt_fs_streq_srcpath(fs, cn)) @@ -862,7 +882,7 @@ struct libmnt_fs *mnt_table_find_srcpath(struct libmnt_table *tb, const char *pa } /* non-canonicalized paths in struct libmnt_table */ - if (ntags <= mnt_table_get_nents(tb)) { + if (ntags <= nents) { mnt_reset_iter(&itr, direction); while(mnt_table_next_fs(tb, &itr, &fs) == 0) { if (mnt_fs_is_netfs(fs) || mnt_fs_is_pseudofs(fs)) @@ -1210,7 +1230,7 @@ int mnt_table_is_fs_mounted(struct libmnt_table *tb, struct libmnt_fs *fstab_fs) DBG(FS, mnt_debug_h(fstab_fs, "is FS mounted? [target=%s]", mnt_fs_get_target(fstab_fs))); - if (mnt_fs_is_swaparea(fstab_fs) || mnt_table_get_nents(tb) == 0) { + if (mnt_fs_is_swaparea(fstab_fs) || mnt_table_is_empty(tb)) { DBG(FS, mnt_debug_h(fstab_fs, "- ignore (swap or no data)")); return 0; } diff --git a/sys-utils/swapon.c b/sys-utils/swapon.c index f1e24337..4b4b7160 100644 --- a/sys-utils/swapon.c +++ b/sys-utils/swapon.c @@ -188,12 +188,14 @@ static int display_summary(void) if (!st) return -1; + if (mnt_table_is_empty(st)) + return 0; + itr = mnt_new_iter(MNT_ITER_FORWARD); if (!itr) err(EXIT_FAILURE, _("failed to initialize libmount iterator")); - if (mnt_table_get_nents(st) > 0) - printf(_("%s\t\t\t\tType\t\tSize\tUsed\tPriority\n"), _("Filename")); + printf(_("%s\t\t\t\tType\t\tSize\tUsed\tPriority\n"), _("Filename")); while (mnt_table_next_fs(st, itr, &fs) == 0) { printf("%-39s\t%s\t%jd\t%jd\t%d\n", |