]> err.no Git - util-linux/commitdiff
libmount: improve mnt_get_fs_root() and mnt_get_mountpoint()
authorKarel Zak <kzak@redhat.com>
Wed, 28 Jul 2010 13:16:49 +0000 (15:16 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 3 Jan 2011 11:28:40 +0000 (12:28 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
shlibs/mount/src/mountP.h
shlibs/mount/src/utils.c

index 59ffb94e381f71e6f3a27fb88a99ef4c337ce46d..ea6a87c5c49dd110517bc7cbfb68c3fc25e47c94 100644 (file)
@@ -37,6 +37,8 @@
 #define DEBUG_OPTIONS  (1 << 3)
 #define DEBUG_LOCKS    (1 << 4)
 #define DEBUG_TAB      (1 << 5)
+#define DEBUG_MTAB     (1 << 6)
+#define DEBUG_UTILS    (1 << 7)
 #define DEBUG_ALL      0xFFFF
 
 #ifdef CONFIG_LIBMOUNT_DEBUG
@@ -74,7 +76,7 @@ extern char *mnt_get_username(const uid_t uid);
 extern int mnt_has_regular_mtab(void);
 
 extern char *mnt_get_mountpoint(const char *path);
-extern char *mnt_get_fs_root(const char *path);
+extern char *mnt_get_fs_root(const char *path, const char *mountpoint);
 
 /*
  * Generic iterator
index da2799b508aba10786b6b131bd8dfc5bea9512c8..55e060581437ac8d9c456eb0dd99dd2bfb76c40e 100644 (file)
@@ -381,7 +381,7 @@ char *mnt_get_mountpoint(const char *path)
        if (!mnt)
                return NULL;
        if (*mnt == '/' && *(mnt + 1) == '\0')
-               return mnt;                             /* root fs */
+               goto done;
 
        if (stat(mnt, &st))
                goto err;
@@ -397,31 +397,37 @@ char *mnt_get_mountpoint(const char *path)
                dir = st.st_dev;
                if (dir != base) {
                        *(p - 1) = '/';
-                       return mnt;
+                       goto done;
                }
                base = dir;
        } while (mnt && *(mnt + 1) != '\0');
 
        memcpy(mnt, "/", 2);
-       return mnt;             /* root fs */
+done:
+       DBG(DEBUG_UTILS, fprintf(stderr,
+               "libmount: utils: fs-root for %s is %s\n", path, mnt));
+       return mnt;
 err:
        free(mnt);
        return NULL;
 }
 
-char *mnt_get_fs_root(const char *path)
+char *mnt_get_fs_root(const char *path, const char *mnt)
 {
-       char *mnt = mnt_get_mountpoint(path);
+       char *m = (char *) mnt;
        const char *p;
        size_t sz;
 
-       if (!mnt)
+       if (!m)
+               m = mnt_get_mountpoint(path);
+       if (!m)
                return NULL;
 
-       sz = strlen(mnt);
+       sz = strlen(m);
        p = sz > 1 ? path + sz : path;
 
-       free(mnt);
+       if (m != mnt)
+               free(m);
 
        return *p ? strdup(p) : strdup("/");
 }