* @return Shuffled or raw syscall number, respectively.
*/
extern kernel_ulong_t shuffle_scno(kernel_ulong_t scno);
-extern const char *err_name(unsigned long err);
+/**
+ * Print error name in accordance with current xlat style setting.
+ *
+ * @param err Error value.
+ * @param negated If set to true, negative values of the err parameter indicate
+ * error condition, otherwise positive.
+ */
+extern void print_err(int64_t err, bool negated);
extern bool is_erestart(struct tcb *);
extern void temporarily_clear_syserror(struct tcb *);
keyctl_reject_key(struct tcb *tcp, key_serial_t id1, unsigned timeout,
unsigned error, key_serial_t id2)
{
- const char *err_str = err_name(error);
-
print_keyring_serial_number(id1);
tprintf(", %u, ", timeout);
- print_xlat_ex(error, err_str, XLAT_STYLE_FMT_U);
+ print_err(error, false);
tprints(", ");
print_keyring_serial_number(id2);
}
return;
tprints("[");
- print_xlat_ex(err, err_name(err), XLAT_STYLE_FMT_U);
+ print_err(err, false);
tprints("]");
}
#include <linux/audit.h>
#include <linux/rtnetlink.h>
#include <linux/xfrm.h>
+#include "print_fields.h"
#include "xlat/netlink_ack_flags.h"
#include "xlat/netlink_delete_flags.h"
#include "xlat/netlink_flags.h"
if (umove_or_printaddr(tcp, addr, &err.error))
return;
- tprints("{error=");
- if (err.error < 0 && (unsigned) -err.error < nerrnos) {
- tprintf("-%s", errnoent[-err.error]);
- } else {
- tprintf("%d", err.error);
- }
+ PRINT_FIELD_ERR_D("{", err, error);
addr += offsetof(struct nlmsgerr, msg);
len -= offsetof(struct nlmsgerr, msg);
print_status(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
{
const int status = *(int *) elem_buf;
- bool is_errno = (status < 0) && ((unsigned) -status < nerrnos);
- if (!is_errno || xlat_verbose(xlat_verbosity) != XLAT_STYLE_ABBREV)
- tprintf("%d", status);
-
- if (!is_errno || xlat_verbose(xlat_verbosity) == XLAT_STYLE_RAW)
- return true;
-
- if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE)
- tprints(" /* ");
-
- tprintf("-%s", errnoent[-status]);
-
- if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE)
- tprints(" */");
+ print_err(status, true);
return true;
}
(xlat_), NULL); \
} while (0)
+#define PRINT_FIELD_ERR_D(prefix_, where_, field_) \
+ do { \
+ STRACE_PRINTF("%s%s=", (prefix_), #field_); \
+ print_err(sign_extend_unsigned_to_ll((where_).field_), \
+ true); \
+ } while (0)
+
+#define PRINT_FIELD_ERR_U(prefix_, where_, field_) \
+ do { \
+ STRACE_PRINTF("%s%s=", (prefix_), #field_); \
+ print_err(zero_extend_signed_to_ull((where_).field_), \
+ false); \
+ } while (0)
+
/*
* Generic "ID" printing. ID is considered unsigned except for the special value
* of -1.
#include "nr_prefix.c"
+#include "print_fields.h"
+
#ifndef IN_MPERS
# include "printsiginfo.h"
#endif
static void
print_si_info(const siginfo_t *sip)
{
- if (sip->si_errno) {
- tprints(", si_errno=");
- if ((unsigned) sip->si_errno < nerrnos
- && errnoent[sip->si_errno])
- tprints(errnoent[sip->si_errno]);
- else
- tprintf("%d", sip->si_errno);
- }
+ if (sip->si_errno)
+ PRINT_FIELD_ERR_U(", ", *sip, si_errno);
if (SI_FROMUSER(sip)) {
switch (sip->si_code) {
tprints(", exit={");
if (fetch_size >= expected_exit_size
&& info.exit.is_error) {
- uint64_t err = -info.exit.rval;
-
- tprints("rval=-");
- print_xlat_ex(err, err_name(err),
- XLAT_STYLE_FMT_U);
+ PRINT_FIELD_ERR_D("", info.exit, rval);
} else {
PRINT_FIELD_D("", info.exit, rval);
}
}
}
-const char *
-err_name(unsigned long err)
+static const char *
+err_name(uint64_t err)
+{
+ return err < nerrnos ? errnoent[err] : NULL;
+}
+
+void
+print_err(int64_t err, bool negated)
{
- if ((err < nerrnos) && errnoent[err])
- return errnoent[err];
+ const char *str = err_name(negated ? -err : err);
- return NULL;
+ if (!str || xlat_verbose(xlat_verbosity) != XLAT_STYLE_ABBREV)
+ tprintf(negated ? "%" PRId64 : "%" PRIu64, err);
+ if (!str || xlat_verbose(xlat_verbosity) == XLAT_STYLE_RAW)
+ return;
+ (xlat_verbose(xlat_verbosity) == XLAT_STYLE_ABBREV
+ ? tprintf : tprintf_comment)("%s%s",
+ negated ? "-" : "", str);
}
static void
sys_pidfd_send_signal(fd, SIGUSR2, si, -1);
printf("pidfd_send_signal(%d, SIGUSR2, {si_signo=SIGUSR1"
- ", si_code=SI_QUEUE, si_errno=%d, si_pid=%u, si_uid=%u"
+ ", si_code=SI_QUEUE, si_errno=%u, si_pid=%u, si_uid=%u"
", si_value={int=%d, ptr=%p}}, %#x) = %s\n",
fd, si->si_errno, si->si_pid, si->si_uid, si->si_int, si->si_ptr,
-1U, errstr);
do_ptrace(PTRACE_SETSIGINFO, pid, bad_request, (unsigned long) sip);
printf("ptrace(PTRACE_SETSIGINFO, %u, %#lx, {si_signo=SIGBUS"
- ", si_code=BUS_ADRALN, si_errno=%d, si_addr=%p}) = %s\n",
+ ", si_code=BUS_ADRALN, si_errno=%u, si_addr=%p}) = %s\n",
(unsigned) pid, bad_request, sip->si_errno, sip->si_addr,
errstr);
do_ptrace(PTRACE_SETSIGINFO, pid, bad_request, (unsigned long) sip);
printf("ptrace(PTRACE_SETSIGINFO, %u, %#lx, {si_signo=SIGPROF"
- ", si_code=%#x, si_errno=%d, si_pid=0, si_uid=3}) = %s\n",
+ ", si_code=%#x, si_errno=%u, si_pid=0, si_uid=3}) = %s\n",
(unsigned) pid, bad_request, sip->si_code, sip->si_errno,
errstr);
do_ptrace(PTRACE_SETSIGINFO, pid, bad_request, (unsigned long) sip);
printf("ptrace(PTRACE_SETSIGINFO, %u, %#lx, {si_signo=SIGSYS"
- ", si_code=SYS_SECCOMP, si_errno=%d, si_call_addr=NULL"
+ ", si_code=SYS_SECCOMP, si_errno=%u, si_call_addr=NULL"
", si_syscall=__NR_read, si_arch=%#x /* AUDIT_ARCH_??? */})"
" = %s\n",
(unsigned) pid, bad_request, sip->si_errno, sip->si_arch,