summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Zak2011-01-20 15:32:40 +0100
committerKarel Zak2011-01-22 00:27:26 +0100
commit8c0797e702773730ca3c1cc93039d4f7ef89dd39 (patch)
tree5bacf856ec429f3e590174bbbd3eefe493f9652f
parentlibmount: rename mount.h to libmount.h (diff)
downloadkernel-qcow2-util-linux-8c0797e702773730ca3c1cc93039d4f7ef89dd39.tar.gz
kernel-qcow2-util-linux-8c0797e702773730ca3c1cc93039d4f7ef89dd39.tar.xz
kernel-qcow2-util-linux-8c0797e702773730ca3c1cc93039d4f7ef89dd39.zip
libmount: add functions for mount.<type> helpers
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r--shlibs/mount/src/context.c16
-rw-r--r--shlibs/mount/src/context_mount.c62
-rw-r--r--shlibs/mount/src/libmount.h.in3
-rw-r--r--shlibs/mount/src/mount.sym2
-rw-r--r--shlibs/mount/src/mountP.h1
5 files changed, 79 insertions, 5 deletions
diff --git a/shlibs/mount/src/context.c b/shlibs/mount/src/context.c
index aad0b3930..b01d4bd04 100644
--- a/shlibs/mount/src/context.c
+++ b/shlibs/mount/src/context.c
@@ -47,7 +47,7 @@
*
* Returns: newly allocated mount context
*/
-mnt_context *mnt_new_context()
+mnt_context *mnt_new_context(void)
{
mnt_context *cxt;
uid_t ruid, euid;
@@ -1454,6 +1454,20 @@ int mnt_context_strerror(mnt_context *cxt, char *buf, size_t bufsiz)
return 0;
}
+/**
+ * mnt_context_init_helper
+ * @cxt: mount context
+ * @flags: not used
+ *
+ * This function infors libmount that used from [u]mount.<type> helper.
+ *
+ * Returns: 0 on success, negative number in case of error.
+ */
+int mnt_context_init_helper(mnt_context *cxt, int flags)
+{
+ return set_flag(cxt, MNT_FL_HELPER, 1);
+}
+
#ifdef TEST_PROGRAM
mnt_lock *lock;
diff --git a/shlibs/mount/src/context_mount.c b/shlibs/mount/src/context_mount.c
index 55cf48bf8..a54983fa4 100644
--- a/shlibs/mount/src/context_mount.c
+++ b/shlibs/mount/src/context_mount.c
@@ -218,6 +218,60 @@ static int evaluate_permissions(mnt_context *cxt)
return 0;
}
+/**
+ * mnt_context_mounthelper_setopt:
+ * @cxr: context
+ * @c: getopt() result
+ * @arg: getopt() optarg
+ *
+ * This function applies mount.<type> command line option (for example parsed
+ * by getopt() or getopt_long()) to @cxt. All unknown options are ignored and
+ * then 1 is returned.
+ *
+ * Returns: negative number on error, 1 if @c is unknown option, 0 on success.
+ */
+int mnt_context_mounthelper_setopt(mnt_context *cxt, int c, char *arg)
+{
+ int rc = -EINVAL;
+
+ if (!cxt || !c)
+ return -EINVAL;
+
+ switch(c) {
+ case 'f':
+ rc = mnt_context_enable_fake(cxt, TRUE);
+ break;
+ case 'n':
+ rc = mnt_context_disable_mtab(cxt, TRUE);
+ break;
+ case 'r':
+ rc = mnt_context_append_options(cxt, "ro");
+ break;
+ case 'v':
+ rc = mnt_context_enable_verbose(cxt, TRUE);
+ break;
+ case 'w':
+ rc = mnt_context_append_options(cxt, "rw");
+ break;
+ case 'o':
+ if (arg)
+ rc = mnt_context_append_options(cxt, arg);
+ break;
+ case 's':
+ rc = mnt_context_enable_sloppy(cxt, TRUE);
+ break;
+ case 't':
+ if (arg)
+ rc = mnt_context_set_fstype(cxt, arg);
+ break;
+ default:
+ return 1;
+ break;
+ }
+
+ return rc;
+}
+
static int exec_helper(mnt_context *cxt)
{
char *o = NULL;
@@ -254,13 +308,13 @@ static int exec_helper(mnt_context *cxt)
args[i++] = mnt_fs_get_srcpath(cxt->fs);/* 2 */
args[i++] = mnt_fs_get_target(cxt->fs); /* 3 */
- if (cxt->flags & MNT_FL_SLOPPY)
+ if (mnt_context_is_sloppy(cxt))
args[i++] = "-s"; /* 4 */
- if (cxt->flags & MNT_FL_FAKE)
+ if (mnt_context_is_fake(cxt))
args[i++] = "-f"; /* 5 */
- if (cxt->flags & MNT_FL_NOMTAB)
+ if (mnt_context_is_nomtab(cxt))
args[i++] = "-n"; /* 6 */
- if (cxt->flags & MNT_FL_VERBOSE)
+ if (mnt_context_is_verbose(cxt))
args[i++] = "-v"; /* 7 */
if (o) {
args[i++] = "-o"; /* 8 */
diff --git a/shlibs/mount/src/libmount.h.in b/shlibs/mount/src/libmount.h.in
index 84f768477..819bdddff 100644
--- a/shlibs/mount/src/libmount.h.in
+++ b/shlibs/mount/src/libmount.h.in
@@ -333,6 +333,9 @@ extern void mnt_free_context(mnt_context *cxt);
extern int mnt_reset_context(mnt_context *cxt);
extern int mnt_context_is_restricted(mnt_context *cxt);
+extern int mnt_context_init_helper(mnt_context *cxt, int flags)
+extern int mnt_context_mounthelper_setopt(mnt_context *cxt, int c, char *arg);
+
extern int mnt_context_set_optsmode(mnt_context *cxt, int mode);
extern int mnt_context_disable_canonicalize(mnt_context *cxt, int disable);
extern int mnt_context_enable_lazy(mnt_context *cxt, int enable);
diff --git a/shlibs/mount/src/mount.sym b/shlibs/mount/src/mount.sym
index e29372ed5..1a9ebb02d 100644
--- a/shlibs/mount/src/mount.sym
+++ b/shlibs/mount/src/mount.sym
@@ -32,6 +32,7 @@ global:
mnt_context_get_optsmode;
mnt_context_get_status;
mnt_context_get_userspace_mountflags;
+ mnt_context_init_helper;
mnt_context_is_fake;
mnt_context_is_force;
mnt_context_is_lazy;
@@ -40,6 +41,7 @@ global:
mnt_context_is_restricted;
mnt_context_is_sloppy;
mnt_context_is_verbose;
+ mnt_context_mounthelper_setopt;
mnt_context_prepare_mount;
mnt_context_set_cache;
mnt_context_set_fs;
diff --git a/shlibs/mount/src/mountP.h b/shlibs/mount/src/mountP.h
index f6c2e2117..5b8c89c55 100644
--- a/shlibs/mount/src/mountP.h
+++ b/shlibs/mount/src/mountP.h
@@ -287,6 +287,7 @@ struct _mnt_context
#define MNT_FL_MOUNTFLAGS_MERGED (1 << 22) /* MS_* flags was read from optstr */
#define MNT_FL_SAVED_USER (1 << 23)
#define MNT_FL_PREPARED (1 << 24)
+#define MNT_FL_HELPER (1 << 25) /* [u]mount.<type> */
/* default flags */
#define MNT_FL_DEFAULT 0