]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: cleanup fs root detection code
authorKarel Zak <kzak@redhat.com>
Tue, 10 Mar 2015 12:35:56 +0000 (13:35 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 10 Mar 2015 12:49:57 +0000 (13:49 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
libmount/src/mountP.h
libmount/src/tab.c
libmount/src/utils.c
tests/expected/libmount/utils-fs-root [deleted file]
tests/expected/libmount/utils-fs-root-subdir [deleted file]
tests/expected/libmount/utils-fs-root-subdir2 [deleted file]
tests/ts/libmount/utils

index cdd57cc5be0e292fb901fd5ee40dc0d4fa1375e6..5eefa71104453f3afe48dc7f81bba98c7aa50fd8 100644 (file)
@@ -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);
index cd20ad0b2b65b4a7b48532a12003e3b6b5591098..09896ccb619d8f4e80ac3c06e2b5612926cb1018 100644 (file)
@@ -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[] = {
index 6f4d1a19f726fd2856026259fc7bd39abfa6242e..bc43a85cf51418f8c7c42119b0e3e5659e9cbc26 100644 (file)
@@ -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 (file)
index 7746b28..0000000
+++ /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 (file)
index 09cdb8d..0000000
+++ /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 (file)
index 2e8b89a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/etc: /etc
index 211f015a93b8ef8d409d70d18f063aa229d010eb..8e087e34f65d1a0912eabd94ecc68d1f02bb72df 100755 (executable)
@@ -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