]> err.no Git - util-linux/commitdiff
libmount: add mnt_optstr_get_mountflags()
authorKarel Zak <kzak@redhat.com>
Thu, 5 Aug 2010 10:24:59 +0000 (12:24 +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/mount.h.in
shlibs/mount/src/mount.sym
shlibs/mount/src/optstr.c

index 6a1cd19be29ce017b3a789278c7acecedb98cb86..a1944c5432323eafc680b9c17b114431f70f768c 100644 (file)
@@ -102,6 +102,27 @@ typedef struct _mnt_fs mnt_fs;
  */
 typedef struct _mnt_tab mnt_tab;
 
+/**
+ * mnt_mtab
+ *
+ * /etc/mtab or /var/run/mountinfo update description
+ */
+typedef struct _mnt_mtab mnt_mtab;
+
+/*
+ * Tab file format
+ */
+enum {
+       MNT_FMT_FSTAB = 1,              /* /etc/{fs,m}tab */
+       MNT_FMT_MTAB = MNT_FMT_FSTAB,   /* alias */
+       MNT_FMT_MOUNTINFO               /* /proc/#/mountinfo */
+};
+
+enum {
+       MNT_ACT_MOUNT = 1,
+       MNT_ACT_UMOUNT
+};
+
 /* init.c */
 extern void mnt_init_debug(int mask);
 
@@ -150,6 +171,8 @@ extern int mnt_split_optstr(const char *optstr,
                            char **user, char **vfs, char **fs,
                            int ifnore_user, int ignore_vfs);
 
+extern int mnt_optstr_get_mountflags(const char *optstr);
+
 /* iter.c */
 enum {
 
index d37bb8b128e1f2bb0b8d94af79b262979fd632ad..cf0f7753b0f090ffc56581e2409498ece48636ee 100644 (file)
@@ -103,6 +103,7 @@ global:
        mnt_optls_remove_option_by_flags;
        mnt_optls_remove_option_by_iflags;
        mnt_optstr_append_option;
+       mnt_optstr_get_mountflags;
        mnt_optstr_get_option;
        mnt_optstr_next_option;
        mnt_optstr_remove_option;
index f17bd7d3a554631204689c37eaea5afaed9bb899..c209784d72a6db85f711a09709b61cbb9be5f018 100644 (file)
@@ -406,6 +406,56 @@ 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
+ *
+ * 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
+ *
+ * Returns: mount flags or 0.
+ */
+int mnt_optstr_get_mountflags(const char *optstr)
+{
+       int flags = 0;
+       struct mnt_optmap const *maps[1];
+       char *name, *str = (char *) optstr;
+       size_t namesz = 0;
+
+       assert(optstr);
+
+       if (!optstr)
+               return -1;
+
+       maps[0] = mnt_get_builtin_optmap(MNT_LINUX_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))
+                               continue;
+                       if (ent->mask & MNT_INVERT)
+                               flags &= ~ent->id;
+                       else
+                               flags |= ent->id;
+               }
+       }
+
+       DBG(DEBUG_OPTIONS, fprintf(stderr,
+               "libmount: optstr '%s': mountflags 0x%08x", optstr, flags));
+       return flags;
+}
+
 #ifdef TEST_PROGRAM
 
 int test_append(struct mtest *ts, int argc, char *argv[])