diff options
author | Karel Zak <kzak@redhat.com> | 2015-03-10 13:35:56 +0100 |
---|---|---|
committer | Karel Zak <kzak@redhat.com> | 2015-03-12 10:21:58 +0100 |
commit | 93f9a8838963a1e6dad496c658954c41d3c854fd (patch) | |
tree | 2c9af37629820e17fccc9f7d0f1ec27466013121 | |
parent | 48367e2d9921d696dda937038cf2da6052590794 (diff) | |
download | util-linux-93f9a8838963a1e6dad496c658954c41d3c854fd.tar.gz |
libmount: cleanup fs root detection code
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r-- | libmount/src/mountP.h | 5 | ||||
-rw-r--r-- | libmount/src/tab.c | 32 | ||||
-rw-r--r-- | libmount/src/utils.c | 34 | ||||
-rw-r--r-- | tests/expected/libmount/utils-fs-root | 1 | ||||
-rw-r--r-- | tests/expected/libmount/utils-fs-root-subdir | 1 | ||||
-rw-r--r-- | tests/expected/libmount/utils-fs-root-subdir2 | 1 | ||||
-rwxr-xr-x | tests/ts/libmount/utils | 12 |
7 files changed, 26 insertions, 60 deletions
diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h index cdd57cc5b..5eefa7110 100644 --- a/libmount/src/mountP.h +++ b/libmount/src/mountP.h @@ -99,7 +99,6 @@ extern int mnt_get_uid(const char *username, uid_t *uid); extern int mnt_get_gid(const char *groupname, gid_t *gid); extern int mnt_in_group(gid_t gid); -extern char *mnt_get_fs_root(const char *path, const char *mountpoint); extern int mnt_open_uniq_filename(const char *filename, char **name); extern int mnt_has_regular_utab(const char **utab, int *writable); @@ -116,10 +115,6 @@ extern int mnt_table_set_parser_fltrcb( struct libmnt_table *tb, int (*cb)(struct libmnt_fs *, void *), void *data); -extern struct libmnt_fs *mnt_table_get_fs_root(struct libmnt_table *tb, - struct libmnt_fs *fs, - unsigned long mountflags, - char **fsroot); extern int __mnt_table_parse_mtab(struct libmnt_table *tb, const char *filename, struct libmnt_table *u_tb); diff --git a/libmount/src/tab.c b/libmount/src/tab.c index cd20ad0b2..09896ccb6 100644 --- a/libmount/src/tab.c +++ b/libmount/src/tab.c @@ -47,6 +47,7 @@ #include "strutils.h" #include "loopdev.h" #include "fileutils.h" +#include "canonicalize.h" int is_mountinfo(struct libmnt_table *tb) { @@ -1166,6 +1167,20 @@ struct libmnt_fs *mnt_table_find_devno(struct libmnt_table *tb, return NULL; } +static char *remove_mountpoint_from_path(const char *path, const char *mnt) +{ + char *res; + const char *p; + size_t sz; + + sz = strlen(mnt); + p = sz > 1 ? path + sz : path; + + res = *p ? strdup(p) : strdup("/"); + DBG(UTILS, ul_debug("%s fs-root is %s", path, res)); + return res; +} + /* * tb: /proc/self/mountinfo * fs: filesystem @@ -1185,7 +1200,8 @@ struct libmnt_fs *mnt_table_get_fs_root(struct libmnt_table *tb, unsigned long mountflags, char **fsroot) { - char *root = NULL, *mnt = NULL; + char *root = NULL; + const char *mnt = NULL; const char *fstype; struct libmnt_fs *src_fs = NULL; @@ -1203,10 +1219,15 @@ struct libmnt_fs *mnt_table_get_fs_root(struct libmnt_table *tb, DBG(TAB, ul_debug("fs-root for bind")); src = xsrc = mnt_resolve_spec(mnt_fs_get_source(fs), tb->cache); - if (src) - mnt = mnt_get_mountpoint(src); + if (src) { + struct libmnt_fs *fs = mnt_table_find_mountpoint(tb, + src, MNT_ITER_BACKWARD); + if (fs) + mnt = mnt_fs_get_target(fs); + } + if (mnt) - root = mnt_get_fs_root(src, mnt); + root = remove_mountpoint_from_path(src, mnt); if (xsrc && !tb->cache) { free(xsrc); @@ -1273,11 +1294,9 @@ dflt: DBG(TAB, ul_debug("FS root result: %s", root)); - free(mnt); return src_fs; err: free(root); - free(mnt); return NULL; } @@ -1710,6 +1729,7 @@ done: return rc; } + int main(int argc, char *argv[]) { struct libmnt_test tss[] = { diff --git a/libmount/src/utils.c b/libmount/src/utils.c index 6f4d1a19f..bc43a85cf 100644 --- a/libmount/src/utils.c +++ b/libmount/src/utils.c @@ -1010,28 +1010,6 @@ err: return NULL; } -char *mnt_get_fs_root(const char *path, const char *mnt) -{ - char *m = (char *) mnt, *res; - const char *p; - size_t sz; - - if (!m) - m = mnt_get_mountpoint(path); - if (!m) - return NULL; - - sz = strlen(m); - p = sz > 1 ? path + sz : path; - - if (m != mnt) - free(m); - - res = *p ? strdup(p) : strdup("/"); - DBG(UTILS, ul_debug("%s fs-root is %s", path, res)); - return res; -} - /* * Search for @name kernel command parametr. * @@ -1176,17 +1154,6 @@ int test_mountpoint(struct libmnt_test *ts, int argc, char *argv[]) return 0; } -int test_fsroot(struct libmnt_test *ts, int argc, char *argv[]) -{ - char *path = canonicalize_path(argv[1]), - *mnt = path ? mnt_get_fs_root(path, NULL) : NULL; - - printf("%s: %s\n", argv[1], mnt ? : "unknown"); - free(mnt); - free(path); - return 0; -} - int test_filesystems(struct libmnt_test *ts, int argc, char *argv[]) { char **filesystems = NULL; @@ -1277,7 +1244,6 @@ int main(int argc, char *argv[]) { "--ends-with", test_endswith, "<string> <prefix>" }, { "--append-string", test_appendstr, "<string> <appendix>" }, { "--mountpoint", test_mountpoint, "<path>" }, - { "--fs-root", test_fsroot, "<path>" }, { "--cd-parent", test_chdir, "<path>" }, { "--kernel-cmdline",test_kernel_cmdline, "<option> | <option>=" }, { "--mkdir", test_mkdir, "<path>" }, diff --git a/tests/expected/libmount/utils-fs-root b/tests/expected/libmount/utils-fs-root deleted file mode 100644 index 7746b2850..000000000 --- a/tests/expected/libmount/utils-fs-root +++ /dev/null @@ -1 +0,0 @@ -/proc: / diff --git a/tests/expected/libmount/utils-fs-root-subdir b/tests/expected/libmount/utils-fs-root-subdir deleted file mode 100644 index 09cdb8d46..000000000 --- a/tests/expected/libmount/utils-fs-root-subdir +++ /dev/null @@ -1 +0,0 @@ -/proc/sys/kernel: /sys/kernel diff --git a/tests/expected/libmount/utils-fs-root-subdir2 b/tests/expected/libmount/utils-fs-root-subdir2 deleted file mode 100644 index 2e8b89a2e..000000000 --- a/tests/expected/libmount/utils-fs-root-subdir2 +++ /dev/null @@ -1 +0,0 @@ -/etc: /etc diff --git a/tests/ts/libmount/utils b/tests/ts/libmount/utils index 211f015a9..8e087e34f 100755 --- a/tests/ts/libmount/utils +++ b/tests/ts/libmount/utils @@ -64,18 +64,6 @@ ts_init_subtest "mountpoint-root" ts_valgrind $TESTPROG --mountpoint / &> $TS_OUTPUT ts_finalize_subtest -ts_init_subtest "fs-root" -ts_valgrind $TESTPROG --fs-root /proc &> $TS_OUTPUT -ts_finalize_subtest - -ts_init_subtest "fs-root-subdir" -ts_valgrind $TESTPROG --fs-root /proc/sys/kernel &> $TS_OUTPUT -ts_finalize_subtest - -ts_init_subtest "fs-root-subdir2" -ts_valgrind $TESTPROG --fs-root /etc &> $TS_OUTPUT -ts_finalize_subtest - ts_init_subtest "kernel-cmdline" export LIBMOUNT_KERNEL_CMDLINE="$TS_SELF/files/kernel_cmdline" ts_valgrind $TESTPROG --kernel-cmdline selinux= &>> $TS_OUTPUT |