*/
#include "defs.h"
+#include <signal.h>
#ifndef NSIG
# warning NSIG is not defined, using 32
SYS_FUNC(sigsuspend)
{
- if (entering(tcp)) {
- tprintsigmask_val("", tcp->u_arg[2]);
- }
- return 0;
+ tprintsigmask_val("", tcp->u_arg[2]);
+
+ return RVAL_DECODED;
}
#ifdef HAVE_SIGACTION
SYS_FUNC(kill)
{
- if (entering(tcp)) {
- tprintf("%ld, %s",
- widen_to_long(tcp->u_arg[0]),
- signame(tcp->u_arg[1])
- );
- }
- return 0;
+ tprintf("%ld, %s",
+ widen_to_long(tcp->u_arg[0]),
+ signame(tcp->u_arg[1]));
+
+ return RVAL_DECODED;
}
SYS_FUNC(tgkill)
{
- if (entering(tcp)) {
- tprintf("%ld, %ld, %s",
- widen_to_long(tcp->u_arg[0]),
- widen_to_long(tcp->u_arg[1]),
- signame(tcp->u_arg[2])
- );
- }
- return 0;
+ tprintf("%ld, %ld, %s",
+ widen_to_long(tcp->u_arg[0]),
+ widen_to_long(tcp->u_arg[1]),
+ signame(tcp->u_arg[2]));
+
+ return RVAL_DECODED;
}
SYS_FUNC(sigpending)
SYS_FUNC(rt_sigsuspend)
{
- if (entering(tcp)) {
- /* NB: kernel requires arg[1] == NSIG / 8 */
- print_sigset_addr_len(tcp, tcp->u_arg[0], tcp->u_arg[1]);
- tprintf(", %lu", tcp->u_arg[1]);
- }
- return 0;
+ /* NB: kernel requires arg[1] == NSIG / 8 */
+ print_sigset_addr_len(tcp, tcp->u_arg[0], tcp->u_arg[1]);
+ tprintf(", %lu", tcp->u_arg[1]);
+
+ return RVAL_DECODED;
}
static void
SYS_FUNC(rt_sigqueueinfo)
{
- if (entering(tcp)) {
- tprintf("%lu, ", tcp->u_arg[0]);
- print_sigqueueinfo(tcp, tcp->u_arg[1], tcp->u_arg[2]);
- }
- return 0;
+ tprintf("%lu, ", tcp->u_arg[0]);
+ print_sigqueueinfo(tcp, tcp->u_arg[1], tcp->u_arg[2]);
+
+ return RVAL_DECODED;
}
SYS_FUNC(rt_tgsigqueueinfo)
{
- if (entering(tcp)) {
- tprintf("%lu, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
- print_sigqueueinfo(tcp, tcp->u_arg[2], tcp->u_arg[3]);
- }
- return 0;
+ tprintf("%lu, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
+ print_sigqueueinfo(tcp, tcp->u_arg[2], tcp->u_arg[3]);
+
+ return RVAL_DECODED;
}
SYS_FUNC(rt_sigtimedwait)
/* syscall exit, and u_arg[1] was NULL */
return 0;
}
+
+ /*
+ * Since the timeout parameter is read by the kernel
+ * on entering syscall, it has to be decoded the same way
+ * whether the syscall has failed or not.
+ */
+ temporarily_clear_syserror(tcp);
print_timespec(tcp, tcp->u_arg[2]);
+ restore_cleared_syserror(tcp);
+
tprintf(", %lu", tcp->u_arg[3]);
return 0;
};
SYS_FUNC(restart_syscall)
{
- if (entering(tcp)) {
- tprintf("<... resuming interrupted %s ...>",
- tcp->s_prev_ent
- ? tcp->s_prev_ent->sys_name
- : "system call"
- );
- }
- return 0;
-}
+ tprintf("<... resuming interrupted %s ...>",
+ tcp->s_prev_ent ? tcp->s_prev_ent->sys_name : "system call");
-static int
-do_signalfd(struct tcb *tcp, int flags_arg)
-{
- /* NB: kernel requires arg[2] == NSIG / 8 */
- if (entering(tcp)) {
- printfd(tcp, tcp->u_arg[0]);
- tprints(", ");
- print_sigset_addr_len(tcp, tcp->u_arg[1], tcp->u_arg[2]);
- tprintf(", %lu", tcp->u_arg[2]);
- if (flags_arg >= 0) {
- tprints(", ");
- printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
- }
- }
- return 0;
-}
-
-SYS_FUNC(signalfd)
-{
- return do_signalfd(tcp, -1);
-}
-
-SYS_FUNC(signalfd4)
-{
- return do_signalfd(tcp, 3);
+ return RVAL_DECODED;
}