diff --git a/usr.bin/truss/extern.h b/usr.bin/truss/extern.h --- a/usr.bin/truss/extern.h +++ b/usr.bin/truss/extern.h @@ -36,4 +36,4 @@ 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 *); +extern int eventloop(struct trussinfo *); diff --git a/usr.bin/truss/main.c b/usr.bin/truss/main.c --- a/usr.bin/truss/main.c +++ b/usr.bin/truss/main.c @@ -71,7 +71,7 @@ char **command; const char *errstr; pid_t pid; - int c; + int c, ret; fname = NULL; @@ -196,12 +196,12 @@ */ clock_gettime(CLOCK_REALTIME, &trussinfo->start_time); - eventloop(trussinfo); + ret = eventloop(trussinfo); if (trussinfo->flags & COUNTONLY) print_summary(trussinfo); fflush(trussinfo->outfile); - return (0); + return (ret); } diff --git a/usr.bin/truss/setup.c b/usr.bin/truss/setup.c --- a/usr.bin/truss/setup.c +++ b/usr.bin/truss/setup.c @@ -747,17 +747,18 @@ * Wait for events until all the processes have exited or truss has been * asked to stop. */ -void +int eventloop(struct trussinfo *info) { struct ptrace_lwpinfo pl; siginfo_t si; - int pending_signal; + int pending_signal, ret; + ret = 0; while (!LIST_EMPTY(&info->proclist)) { if (detaching) { detach_all_procs(info); - return; + return (0); } if (waitid(P_ALL, 0, &si, WTRAPPED | WEXITED) == -1) { @@ -777,6 +778,7 @@ if (si.si_code == CLD_EXITED) thread_exit_syscall(info); report_exit(info, &si); + ret = si.si_status; } free_proc(info->curthread->proc); info->curthread = NULL; @@ -829,4 +831,5 @@ break; } } + return (ret); }