summaryrefslogtreecommitdiff
path: root/signal.c
diff options
context:
space:
mode:
Diffstat (limited to 'signal.c')
-rw-r--r--signal.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/signal.c b/signal.c
index bffdec0..5ff89e4 100644
--- a/signal.c
+++ b/signal.c
@@ -1180,13 +1180,27 @@ int
sys_sigprocmask(struct tcb *tcp)
{
#ifdef ALPHA
+ sigset_t ss;
if (entering(tcp)) {
+ /*
+ * Alpha/OSF is different: it doesn't pass in two pointers,
+ * but rather passes in the new bitmask as an argument and
+ * then returns the old bitmask. This "works" because we
+ * only have 64 signals to worry about. If you want more,
+ * use of the rt_sigprocmask syscall is required.
+ * Alpha:
+ * old = osf_sigprocmask(how, new);
+ * Everyone else:
+ * ret = sigprocmask(how, &new, &old, ...);
+ */
+ memcpy(&ss, &tcp->u_arg[1], sizeof(long));
printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???");
tprints(", ");
- printsigmask(tcp->u_arg[1], 0);
+ printsigmask(&ss, 0);
}
else if (!syserror(tcp)) {
- tcp->auxstr = sprintsigmask("old mask ", tcp->u_rval, 0);
+ memcpy(&ss, &tcp->u_rval, sizeof(long));
+ tcp->auxstr = sprintsigmask("old mask ", &ss, 0);
return RVAL_HEX | RVAL_STR;
}
#else /* !ALPHA */