]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: add mnt_context_sprintf_errmsg()
authorKarel Zak <kzak@redhat.com>
Wed, 22 May 2024 09:32:55 +0000 (11:32 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 22 May 2024 09:32:55 +0000 (11:32 +0200)
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 <kzak@redhat.com>
libmount/src/context.c
libmount/src/context_mount.c
libmount/src/mountP.h

index 7cf4ef79edc6bc9b48b254fe9114b404c343e292..332e456e66bccc41ec5bc076a0cdd22fcaccd69b 100644 (file)
@@ -41,6 +41,7 @@
 #include "namespace.h"
 #include "match.h"
 
+#include <stdarg.h>
 #include <sys/wait.h>
 
 /**
@@ -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
index 783244a61c37051ed66bf6c8f11697d3301a0192..53918c3fcae0e8208a31e6f979dd595887b84d80 100644 (file)
@@ -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)
                 */
index db58e9f749998c1ba9f6007580d22ddd0896013f..d3232bf1c44d5dd1b3a9fb808a16d4964258474e 100644 (file)
@@ -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));