summaryrefslogtreecommitdiffstats
path: root/libmount
diff options
context:
space:
mode:
authorKarel Zak2012-03-02 15:53:55 +0100
committerKarel Zak2012-03-02 15:53:55 +0100
commit6699e742f238d4bc15ac396dd56f0df1480bd36c (patch)
tree97461a5025b8e3dfda498a79b26367ca89ffcef6 /libmount
parentblkid: add DEVNAME= to export output format (diff)
downloadkernel-qcow2-util-linux-6699e742f238d4bc15ac396dd56f0df1480bd36c.tar.gz
kernel-qcow2-util-linux-6699e742f238d4bc15ac396dd56f0df1480bd36c.tar.xz
kernel-qcow2-util-linux-6699e742f238d4bc15ac396dd56f0df1480bd36c.zip
libmount: add mnt_fs_streq_target() and export all mnt_fs_streq_*
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libmount')
-rw-r--r--libmount/docs/libmount-sections.txt4
-rw-r--r--libmount/src/fs.c44
-rw-r--r--libmount/src/libmount.h.in3
-rw-r--r--libmount/src/libmount.sym6
-rw-r--r--libmount/src/mountP.h1
-rw-r--r--libmount/src/tab.c24
-rw-r--r--libmount/src/tab_parse.c15
7 files changed, 64 insertions, 33 deletions
diff --git a/libmount/docs/libmount-sections.txt b/libmount/docs/libmount-sections.txt
index b856d98a4..d99f6dcd2 100644
--- a/libmount/docs/libmount-sections.txt
+++ b/libmount/docs/libmount-sections.txt
@@ -174,9 +174,9 @@ mnt_fs_get_userdata
mnt_fs_get_user_options
mnt_fs_get_vfs_options
mnt_fs_is_kernel
-mnt_fs_is_swaparea
mnt_fs_is_netfs
mnt_fs_is_pseudofs
+mnt_fs_is_swaparea
mnt_fs_match_fstype
mnt_fs_match_options
mnt_fs_match_source
@@ -195,6 +195,8 @@ mnt_fs_set_source
mnt_fs_set_target
mnt_fs_set_userdata
mnt_fs_strdup_options
+mnt_fs_streq_srcpath
+mnt_fs_streq_target
mnt_fs_to_mntent
mnt_new_fs
mnt_reset_fs
diff --git a/libmount/src/fs.c b/libmount/src/fs.c
index ba57dabb3..167d7acef 100644
--- a/libmount/src/fs.c
+++ b/libmount/src/fs.c
@@ -350,22 +350,48 @@ int mnt_fs_set_source(struct libmnt_fs *fs, const char *source)
return rc;
}
+/**
+ * mnt_fs_streq_srcpath:
+ * @fs: fs
+ * @path: source path
+ *
+ * Compares @fs source path with @path. The tailing slash is ignored.
+ * See also mnt_fs_match_source().
+ *
+ * Returns: 1 if @fs source path equal to @path, otherwise 0.
+ */
int mnt_fs_streq_srcpath(struct libmnt_fs *fs, const char *path)
{
- const char *p = mnt_fs_get_srcpath(fs);
+ const char *p;
- if (p == NULL && path == NULL)
- return 1;
- if (p == NULL || path == NULL)
+ if (!fs)
return 0;
- if (mnt_fs_is_pseudofs(fs))
- /* don't think about pseudo-fs source as about path */
- return strcmp(p, path) == 0;
+ p = mnt_fs_get_srcpath(fs);
- return streq_except_trailing_slash(p, path);
+ if (!mnt_fs_is_pseudofs(fs))
+ return streq_except_trailing_slash(p, path);
+
+ if (!p && !path)
+ return 1;
+
+ return p && path && strcmp(p, path) == 0;
}
+/**
+ * mnt_fs_streq_target:
+ * @fs: fs
+ * @path: mount point
+ *
+ * Compares @fs target path with @path. The tailing slash is ignored.
+ * See also mnt_fs_match_target().
+ *
+ * Returns: 1 if @fs target path equal to @path, otherwise 0.
+ */
+int mnt_fs_streq_target(struct libmnt_fs *fs, const char *path)
+{
+ return fs && streq_except_trailing_slash(mnt_fs_get_target(fs), path);
+}
/**
* mnt_fs_get_tag:
@@ -1128,7 +1154,7 @@ int mnt_fs_match_target(struct libmnt_fs *fs, const char *target,
return 0;
/* 1) native paths */
- rc = !strcmp(target, fs->target);
+ rc = mnt_fs_streq_target(fs, target);
if (!rc && cache) {
/* 2) - canonicalized and non-canonicalized */
diff --git a/libmount/src/libmount.h.in b/libmount/src/libmount.h.in
index eedf25dfe..771952924 100644
--- a/libmount/src/libmount.h.in
+++ b/libmount/src/libmount.h.in
@@ -223,6 +223,9 @@ extern int mnt_fs_set_target(struct libmnt_fs *fs, const char *target);
extern const char *mnt_fs_get_fstype(struct libmnt_fs *fs);
extern int mnt_fs_set_fstype(struct libmnt_fs *fs, const char *fstype);
+extern int mnt_fs_streq_srcpath(struct libmnt_fs *fs, const char *path);
+extern int mnt_fs_streq_target(struct libmnt_fs *fs, const char *path);
+
extern char *mnt_fs_strdup_options(struct libmnt_fs *fs);
extern const char *mnt_fs_get_options(struct libmnt_fs *fs);
extern int mnt_fs_set_options(struct libmnt_fs *fs, const char *optstr);
diff --git a/libmount/src/libmount.sym b/libmount/src/libmount.sym
index 6889d9dd3..1d174bcb6 100644
--- a/libmount/src/libmount.sym
+++ b/libmount/src/libmount.sym
@@ -225,3 +225,9 @@ global:
mnt_get_library_features;
mnt_table_parse_dir;
} MOUNT_2.20;
+
+MOUNT_2.22 {
+global:
+ mnt_fs_streq_target;
+ mnt_fs_streq_srcpath;
+} MOUNT_2.21;
diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h
index f62acbd10..fa0edf50c 100644
--- a/libmount/src/mountP.h
+++ b/libmount/src/mountP.h
@@ -366,7 +366,6 @@ extern int mnt_optstr_fix_user(char **optstr);
extern struct libmnt_fs *mnt_copy_mtab_fs(const struct libmnt_fs *fs);
extern int __mnt_fs_set_source_ptr(struct libmnt_fs *fs, char *source);
extern int __mnt_fs_set_fstype_ptr(struct libmnt_fs *fs, char *fstype);
-extern int mnt_fs_streq_srcpath(struct libmnt_fs *fs, const char *path);
/* context.c */
extern int mnt_context_prepare_srcpath(struct libmnt_context *cxt);
diff --git a/libmount/src/tab.c b/libmount/src/tab.c
index d2a954bba..9992c9cf1 100644
--- a/libmount/src/tab.c
+++ b/libmount/src/tab.c
@@ -438,7 +438,7 @@ struct libmnt_fs *mnt_table_find_target(struct libmnt_table *tb, const char *pat
/* native @target */
mnt_reset_iter(&itr, direction);
while(mnt_table_next_fs(tb, &itr, &fs) == 0) {
- if (fs->target && streq_except_trailing_slash(fs->target, path))
+ if (mnt_fs_streq_target(fs, path))
return fs;
}
if (!tb->cache || !(cn = mnt_resolve_path(path, tb->cache)))
@@ -447,7 +447,7 @@ struct libmnt_fs *mnt_table_find_target(struct libmnt_table *tb, const char *pat
/* canonicalized paths in struct libmnt_table */
mnt_reset_iter(&itr, direction);
while(mnt_table_next_fs(tb, &itr, &fs) == 0) {
- if (fs->target && strcmp(fs->target, cn) == 0)
+ if (mnt_fs_streq_target(fs, cn))
return fs;
}
@@ -461,7 +461,8 @@ struct libmnt_fs *mnt_table_find_target(struct libmnt_table *tb, const char *pat
continue;
p = mnt_resolve_path(fs->target, tb->cache);
- if (strcmp(cn, p) == 0)
+ /* both canonicalized, strcmp() is fine here */
+ if (p && strcmp(cn, p) == 0)
return fs;
}
return NULL;
@@ -544,7 +545,9 @@ struct libmnt_fs *mnt_table_find_srcpath(struct libmnt_table *tb, const char *pa
if (mnt_fs_get_tag(fs, &t, &v))
continue;
x = mnt_resolve_tag(t, v, tb->cache);
- if (x && streq_except_trailing_slash(x, cn))
+
+ /* both canonicalized, strcmp() is fine here */
+ if (x && strcmp(x, cn) == 0)
return fs;
}
}
@@ -559,7 +562,9 @@ struct libmnt_fs *mnt_table_find_srcpath(struct libmnt_table *tb, const char *pa
p = mnt_fs_get_srcpath(fs);
if (p)
p = mnt_resolve_path(p, tb->cache);
- if (p && streq_except_trailing_slash(cn, p))
+
+ /* both canonicalized, strcmp() is fine here */
+ if (p && strcmp(p, cn) == 0)
return fs;
}
}
@@ -853,14 +858,11 @@ int mnt_table_is_fs_mounted(struct libmnt_table *tb, struct libmnt_fs *fstab_fs)
mnt_reset_iter(&itr, MNT_ITER_FORWARD);
while(mnt_table_next_fs(tb, &itr, &fs) == 0) {
- const char *t = mnt_fs_get_target(fs),
- *r = mnt_fs_get_root(fs);
+ const char *r = mnt_fs_get_root(fs);
- if (t && r
- && mnt_fs_get_srcpath(fs)
+ if (r && strcmp(r, root) == 0
&& mnt_fs_streq_srcpath(fs, src)
- && streq_except_trailing_slash(t, tgt)
- && strcmp(r, root) == 0)
+ && mnt_fs_streq_target(fs, tgt))
break;
}
if (fs)
diff --git a/libmount/src/tab_parse.c b/libmount/src/tab_parse.c
index 4d581c31e..28c8536af 100644
--- a/libmount/src/tab_parse.c
+++ b/libmount/src/tab_parse.c
@@ -728,21 +728,14 @@ static struct libmnt_fs *mnt_table_merge_user_fs(struct libmnt_table *tb, struct
mnt_reset_iter(&itr, MNT_ITER_BACKWARD);
while(mnt_table_next_fs(tb, &itr, &fs) == 0) {
- const char *s = mnt_fs_get_srcpath(fs),
- *t = mnt_fs_get_target(fs),
- *r = mnt_fs_get_root(fs);
+ const char *r = mnt_fs_get_root(fs);
if (fs->flags & MNT_FS_MERGED)
continue;
- /*
- * Note that kernel can add tailing slash to the network
- * filesystem source path
- */
- if (s && t && r &&
- strcmp(t, target) == 0 &&
- mnt_fs_streq_srcpath(fs, src) &&
- strcmp(r, root) == 0)
+ if (r && strcmp(r, root) == 0
+ && mnt_fs_streq_target(fs, target)
+ && mnt_fs_streq_srcpath(fs, src))
break;
}