]> err.no Git - util-linux/commitdiff
libmount: extend mnt_update_* API
authorKarel Zak <kzak@redhat.com>
Thu, 30 Sep 2010 08:42:20 +0000 (10:42 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 3 Jan 2011 11:28:43 +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/tab_update.c

index cf491151c0b1f599b8b8c93b0e362166ff294cac..0124a329371205db88affc57e98d8162c9d6846b 100644 (file)
@@ -285,6 +285,8 @@ extern int mnt_tab_find_next_fs(mnt_tab *tb, mnt_iter *itr,
 extern mnt_update *mnt_new_update(int action, unsigned long mountflags, const mnt_fs *fs);
 extern void mnt_free_update(mnt_update *upd);
 extern int mnt_update_set_filename(mnt_update *upd, const char *filename);
+extern const char *mnt_update_get_filename(mnt_update *upd);
+extern int mnt_update_get_format(mnt_update *upd);
 extern int mnt_update_set_action(mnt_update *upd, int action);
 extern int mnt_update_set_format(mnt_update *upd, int format);
 extern int mnt_update_set_mountflags(mnt_update *upd, unsigned long flags);
@@ -295,6 +297,7 @@ extern int mnt_update_set_fs(mnt_update *upd, const mnt_fs *fs);
 
 extern int mnt_prepare_update(mnt_update *upd);
 extern int mnt_update_mtab(mnt_update *upd);
+extern int mnt_update_is_pointless(mnt_update *upd);
 
 /*
  * mount(8) userspace options masks (MNT_MAP_USERSPACE map)
index bb1ae4f92d91d275559f125324de03e58b463e33..19a723a476aefd2075e6f82c6111a8d6649cc482 100644 (file)
@@ -125,6 +125,8 @@ global:
        mnt_update_set_fs;
        mnt_update_set_mountflags;
        mnt_update_set_old_target;
+       mnt_update_get_format;
+       mnt_update_get_filename;
 local:
        *;
 };
index 1573b58ba2fd8ba4a25af0b2d380ccd49d3fd944..8b322ddef5d5b2516d824c2b70467674d89a3888 100644 (file)
@@ -64,6 +64,7 @@ struct _mnt_update {
        int             nolock;         /* don't alloca private mnt_lock */
        mnt_fs          *fs;            /* entry */
        mnt_lock        *lc;            /* lock or NULL */
+       int             pointless;      /* update is unnecessary */
 };
 
 /**
@@ -136,6 +137,20 @@ int mnt_update_set_filename(mnt_update *upd, const char *filename)
        return 0;
 }
 
+/**
+ * mnt_update_get_filename
+ * @upd: update
+ *
+ * Note that function returns NULL if the filename has not been defined (see
+ * mnt_update_set_filename()) or mnt_prepare_update() has not been called.
+ *
+ * Returns: filename or NULL.
+ */
+const char *mnt_update_get_filename(mnt_update *upd)
+{
+       return upd ? upd->filename : NULL;
+}
+
 /**
  * mnt_update_set_action:
  * @upd: update
@@ -174,11 +189,28 @@ int mnt_update_set_format(mnt_update *upd, int format)
        return 0;
 }
 
+/**
+ * mnt_update_get_format
+ * @upd: update
+ *
+ * Note that function returns zero if the format has not been defined (see
+ * mnt_update_set_format()) or mnt_prepare_update() has not been called.
+ *
+ * Returns: MNT_FMT_{MTAB,FSTAB,MOUNTINFO} or 0.
+ */
+int mnt_update_get_format(mnt_update *upd)
+{
+       return upd ? upd->format : 0;
+}
+
 /**
  * mnt_update_set_fs:
  * @upd: update
  * @fs: filesystem to write to file
  *
+ * This function replaces the current setting related to the current FS. Note that
+ * format, old target and mountflags are not reseted.
+ *
  * Returns; 0 on success, -1 in case of error.
  */
 int mnt_update_set_fs(mnt_update *upd, const mnt_fs *fs)
@@ -196,6 +228,7 @@ int mnt_update_set_fs(mnt_update *upd, const mnt_fs *fs)
 
        mnt_free_fs(upd->fs);
        upd->fs = x;
+       upd->pointless = FALSE;
        return 0;
 }
 
@@ -517,6 +550,20 @@ err:
        return -1;
 }
 
+/**
+ * mnt_update_is_pointless:
+ * @upd: update
+ *
+ * This function returns 1 if the previous mnt_prepare_update() call returned 1
+ * too.
+ *
+ * Returns: status of the update.
+ */
+int mnt_update_is_pointless(mnt_update *upd)
+{
+       return upd ? upd->pointless : 0;
+}
+
 /**
  * mnt_prepare_update:
  * @upd: update
@@ -642,6 +689,8 @@ err:
        DBG(UPDATE, mnt_debug_h(upd, "prepare update: failed"));
        return rc;
 nothing:
+       upd->pointless = TRUE;
+       DBG(UPDATE, mnt_debug_h(upd, "prepare update: pointless"));
        return 1;
 }
 
@@ -788,7 +837,8 @@ done:
  * @upd: update
  *
  * Updates the update file. The behavior of this function is undefined if
- * mnt_prepare_update() has not been called.
+ * mnt_prepare_update() has not been called. The request to update file will
+ * be ignored for pointless updates (see mnt_update_is_pointless()).
  *
  * Returns: 0 on success, -1 in case of error.
  */
@@ -802,6 +852,11 @@ int mnt_update_file(mnt_update *upd)
        if (!upd || !upd->fs)
                return -1;
 
+       if (upd->pointless) {
+               DBG(UPDATE, mnt_debug_h(upd, "ingnore update requiest (pointless)"));
+               return 0;
+       }
+
        DBG(UPDATE, mnt_debug_h(upd, "update (target %s)",
                mnt_fs_get_target(upd->fs)));
        /*