From: Karel Zak Date: Wed, 22 May 2024 09:32:55 +0000 (+0200) Subject: libmount: add mnt_context_sprintf_errmsg() X-Git-Tag: v2.42-start~320^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=41476dd406114f231bea5bc1aa6297cfbb5474ba;p=thirdparty%2Futil-linux.git libmount: add mnt_context_sprintf_errmsg() Let's make it easy to create error message and return the message to applications also when not generated by a syscall (kernel). Signed-off-by: Karel Zak --- diff --git a/libmount/src/context.c b/libmount/src/context.c index 7cf4ef79e..332e456e6 100644 --- a/libmount/src/context.c +++ b/libmount/src/context.c @@ -41,6 +41,7 @@ #include "namespace.h" #include "match.h" +#include #include /** @@ -2666,6 +2667,25 @@ int mnt_context_append_errmsg(struct libmnt_context *cxt, const char *msg) return strappend(&cxt->errmsg, msg); } +int mnt_context_sprintf_errmsg(struct libmnt_context *cxt, const char *msg, ...) +{ + int rc; + va_list ap; + char *p = NULL; + + va_start(ap, msg); + rc = vasprintf(&p, msg, ap); + va_end(ap); + + if (rc < 0 || !p) + return rc; + + free(cxt->errmsg); + cxt->errmsg = p; + + return 0; +} + /** * mnt_context_strerror * @cxt: context diff --git a/libmount/src/context_mount.c b/libmount/src/context_mount.c index 783244a61..53918c3fc 100644 --- a/libmount/src/context_mount.c +++ b/libmount/src/context_mount.c @@ -1433,6 +1433,11 @@ int mnt_context_get_mount_excode( mnt_context_get_user_mflags(cxt, &uflags); /* userspace flags */ if (!mnt_context_syscall_called(cxt)) { + if (buf && cxt->errmsg) { + xstrncpy(buf, cxt->errmsg, bufsz); + return MNT_EX_USAGE; + } + /* * libmount errors (extra library checks) */ diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h index db58e9f74..d3232bf1c 100644 --- a/libmount/src/mountP.h +++ b/libmount/src/mountP.h @@ -628,6 +628,7 @@ extern int mnt_context_mount_setopt(struct libmnt_context *cxt, int c, char *arg extern int mnt_context_set_errmsg(struct libmnt_context *cxt, const char *msg); extern int mnt_context_append_errmsg(struct libmnt_context *cxt, const char *msg); +extern int mnt_context_sprintf_errmsg(struct libmnt_context *cxt, const char *msg, ...); extern int mnt_context_propagation_only(struct libmnt_context *cxt) __attribute__((nonnull));