From 8c0797e702773730ca3c1cc93039d4f7ef89dd39 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 20 Jan 2011 15:32:40 +0100 Subject: [PATCH] libmount: add functions for mount. helpers Signed-off-by: Karel Zak --- shlibs/mount/src/context.c | 16 ++++++++- shlibs/mount/src/context_mount.c | 62 +++++++++++++++++++++++++++++--- shlibs/mount/src/libmount.h.in | 3 ++ shlibs/mount/src/mount.sym | 2 ++ shlibs/mount/src/mountP.h | 1 + 5 files changed, 79 insertions(+), 5 deletions(-) diff --git a/shlibs/mount/src/context.c b/shlibs/mount/src/context.c index aad0b393..b01d4bd0 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. 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 55cf48bf..a54983fa 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. 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 84f76847..819bdddf 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 e29372ed..1a9ebb02 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 f6c2e211..5b8c89c5 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. */ /* default flags */ #define MNT_FL_DEFAULT 0 -- 2.39.5