* Add mnt_context_set_errmsg() and mnt_context_append_errmsg() functions.
* Replace custom code with mnt_context_syscall_save_status() function.
* Optionally use syscall name when generating error message.
Signed-off-by: Karel Zak <kzak@redhat.com>
cxt->syscall_status = 0;
cxt->syscall_name = NULL;
- free(cxt->syscall_errmsg);
- cxt->syscall_errmsg = NULL;
+ free(cxt->errmsg);
+ cxt->errmsg = NULL;
+}
+
+int mnt_context_set_errmsg(struct libmnt_context *cxt, const char *msg)
+{
+ char *p = NULL;
+
+ if (msg) {
+ p = strdup(msg);
+ if (!p)
+ return -ENOMEM;
+ }
+
+ free(cxt->errmsg);
+ cxt->errmsg = p;
+
+ return 0;
+}
+
+int mnt_context_append_errmsg(struct libmnt_context *cxt, const char *msg)
+{
+ if (cxt->errmsg) {
+ int rc = strappend(&cxt->errmsg, "; ");
+ if (rc)
+ return rc;
+ }
+
+ return strappend(&cxt->errmsg, msg);
}
/**
*/
syserr = mnt_context_get_syscall_errno(cxt);
- if (buf && cxt->syscall_errmsg) {
- snprintf(buf, bufsz, _("%s system call failed: %s"),
- cxt->syscall_name ? : "mount",
- cxt->syscall_errmsg);
+ if (buf && cxt->errmsg) {
+ if (cxt->syscall_name)
+ snprintf(buf, bufsz, _("%s system call failed: %s"),
+ cxt->syscall_name, cxt->errmsg);
+ else
+ xstrncpy(buf, cxt->errmsg, bufsz);
+
return MNT_EX_FAIL;
}
uint8_t buf[BUFSIZ];
int rc;
- free(cxt->syscall_errmsg);
- cxt->syscall_errmsg = NULL;
+ mnt_context_set_errmsg(cxt, NULL);
while ((rc = read(fd, buf, sizeof(buf))) != -1) {
if (rc > 0 && buf[rc - 1] == '\n')
if (rc < 3 || strncmp((char *) buf, "e ", 2) != 0)
continue;
- if (cxt->syscall_errmsg)
- strappend(&cxt->syscall_errmsg, "; ");
-
- strappend(&cxt->syscall_errmsg, ((char *) buf) + 2);
+ mnt_context_append_errmsg(cxt, ((char *) buf) + 2);
}
}
if (rc) {
/* Update global syscall status if only this function called */
- if (mnt_context_propagation_only(cxt)) {
- cxt->syscall_status = -errno;
- cxt->syscall_name = "mount";
- }
+ if (mnt_context_propagation_only(cxt))
+ mnt_context_syscall_save_status(cxt, "mount", rc == 0);
DBG(HOOK, ul_debugobj(hs, " mount(2) failed [errno=%d %m]", errno));
rc = -MNT_ERR_APPLYFLAGS;
options : "<none>"));
if (mount(src, target, type, flags, options)) {
- cxt->syscall_status = -errno;
- cxt->syscall_name = "mount";
- DBG(HOOK, ul_debugobj(hs, " mount(2) failed [errno=%d %m]",
- -cxt->syscall_status));
+ mnt_context_syscall_save_status(cxt, "mount", 0);
rc = -cxt->syscall_status;
return rc;
}
int syscall_status; /* 1: not called yet, 0: success, <0: -errno */
const char *syscall_name; /* failed syscall name */
- char *syscall_errmsg; /* message from kernel */
+ char *errmsg; /* library or kernel message */
struct libmnt_ns ns_orig; /* original namespace */
struct libmnt_ns ns_tgt; /* target namespace */
extern int mnt_context_umount_setopt(struct libmnt_context *cxt, int c, char *arg);
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_propagation_only(struct libmnt_context *cxt)
__attribute__((nonnull));