From 8ab6accf014b1ba9f7437a78463dbed35f08cceb Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Fri, 13 Jan 2012 13:01:18 +0100 Subject: libmount: add functions to export syscall/helpers status Signed-off-by: Karel Zak --- libmount/src/context.c | 94 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 84 insertions(+), 10 deletions(-) (limited to 'libmount/src/context.c') diff --git a/libmount/src/context.c b/libmount/src/context.c index 83ce0b994..11b44f2ae 100644 --- a/libmount/src/context.c +++ b/libmount/src/context.c @@ -52,8 +52,8 @@ struct libmnt_context *mnt_new_context(void) ruid = getuid(); euid = geteuid(); - cxt->syscall_status = 1; /* not called yet */ - cxt->helper_exec_status = 1; + mnt_context_reset_status(cxt); + cxt->loopdev_fd = -1; /* if we're really root and aren't running setuid */ @@ -151,9 +151,8 @@ int mnt_reset_context(struct libmnt_context *cxt) cxt->user_mountflags = 0; cxt->mountdata = NULL; cxt->flags = MNT_FL_DEFAULT; - cxt->syscall_status = 1; - cxt->helper_exec_status = 1; - cxt->helper_status = 0; + + mnt_context_reset_status(cxt); /* restore non-resetable flags */ cxt->flags |= (fl & MNT_FL_EXTERN_FSTAB); @@ -172,6 +171,29 @@ int mnt_reset_context(struct libmnt_context *cxt) return 0; } +/** + * mnt_context_reset_status: + * @cxt: context + * + * Resets mount(2) and mount. statuses, so mnt_context_do_mount() or + * mnt_context_do_umount() could be again called with the same settings. + * + * BE CAREFUL -- after this soft reset the libmount will NOT parse mount + * options, evaluate permissions or apply stuff from fstab. + * + * Returns: 0 on success, negative number in case of error. + */ +int mnt_context_reset_status(struct libmnt_context *cxt) +{ + if (!cxt) + return -EINVAL; + + cxt->syscall_status = 1; /* means not called yet */ + cxt->helper_exec_status = 1; + cxt->helper_status = 0; + return 0; +} + static int set_flag(struct libmnt_context *cxt, int flag, int enable) { if (!cxt) @@ -1599,23 +1621,73 @@ int mnt_context_apply_fstab(struct libmnt_context *cxt) * mnt_context_get_status: * @cxt: mount context * - * Returns: 1 if /sbin/mount.type or mount(2) syscall was successfull. + * Returns: 1 if mount.type or mount(2) syscall was successful. */ int mnt_context_get_status(struct libmnt_context *cxt) { return cxt && (!cxt->syscall_status || !cxt->helper_exec_status); } +/** + * mnt_context_helper_executed: + * @cxt: mount context + * + * Returns: 1 if mount.type helper has been executed, or 0. + */ +int mnt_context_helper_executed(struct libmnt_context *cxt) +{ + return cxt->helper_exec_status != 1; +} + +/** + * mnt_context_get_helper_status: + * @cxt: mount context + * + * Return: mount. exit status, result is reliable only if + * mnt_context_helper_executed() returns 1. + */ +int mnt_context_get_helper_status(struct libmnt_context *cxt) +{ + return cxt->helper_status; +} + +/** + * mnt_context_syscall_called: + * @cxt: mount context + * + * Returns: 1 if mount(2) syscall has been called, or 0. + */ +int mnt_context_syscall_called(struct libmnt_context *cxt) +{ + return cxt->syscall_status != 1; +} + +/** + * mnt_context_get_syscall_errno: + * @cxt: mount context + * + * The result from this function is reliable only if + * mnt_context_syscall_called() returns 1. + * + * Returns: mount(2) errno if the syscall failed or 0. + */ +int mnt_context_get_syscall_errno(struct libmnt_context *cxt) +{ + if (cxt->syscall_status < 0) + return -cxt->syscall_status; + + return 0; +} + /** * mnt_context_set_syscall_status: * @cxt: mount context * @status: mount(2) status * - * The @status should be 0 on succcess, or negative number on error (-1 or - * -errno). + * The @status should be 0 on success, or negative number on error (-errno). * - * This function should be used if [u]mount(2) syscall was NOT called by - * libmount (by mnt_context_mount() or mnt_context_do_mount()) only. + * This function should be used only if [u]mount(2) syscall is NOT called by + * libmount code. * * Returns: 0 or negative number in case of error. */ @@ -1635,6 +1707,8 @@ int mnt_context_set_syscall_status(struct libmnt_context *cxt, int status) * @buf: buffer * @bufsiz: size of the buffer * + * Not implemented yet. + * * Returns: 0 or negative number in case of error. */ int mnt_context_strerror(struct libmnt_context *cxt __attribute__((__unused__)), -- cgit v1.2.3-55-g7522