]> err.no Git - util-linux/commitdiff
libmount: add mnt_fs_prepend_optstr()
authorKarel Zak <kzak@redhat.com>
Tue, 14 Sep 2010 08:50:49 +0000 (10:50 +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/fs.c
shlibs/mount/src/mount.h.in
shlibs/mount/src/mount.sym
shlibs/mount/src/tab_parse.c
shlibs/mount/src/tab_update.c

index 11dbf6457a52ab23cf210a2ddc772fe96ad4a465..fad5da890331baf22f52e69e64acc30d50a5cad8 100644 (file)
@@ -483,12 +483,40 @@ int mnt_fs_append_optstr(mnt_fs *fs, const char *optstr)
        return rc;
 }
 
+/**
+ * mnt_fs_prepend_optstr:
+ * @fs: fstab/mtab/mountinfo entry
+ * @optstr: mount options
+ *
+ * Returns: 0 on success or negative number in case of error.
+ */
+int mnt_fs_prepend_optstr(mnt_fs *fs, const char *optstr)
+{
+       char *v = NULL, *f = NULL;
+       int rc;
+
+       assert(fs);
+
+       if (!fs)
+               return -EINVAL;
+       if (!optstr)
+               return 0;
+
+       rc = mnt_split_optstr((char *) optstr, NULL, &v, &f, 0, 0);
+       if (!rc)
+               rc = mnt_optstr_prepend_option(&fs->optstr, optstr, NULL);
+       if (!rc && v)
+               rc = mnt_optstr_prepend_option(&fs->vfs_optstr, v, NULL);
+       if (!rc && f)
+              rc = mnt_optstr_prepend_option(&fs->fs_optstr, f, NULL);
+
+       return rc;
+}
+
 /**
  * mnt_fs_get_fs_optstr:
  * @fs: fstab/mtab/mountinfo entry pointer
  *
- * This function works for "mountinfo" files only.
- *
  * Returns: pointer to superblock (fs-depend) mount option string or NULL.
  */
 const char *mnt_fs_get_fs_optstr(mnt_fs *fs)
@@ -501,8 +529,6 @@ const char *mnt_fs_get_fs_optstr(mnt_fs *fs)
  * mnt_fs_get_vfs_optstr:
  * @fs: fstab/mtab entry pointer
  *
- * This function works for "mountinfo" files only.
- *
  * Returns: pointer to fs-independent (VFS) mount option string or NULL.
  */
 const char *mnt_fs_get_vfs_optstr(mnt_fs *fs)
index 559f59a41989f3beb01ac73cfd81292d842d1f77..b35d6452474628f298b8f1a92b38b5afd106274d 100644 (file)
@@ -209,6 +209,7 @@ extern int mnt_fs_set_fstype(mnt_fs *ent, const char *fstype);
 extern const char *mnt_fs_get_optstr(mnt_fs *ent);
 extern int mnt_fs_set_optstr(mnt_fs *ent, const char *optstr);
 extern int mnt_fs_append_optstr(mnt_fs *fs, const char *optstr);
+extern int mnt_fs_prepend_optstr(mnt_fs *fs, const char *optstr);
 extern int mnt_fs_append_userspace_optstr(mnt_fs *fs, const char *optstr);
 extern const char *mnt_fs_get_vfs_optstr(mnt_fs *ent);
 extern const char *mnt_fs_get_fs_optstr(mnt_fs *ent);
index af0cc88fb1966a5c85794671cdcf9e2ccd87a11c..d0fa3085b2959ade9cdd70cccaca8e22ba44cd6c 100644 (file)
@@ -19,6 +19,7 @@ global:
        mnt_free_optls;
        mnt_free_tab;
        mnt_fs_append_optstr;
+       mnt_fs_prepend_optstr;
        mnt_fs_append_userspace_optstr;
        mnt_fs_get_devno;
        mnt_fs_get_freq;
index 9c65c57ed6f6836170a64eef54933d4c29d1e286..e782b27815f99241ac80b45324571ce2b1155506 100644 (file)
@@ -116,6 +116,7 @@ static int next_number(char **s, int *num)
 static int mnt_tab_parse_file_line(mnt_fs *fs, char *s)
 {
        int rc = 0;
+       char *p = NULL;
 
        /* SOURCE */
        rc =__mnt_fs_set_source(fs, next_word(&s));
@@ -133,8 +134,8 @@ static int mnt_tab_parse_file_line(mnt_fs *fs, char *s)
                goto err;
 
        /* OPTS */
-       fs->optstr = next_word(&s);
-       if (!fs->optstr)
+       p = next_word(&s);
+       if (!p || mnt_fs_set_optstr(fs, p))
                goto err;
 
        /* default */
@@ -151,6 +152,7 @@ static int mnt_tab_parse_file_line(mnt_fs *fs, char *s)
 
        return 0;
 err:
+       free(p);
        if (rc)
                return rc;
        return errno == ENOMEM ? -ENOMEM : -EINVAL;
index c023777cb55f6b7ff59805c770963d5ad51e620a..3d60f46b4406356639ee5c9e28234cb34bcdd903 100644 (file)
@@ -585,16 +585,16 @@ int mnt_prepare_update(mnt_update *upd)
                return 0;
 
        /*
-        * A) classic /etc/mtab
+        * A) classic /etc/mtab or /etc/fstab update
         */
        if (upd->format != MNT_FMT_MOUNTINFO)
                return 0;
 
        /*
         * B) /var/run/mount/mountinfo
+        *  - remove all non-userspace mount options
         */
        if (upd->mountflags & MS_REMOUNT) {
-               /* remount */
                if (mnt_split_optstr(o, &u, NULL, NULL, MNT_NOMTAB, 0))
                        goto err;
                if (__mnt_fs_set_optstr(upd->fs, u, FALSE))