Decode signal information returned by system calls.

Specifically, decode the siginfo structure returned by sigtimedwait(),
sigwaitinfo(), and wait6().  While here, also decode the signal number
returned in the second argument to sigwait().
This commit is contained in:
jhb 2017-08-30 15:45:23 +00:00
parent f856f221ac
commit 12b7246200
4 changed files with 31 additions and 5 deletions

View File

@ -35,4 +35,5 @@ extern int print_line_prefix(struct trussinfo *);
extern void setup_and_wait(struct trussinfo *, char **);
extern void start_tracing(struct trussinfo *, pid_t);
extern void restore_proc(int);
extern void decode_siginfo(FILE *, siginfo_t *);
extern void eventloop(struct trussinfo *);

View File

@ -584,7 +584,7 @@ report_new_child(struct trussinfo *info)
fprintf(info->outfile, "<new process>\n");
}
static void
void
decode_siginfo(FILE *fp, siginfo_t *si)
{
const char *str;

View File

@ -52,6 +52,7 @@ enum Argtype { None = 1, Hex, Octal, Int, UInt, LongHex, Name, Ptr, Stat, Stat11
Sockoptname, Msgflags, CapRights, PUInt, PQuadHex, Acltype,
Extattrnamespace, Minherit, Mlockall, Mountflags, Msync, Priowhich,
Ptraceop, Quotactlcmd, Reboothowto, Rtpriofunc, Schedpolicy, Schedparam,
PSig, Siginfo,
CloudABIAdvice, CloudABIClockID, ClouduABIFDSFlags,
CloudABIFDStat, CloudABIFileStat, CloudABIFileType,

View File

@ -462,11 +462,12 @@ static struct syscall decoded_syscalls[] = {
{ .name = "sigsuspend", .ret_type = 1, .nargs = 1,
.args = { { Sigset | IN, 0 } } },
{ .name = "sigtimedwait", .ret_type = 1, .nargs = 3,
.args = { { Sigset | IN, 0 }, { Ptr, 1 }, { Timespec | IN, 2 } } },
.args = { { Sigset | IN, 0 }, { Siginfo | OUT, 1 },
{ Timespec | IN, 2 } } },
{ .name = "sigwait", .ret_type = 1, .nargs = 2,
.args = { { Sigset | IN, 0 }, { Ptr, 1 } } },
.args = { { Sigset | IN, 0 }, { PSig | OUT, 1 } } },
{ .name = "sigwaitinfo", .ret_type = 1, .nargs = 2,
.args = { { Sigset | IN, 0 }, { Ptr, 1 } } },
.args = { { Sigset | IN, 0 }, { Siginfo | OUT, 1 } } },
{ .name = "socket", .ret_type = 1, .nargs = 3,
.args = { { Sockdomain, 0 }, { Socktype, 1 }, { Sockprotocol, 2 } } },
{ .name = "stat", .ret_type = 1, .nargs = 2,
@ -510,7 +511,8 @@ static struct syscall decoded_syscalls[] = {
{ Rusage | OUT, 3 } } },
{ .name = "wait6", .ret_type = 1, .nargs = 6,
.args = { { Idtype, 0 }, { Quad, 1 }, { ExitStatus | OUT, 2 },
{ Waitoptions, 3 }, { Rusage | OUT, 4 }, { Ptr, 5 } } },
{ Waitoptions, 3 }, { Rusage | OUT, 4 },
{ Siginfo | OUT, 5 } } },
{ .name = "write", .ret_type = 1, .nargs = 3,
.args = { { Int, 0 }, { BinString | IN, 1 }, { Sizet, 2 } } },
@ -2164,6 +2166,28 @@ print_arg(struct syscall_args *sc, unsigned long *args, long *retval,
fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
case PSig: {
int sig;
if (get_struct(pid, (void *)args[sc->offset], &sig,
sizeof(sig)) == 0)
fprintf(fp, "{ %s }", strsig2(sig));
else
fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
case Siginfo: {
siginfo_t si;
if (get_struct(pid, (void *)args[sc->offset], &si,
sizeof(si)) != -1) {
fprintf(fp, "{ signo=%s", strsig2(si.si_signo));
decode_siginfo(fp, &si);
fprintf(fp, " }");
} else
fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
case CloudABIAdvice:
fputs(xlookup(cloudabi_advice, args[sc->offset]), fp);