]> err.no Git - util-linux/commitdiff
libmount: add mnt_optstr_get_userspace_mountflags()
authorKarel Zak <kzak@redhat.com>
Wed, 15 Sep 2010 14:55:47 +0000 (16:55 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 3 Jan 2011 11:28:42 +0000 (12:28 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
shlibs/mount/src/Makefile.am
shlibs/mount/src/mount.h.in
shlibs/mount/src/mount.sym
shlibs/mount/src/optstr.c

index 9ce467370d9b694f32cb9ab60b39b7bdab9a4470..e007272c586fc6224a75fc996e96275c07d46795 100644 (file)
@@ -11,7 +11,7 @@ nodist_mountinc_HEADERS = mount.h
 usrlib_exec_LTLIBRARIES = libmount.la
 libmount_la_SOURCES =  mountP.h version.c utils.c test.c init.c cache.c \
                        optstr.c optmap.c iter.c lock.c \
-                       fs.c tab.c tab_parse.c tab_update.c \
+                       fs.c tab.c tab_parse.c tab_update.c context.c \
                        $(mountinc_HEADERS) \
                        $(top_srcdir)/lib/at.c \
                        $(top_srcdir)/include/list.h \
index b35d6452474628f298b8f1a92b38b5afd106274d..31406835b5650e6a813fb5976fe53a4216dc12de 100644 (file)
@@ -163,6 +163,7 @@ extern int mnt_split_optstr(const char *optstr,
                            int ifnore_user, int ignore_vfs);
 
 extern int mnt_optstr_get_mountflags(const char *optstr, unsigned long *flags);
+extern int mnt_optstr_get_userspace_mountflags(const char *optstr, unsigned long *flags);
 
 /* iter.c */
 enum {
index d0fa3085b2959ade9cdd70cccaca8e22ba44cd6c..0b7a9fe8017b0b5cc3d4d558a91b032cf27bdc60 100644 (file)
@@ -109,6 +109,7 @@ global:
        mnt_optstr_append_option;
        mnt_optstr_prepend_option;
        mnt_optstr_get_mountflags;
+       mnt_optstr_get_userspace_mountflags;
        mnt_optstr_get_option;
        mnt_optstr_next_option;
        mnt_optstr_remove_option;
index b809386aaccc51233e8839234799f0742467f743..c35777f2d2fec1bbcd99fb581e70571147e54c47 100644 (file)
@@ -438,27 +438,8 @@ int mnt_split_optstr(const char *optstr, char **user, char **vfs, char **fs,
        return 0;
 }
 
-
-/**
- * mnt_optstr_get_mountflags:
- * @optstr: string with comma separated list of options
- * @flags: returns mount flags
- *
- * The mountflags are IDs from all MNT_MFLAG options from MNT_LINUX_MAP options
- * map. See "struct mnt_optmap".  For more details about mountflags see
- * mount(2) syscall.
- *
- * For example:
- *
- *     "bind,exec,foo,bar"   --returns->   MS_BIND
- *
- *     "bind,noexec,foo,bar" --returns->   MS_BIND|MS_NOEXEC
- *
- * Note that @flags are not zeroized by this function.
- *
- * Returns: 0 on success or negative number in case of error
- */
-int mnt_optstr_get_mountflags(const char *optstr, unsigned long *flags)
+static int mnt_optstr_get_flags(const char *optstr, const struct mnt_optmap *map,
+                       unsigned long *flags, int mask_fltr)
 {
        struct mnt_optmap const *maps[1];
        char *name, *str = (char *) optstr;
@@ -466,17 +447,17 @@ int mnt_optstr_get_mountflags(const char *optstr, unsigned long *flags)
 
        assert(optstr);
 
-       if (!optstr || !flags)
+       if (!optstr || !flags || !map)
                return -EINVAL;
 
-       maps[0] = mnt_get_builtin_optmap(MNT_LINUX_MAP);
+       maps[0] = map;
 
        while(!mnt_optstr_next_option(&str, &name, &namesz, NULL, NULL)) {
                const struct mnt_optmap *ent;
 
                if (mnt_optmap_get_entry(maps, 1, name, namesz, &ent)) {
 
-                       if (!(ent->mask & MNT_MFLAG))
+                       if (mask_fltr && !(ent->mask & mask_fltr))
                                continue;
                        if (ent->mask & MNT_INVERT)
                                *flags &= ~ent->id;
@@ -485,10 +466,60 @@ int mnt_optstr_get_mountflags(const char *optstr, unsigned long *flags)
                }
        }
 
-       DBG(OPTIONS, mnt_debug("%s: mountflags 0x%08lx", optstr, *flags));
        return 0;
 }
 
+/**
+ * mnt_optstr_get_mountflags:
+ * @optstr: string with comma separated list of options
+ * @flags: returns mount flags
+ *
+ * The mountflags are IDs from all MNT_MFLAG options from MNT_LINUX_MAP options
+ * map. See "struct mnt_optmap".  For more details about mountflags see
+ * mount(2) syscall.
+ *
+ * For example:
+ *
+ *     "bind,exec,foo,bar"   --returns->   MS_BIND
+ *
+ *     "bind,noexec,foo,bar" --returns->   MS_BIND|MS_NOEXEC
+ *
+ * Note that @flags are not zeroized by this function.
+ *
+ * Returns: 0 on success or negative number in case of error
+ */
+int mnt_optstr_get_mountflags(const char *optstr, unsigned long *flags)
+{
+       return mnt_optstr_get_flags(optstr,
+                                   mnt_get_builtin_optmap(MNT_LINUX_MAP),
+                                   flags,
+                                   MNT_MFLAG);
+}
+
+/**
+ * mnt_optstr_get_userspace_mountflags:
+ * @optstr: string with comma separated list of options
+ * @flags: returns mount flags
+ *
+ * The mountflags are IDs from all MNT_USERSPACE_MAP options
+ * map. See "struct mnt_optmap". These flags are not used for mount(2) syscall.
+ *
+ * For example:
+ *
+ *     "bind,exec,loop"   --returns->   MNT_MS_LOOP
+ *
+ * Note that @flags are not zeroized by this function.
+ *
+ * Returns: 0 on success or negative number in case of error
+ */
+int mnt_optstr_get_userspace_mountflags(const char *optstr, unsigned long *flags)
+{
+       return mnt_optstr_get_flags(optstr,
+                                   mnt_get_builtin_optmap(MNT_USERSPACE_MAP),
+                                   flags,
+                                   0);
+}
+
 #ifdef TEST_PROGRAM
 
 int test_append(struct mtest *ts, int argc, char *argv[])
@@ -555,6 +586,32 @@ int test_split(struct mtest *ts, int argc, char *argv[])
        return rc;
 }
 
+int test_flags(struct mtest *ts, int argc, char *argv[])
+{
+       char *optstr;
+       int rc;
+       unsigned long fl = 0;
+
+       if (argc < 2)
+               return -EINVAL;
+
+       optstr = strdup(argv[1]);
+
+       rc = mnt_optstr_get_mountflags(optstr, &fl);
+       if (rc)
+               return rc;
+       printf("mountflags:           0x%08lx\n", fl);
+
+       fl = 0;
+       rc = mnt_optstr_get_userspace_mountflags(optstr, &fl);
+       if (rc)
+               return rc;
+       printf("userspace-mountflags: 0x%08lx\n", fl);
+
+       free(optstr);
+       return rc;
+}
+
 int test_set(struct mtest *ts, int argc, char *argv[])
 {
        const char *value = NULL, *name;
@@ -631,6 +688,7 @@ int main(int argc, char *argv[])
                { "--get",    test_get,    "<optstr> <name>            search name in optstr" },
                { "--remove", test_remove, "<optstr> <name>            remove name in optstr" },
                { "--split",  test_split,  "<optstr>                   split into FS, VFS and userspace" },
+               { "--flags",  test_flags,  "<optstr>                   convert options to MS_* flags" },
                { NULL }
        };
        return  mnt_run_test(tss, argc, argv);