1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker * Check decoding of waitid syscall.
3*cf84ac9aSAndroid Build Coastguard Worker *
4*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2015-2016 Dmitry V. Levin <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2016-2017 The strace developers.
6*cf84ac9aSAndroid Build Coastguard Worker * All rights reserved.
7*cf84ac9aSAndroid Build Coastguard Worker *
8*cf84ac9aSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
9*cf84ac9aSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
10*cf84ac9aSAndroid Build Coastguard Worker * are met:
11*cf84ac9aSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
12*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
13*cf84ac9aSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
14*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
15*cf84ac9aSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
16*cf84ac9aSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products
17*cf84ac9aSAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
18*cf84ac9aSAndroid Build Coastguard Worker *
19*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20*cf84ac9aSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*cf84ac9aSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*cf84ac9aSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23*cf84ac9aSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24*cf84ac9aSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*cf84ac9aSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*cf84ac9aSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*cf84ac9aSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*cf84ac9aSAndroid Build Coastguard Worker */
30*cf84ac9aSAndroid Build Coastguard Worker
31*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
32*cf84ac9aSAndroid Build Coastguard Worker #include <assert.h>
33*cf84ac9aSAndroid Build Coastguard Worker #include <signal.h>
34*cf84ac9aSAndroid Build Coastguard Worker #include <stdio.h>
35*cf84ac9aSAndroid Build Coastguard Worker #include <string.h>
36*cf84ac9aSAndroid Build Coastguard Worker #include <unistd.h>
37*cf84ac9aSAndroid Build Coastguard Worker #include <sys/wait.h>
38*cf84ac9aSAndroid Build Coastguard Worker #include <sys/resource.h>
39*cf84ac9aSAndroid Build Coastguard Worker #include <asm/unistd.h>
40*cf84ac9aSAndroid Build Coastguard Worker
41*cf84ac9aSAndroid Build Coastguard Worker static const char *
sprint_rusage(const struct rusage * const ru)42*cf84ac9aSAndroid Build Coastguard Worker sprint_rusage(const struct rusage *const ru)
43*cf84ac9aSAndroid Build Coastguard Worker {
44*cf84ac9aSAndroid Build Coastguard Worker static char buf[1024];
45*cf84ac9aSAndroid Build Coastguard Worker snprintf(buf, sizeof(buf),
46*cf84ac9aSAndroid Build Coastguard Worker "{ru_utime={tv_sec=%lld, tv_usec=%llu}"
47*cf84ac9aSAndroid Build Coastguard Worker ", ru_stime={tv_sec=%lld, tv_usec=%llu}"
48*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
49*cf84ac9aSAndroid Build Coastguard Worker ", ru_maxrss=%llu"
50*cf84ac9aSAndroid Build Coastguard Worker ", ru_ixrss=%llu"
51*cf84ac9aSAndroid Build Coastguard Worker ", ru_idrss=%llu"
52*cf84ac9aSAndroid Build Coastguard Worker ", ru_isrss=%llu"
53*cf84ac9aSAndroid Build Coastguard Worker ", ru_minflt=%llu"
54*cf84ac9aSAndroid Build Coastguard Worker ", ru_majflt=%llu"
55*cf84ac9aSAndroid Build Coastguard Worker ", ru_nswap=%llu"
56*cf84ac9aSAndroid Build Coastguard Worker ", ru_inblock=%llu"
57*cf84ac9aSAndroid Build Coastguard Worker ", ru_oublock=%llu"
58*cf84ac9aSAndroid Build Coastguard Worker ", ru_msgsnd=%llu"
59*cf84ac9aSAndroid Build Coastguard Worker ", ru_msgrcv=%llu"
60*cf84ac9aSAndroid Build Coastguard Worker ", ru_nsignals=%llu"
61*cf84ac9aSAndroid Build Coastguard Worker ", ru_nvcsw=%llu"
62*cf84ac9aSAndroid Build Coastguard Worker ", ru_nivcsw=%llu}"
63*cf84ac9aSAndroid Build Coastguard Worker #else
64*cf84ac9aSAndroid Build Coastguard Worker ", ...}"
65*cf84ac9aSAndroid Build Coastguard Worker #endif
66*cf84ac9aSAndroid Build Coastguard Worker , (long long) ru->ru_utime.tv_sec
67*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_utime.tv_usec)
68*cf84ac9aSAndroid Build Coastguard Worker , (long long) ru->ru_stime.tv_sec
69*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_stime.tv_usec)
70*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
71*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_maxrss)
72*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_ixrss)
73*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_idrss)
74*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_isrss)
75*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_minflt)
76*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_majflt)
77*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_nswap)
78*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_inblock)
79*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_oublock)
80*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_msgsnd)
81*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_msgrcv)
82*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_nsignals)
83*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_nvcsw)
84*cf84ac9aSAndroid Build Coastguard Worker , zero_extend_signed_to_ull(ru->ru_nivcsw)
85*cf84ac9aSAndroid Build Coastguard Worker #endif
86*cf84ac9aSAndroid Build Coastguard Worker );
87*cf84ac9aSAndroid Build Coastguard Worker return buf;
88*cf84ac9aSAndroid Build Coastguard Worker }
89*cf84ac9aSAndroid Build Coastguard Worker
90*cf84ac9aSAndroid Build Coastguard Worker #define CASE(x) case x: return #x
91*cf84ac9aSAndroid Build Coastguard Worker
92*cf84ac9aSAndroid Build Coastguard Worker static const char *
si_code_2_name(const int code)93*cf84ac9aSAndroid Build Coastguard Worker si_code_2_name(const int code)
94*cf84ac9aSAndroid Build Coastguard Worker {
95*cf84ac9aSAndroid Build Coastguard Worker switch (code) {
96*cf84ac9aSAndroid Build Coastguard Worker #ifdef CLD_EXITED
97*cf84ac9aSAndroid Build Coastguard Worker CASE(CLD_EXITED);
98*cf84ac9aSAndroid Build Coastguard Worker #endif
99*cf84ac9aSAndroid Build Coastguard Worker #ifdef CLD_KILLED
100*cf84ac9aSAndroid Build Coastguard Worker CASE(CLD_KILLED);
101*cf84ac9aSAndroid Build Coastguard Worker #endif
102*cf84ac9aSAndroid Build Coastguard Worker #ifdef CLD_DUMPED
103*cf84ac9aSAndroid Build Coastguard Worker CASE(CLD_DUMPED);
104*cf84ac9aSAndroid Build Coastguard Worker #endif
105*cf84ac9aSAndroid Build Coastguard Worker #ifdef CLD_TRAPPED
106*cf84ac9aSAndroid Build Coastguard Worker CASE(CLD_TRAPPED);
107*cf84ac9aSAndroid Build Coastguard Worker #endif
108*cf84ac9aSAndroid Build Coastguard Worker #ifdef CLD_STOPPED
109*cf84ac9aSAndroid Build Coastguard Worker CASE(CLD_STOPPED);
110*cf84ac9aSAndroid Build Coastguard Worker #endif
111*cf84ac9aSAndroid Build Coastguard Worker #ifdef CLD_CONTINUED
112*cf84ac9aSAndroid Build Coastguard Worker CASE(CLD_CONTINUED);
113*cf84ac9aSAndroid Build Coastguard Worker #endif
114*cf84ac9aSAndroid Build Coastguard Worker default:
115*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("unknown si_code %d", code);
116*cf84ac9aSAndroid Build Coastguard Worker }
117*cf84ac9aSAndroid Build Coastguard Worker }
118*cf84ac9aSAndroid Build Coastguard Worker
119*cf84ac9aSAndroid Build Coastguard Worker static const char *
sprint_siginfo(const siginfo_t * const si,const char * const status_text)120*cf84ac9aSAndroid Build Coastguard Worker sprint_siginfo(const siginfo_t *const si, const char *const status_text)
121*cf84ac9aSAndroid Build Coastguard Worker {
122*cf84ac9aSAndroid Build Coastguard Worker static char buf[1024];
123*cf84ac9aSAndroid Build Coastguard Worker snprintf(buf, sizeof(buf),
124*cf84ac9aSAndroid Build Coastguard Worker "{si_signo=SIGCHLD"
125*cf84ac9aSAndroid Build Coastguard Worker ", si_code=%s"
126*cf84ac9aSAndroid Build Coastguard Worker ", si_pid=%u"
127*cf84ac9aSAndroid Build Coastguard Worker ", si_uid=%u"
128*cf84ac9aSAndroid Build Coastguard Worker ", si_status=%s"
129*cf84ac9aSAndroid Build Coastguard Worker ", si_utime=%llu"
130*cf84ac9aSAndroid Build Coastguard Worker ", si_stime=%llu}",
131*cf84ac9aSAndroid Build Coastguard Worker si_code_2_name(si->si_code),
132*cf84ac9aSAndroid Build Coastguard Worker si->si_pid,
133*cf84ac9aSAndroid Build Coastguard Worker si->si_uid,
134*cf84ac9aSAndroid Build Coastguard Worker status_text,
135*cf84ac9aSAndroid Build Coastguard Worker zero_extend_signed_to_ull(si->si_utime),
136*cf84ac9aSAndroid Build Coastguard Worker zero_extend_signed_to_ull(si->si_stime));
137*cf84ac9aSAndroid Build Coastguard Worker return buf;
138*cf84ac9aSAndroid Build Coastguard Worker }
139*cf84ac9aSAndroid Build Coastguard Worker
140*cf84ac9aSAndroid Build Coastguard Worker static unsigned long
poison(unsigned int v)141*cf84ac9aSAndroid Build Coastguard Worker poison(unsigned int v)
142*cf84ac9aSAndroid Build Coastguard Worker {
143*cf84ac9aSAndroid Build Coastguard Worker return (unsigned long) 0xfacefeed00000000ULL | v;
144*cf84ac9aSAndroid Build Coastguard Worker }
145*cf84ac9aSAndroid Build Coastguard Worker
146*cf84ac9aSAndroid Build Coastguard Worker static long
do_waitid(const unsigned int idtype,const unsigned int id,const siginfo_t * const infop,const unsigned int options,const struct rusage * const rusage)147*cf84ac9aSAndroid Build Coastguard Worker do_waitid(const unsigned int idtype,
148*cf84ac9aSAndroid Build Coastguard Worker const unsigned int id,
149*cf84ac9aSAndroid Build Coastguard Worker const siginfo_t *const infop,
150*cf84ac9aSAndroid Build Coastguard Worker const unsigned int options,
151*cf84ac9aSAndroid Build Coastguard Worker const struct rusage *const rusage)
152*cf84ac9aSAndroid Build Coastguard Worker {
153*cf84ac9aSAndroid Build Coastguard Worker sigset_t mask = {};
154*cf84ac9aSAndroid Build Coastguard Worker sigaddset(&mask, SIGCHLD);
155*cf84ac9aSAndroid Build Coastguard Worker
156*cf84ac9aSAndroid Build Coastguard Worker assert(sigprocmask(SIG_BLOCK, &mask, NULL) == 0);
157*cf84ac9aSAndroid Build Coastguard Worker long rc = syscall(__NR_waitid, poison(idtype), poison(id),
158*cf84ac9aSAndroid Build Coastguard Worker infop, poison(options), rusage);
159*cf84ac9aSAndroid Build Coastguard Worker assert(sigprocmask(SIG_UNBLOCK, &mask, NULL) == 0);
160*cf84ac9aSAndroid Build Coastguard Worker return rc;
161*cf84ac9aSAndroid Build Coastguard Worker }
162*cf84ac9aSAndroid Build Coastguard Worker
163*cf84ac9aSAndroid Build Coastguard Worker int
main(void)164*cf84ac9aSAndroid Build Coastguard Worker main(void)
165*cf84ac9aSAndroid Build Coastguard Worker {
166*cf84ac9aSAndroid Build Coastguard Worker tprintf("%s", "");
167*cf84ac9aSAndroid Build Coastguard Worker
168*cf84ac9aSAndroid Build Coastguard Worker int fds[2];
169*cf84ac9aSAndroid Build Coastguard Worker if (pipe(fds))
170*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("pipe");
171*cf84ac9aSAndroid Build Coastguard Worker
172*cf84ac9aSAndroid Build Coastguard Worker pid_t pid;
173*cf84ac9aSAndroid Build Coastguard Worker pid = fork();
174*cf84ac9aSAndroid Build Coastguard Worker if (pid < 0)
175*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("fork");
176*cf84ac9aSAndroid Build Coastguard Worker
177*cf84ac9aSAndroid Build Coastguard Worker if (!pid) {
178*cf84ac9aSAndroid Build Coastguard Worker char c;
179*cf84ac9aSAndroid Build Coastguard Worker (void) close(1);
180*cf84ac9aSAndroid Build Coastguard Worker assert(read(0, &c, sizeof(c)) == 1);
181*cf84ac9aSAndroid Build Coastguard Worker return 42;
182*cf84ac9aSAndroid Build Coastguard Worker }
183*cf84ac9aSAndroid Build Coastguard Worker
184*cf84ac9aSAndroid Build Coastguard Worker (void) close(0);
185*cf84ac9aSAndroid Build Coastguard Worker
186*cf84ac9aSAndroid Build Coastguard Worker if (do_waitid(P_PID, pid, 0, WNOHANG|WEXITED, 0))
187*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("waitid #1");
188*cf84ac9aSAndroid Build Coastguard Worker tprintf("waitid(P_PID, %d, NULL, WNOHANG|WEXITED, NULL) = 0\n", pid);
189*cf84ac9aSAndroid Build Coastguard Worker
190*cf84ac9aSAndroid Build Coastguard Worker TAIL_ALLOC_OBJECT_CONST_PTR(siginfo_t, sinfo);
191*cf84ac9aSAndroid Build Coastguard Worker memset(sinfo, 0, sizeof(*sinfo));
192*cf84ac9aSAndroid Build Coastguard Worker TAIL_ALLOC_OBJECT_CONST_PTR(struct rusage, rusage);
193*cf84ac9aSAndroid Build Coastguard Worker if (do_waitid(P_PID, pid, sinfo, WNOHANG|WEXITED|WSTOPPED, rusage))
194*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("waitid #2");
195*cf84ac9aSAndroid Build Coastguard Worker tprintf("waitid(P_PID, %d, {}, WNOHANG|WEXITED|WSTOPPED, %s) = 0\n",
196*cf84ac9aSAndroid Build Coastguard Worker pid, sprint_rusage(rusage));
197*cf84ac9aSAndroid Build Coastguard Worker
198*cf84ac9aSAndroid Build Coastguard Worker assert(write(1, "", 1) == 1);
199*cf84ac9aSAndroid Build Coastguard Worker (void) close(1);
200*cf84ac9aSAndroid Build Coastguard Worker
201*cf84ac9aSAndroid Build Coastguard Worker if (do_waitid(P_PID, pid, sinfo, WEXITED, rusage))
202*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("waitid #3");
203*cf84ac9aSAndroid Build Coastguard Worker tprintf("waitid(P_PID, %d, %s, WEXITED, %s) = 0\n",
204*cf84ac9aSAndroid Build Coastguard Worker pid, sprint_siginfo(sinfo, "42"), sprint_rusage(rusage));
205*cf84ac9aSAndroid Build Coastguard Worker
206*cf84ac9aSAndroid Build Coastguard Worker pid = fork();
207*cf84ac9aSAndroid Build Coastguard Worker if (pid < 0)
208*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("fork");
209*cf84ac9aSAndroid Build Coastguard Worker
210*cf84ac9aSAndroid Build Coastguard Worker if (!pid) {
211*cf84ac9aSAndroid Build Coastguard Worker (void) raise(SIGUSR1);
212*cf84ac9aSAndroid Build Coastguard Worker return 1;
213*cf84ac9aSAndroid Build Coastguard Worker }
214*cf84ac9aSAndroid Build Coastguard Worker
215*cf84ac9aSAndroid Build Coastguard Worker if (do_waitid(P_PID, pid, sinfo, WEXITED, rusage))
216*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("waitid #4");
217*cf84ac9aSAndroid Build Coastguard Worker tprintf("waitid(P_PID, %d, %s, WEXITED, %s) = 0\n",
218*cf84ac9aSAndroid Build Coastguard Worker pid, sprint_siginfo(sinfo, "SIGUSR1"), sprint_rusage(rusage));
219*cf84ac9aSAndroid Build Coastguard Worker
220*cf84ac9aSAndroid Build Coastguard Worker if (pipe(fds))
221*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("pipe");
222*cf84ac9aSAndroid Build Coastguard Worker pid = fork();
223*cf84ac9aSAndroid Build Coastguard Worker if (pid < 0)
224*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("fork");
225*cf84ac9aSAndroid Build Coastguard Worker
226*cf84ac9aSAndroid Build Coastguard Worker if (!pid) {
227*cf84ac9aSAndroid Build Coastguard Worker (void) close(1);
228*cf84ac9aSAndroid Build Coastguard Worker raise(SIGSTOP);
229*cf84ac9aSAndroid Build Coastguard Worker char c;
230*cf84ac9aSAndroid Build Coastguard Worker assert(read(0, &c, sizeof(c)) == 1);
231*cf84ac9aSAndroid Build Coastguard Worker return 0;
232*cf84ac9aSAndroid Build Coastguard Worker }
233*cf84ac9aSAndroid Build Coastguard Worker
234*cf84ac9aSAndroid Build Coastguard Worker (void) close(0);
235*cf84ac9aSAndroid Build Coastguard Worker
236*cf84ac9aSAndroid Build Coastguard Worker if (do_waitid(P_PID, pid, sinfo, WSTOPPED, rusage))
237*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("waitid #5");
238*cf84ac9aSAndroid Build Coastguard Worker tprintf("waitid(P_PID, %d, %s, WSTOPPED, %s) = 0\n",
239*cf84ac9aSAndroid Build Coastguard Worker pid, sprint_siginfo(sinfo, "SIGSTOP"), sprint_rusage(rusage));
240*cf84ac9aSAndroid Build Coastguard Worker
241*cf84ac9aSAndroid Build Coastguard Worker if (kill(pid, SIGCONT))
242*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("kill(SIGCONT)");
243*cf84ac9aSAndroid Build Coastguard Worker
244*cf84ac9aSAndroid Build Coastguard Worker #if defined WCONTINUED
245*cf84ac9aSAndroid Build Coastguard Worker if (do_waitid(P_PID, pid, sinfo, WCONTINUED, rusage))
246*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("waitid #6");
247*cf84ac9aSAndroid Build Coastguard Worker tprintf("waitid(P_PID, %d, %s, WCONTINUED, %s) = 0\n",
248*cf84ac9aSAndroid Build Coastguard Worker pid, sprint_siginfo(sinfo, "SIGCONT"), sprint_rusage(rusage));
249*cf84ac9aSAndroid Build Coastguard Worker #endif /* WCONTINUED */
250*cf84ac9aSAndroid Build Coastguard Worker
251*cf84ac9aSAndroid Build Coastguard Worker assert(write(1, "", 1) == 1);
252*cf84ac9aSAndroid Build Coastguard Worker (void) close(1);
253*cf84ac9aSAndroid Build Coastguard Worker
254*cf84ac9aSAndroid Build Coastguard Worker if (do_waitid(P_PID, pid, sinfo, WEXITED, rusage))
255*cf84ac9aSAndroid Build Coastguard Worker perror_msg_and_fail("waitid #7");
256*cf84ac9aSAndroid Build Coastguard Worker tprintf("waitid(P_PID, %d, %s, WEXITED, %s) = 0\n",
257*cf84ac9aSAndroid Build Coastguard Worker pid, sprint_siginfo(sinfo, "0"), sprint_rusage(rusage));
258*cf84ac9aSAndroid Build Coastguard Worker
259*cf84ac9aSAndroid Build Coastguard Worker long rc = do_waitid(P_ALL, -1, sinfo, WEXITED|WSTOPPED, rusage);
260*cf84ac9aSAndroid Build Coastguard Worker tprintf("waitid(P_ALL, -1, %p, WEXITED|WSTOPPED, %p)"
261*cf84ac9aSAndroid Build Coastguard Worker " = %ld %s (%m)\n", sinfo, rusage, rc, errno2name());
262*cf84ac9aSAndroid Build Coastguard Worker
263*cf84ac9aSAndroid Build Coastguard Worker tprintf("%s\n", "+++ exited with 0 +++");
264*cf84ac9aSAndroid Build Coastguard Worker return 0;
265*cf84ac9aSAndroid Build Coastguard Worker }
266