1*71db0c75SAndroid Build Coastguard Worker //===-- String to integer conversion utils ----------------------*- C++ -*-===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker
9*71db0c75SAndroid Build Coastguard Worker #ifndef LLVM_LIBC_SRC_SYS_WAIT_WAIT4IMPL_H
10*71db0c75SAndroid Build Coastguard Worker #define LLVM_LIBC_SRC_SYS_WAIT_WAIT4IMPL_H
11*71db0c75SAndroid Build Coastguard Worker
12*71db0c75SAndroid Build Coastguard Worker #include "src/__support/OSUtil/syscall.h" // For internal syscall function.
13*71db0c75SAndroid Build Coastguard Worker #include "src/__support/common.h"
14*71db0c75SAndroid Build Coastguard Worker #include "src/__support/error_or.h"
15*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/config.h"
16*71db0c75SAndroid Build Coastguard Worker #include "src/errno/libc_errno.h"
17*71db0c75SAndroid Build Coastguard Worker
18*71db0c75SAndroid Build Coastguard Worker #include <signal.h>
19*71db0c75SAndroid Build Coastguard Worker #include <sys/syscall.h> // For syscall numbers.
20*71db0c75SAndroid Build Coastguard Worker #include <sys/wait.h>
21*71db0c75SAndroid Build Coastguard Worker
22*71db0c75SAndroid Build Coastguard Worker namespace LIBC_NAMESPACE_DECL {
23*71db0c75SAndroid Build Coastguard Worker namespace internal {
24*71db0c75SAndroid Build Coastguard Worker
25*71db0c75SAndroid Build Coastguard Worker // The implementation of wait here is very minimal. We will add more
26*71db0c75SAndroid Build Coastguard Worker // functionality and standard compliance in future.
27*71db0c75SAndroid Build Coastguard Worker
wait4impl(pid_t pid,int * wait_status,int options,struct rusage * usage)28*71db0c75SAndroid Build Coastguard Worker LIBC_INLINE ErrorOr<pid_t> wait4impl(pid_t pid, int *wait_status, int options,
29*71db0c75SAndroid Build Coastguard Worker struct rusage *usage) {
30*71db0c75SAndroid Build Coastguard Worker #if SYS_wait4
31*71db0c75SAndroid Build Coastguard Worker pid = LIBC_NAMESPACE::syscall_impl<pid_t>(SYS_wait4, pid, wait_status,
32*71db0c75SAndroid Build Coastguard Worker options, usage);
33*71db0c75SAndroid Build Coastguard Worker #elif defined(SYS_waitid)
34*71db0c75SAndroid Build Coastguard Worker int idtype = P_PID;
35*71db0c75SAndroid Build Coastguard Worker if (pid == -1) {
36*71db0c75SAndroid Build Coastguard Worker idtype = P_ALL;
37*71db0c75SAndroid Build Coastguard Worker } else if (pid < -1) {
38*71db0c75SAndroid Build Coastguard Worker idtype = P_PGID;
39*71db0c75SAndroid Build Coastguard Worker pid *= -1;
40*71db0c75SAndroid Build Coastguard Worker } else if (pid == 0) {
41*71db0c75SAndroid Build Coastguard Worker idtype = P_PGID;
42*71db0c75SAndroid Build Coastguard Worker }
43*71db0c75SAndroid Build Coastguard Worker
44*71db0c75SAndroid Build Coastguard Worker options |= WEXITED;
45*71db0c75SAndroid Build Coastguard Worker
46*71db0c75SAndroid Build Coastguard Worker siginfo_t info;
47*71db0c75SAndroid Build Coastguard Worker pid = LIBC_NAMESPACE::syscall_impl<pid_t>(SYS_waitid, idtype, pid, &info,
48*71db0c75SAndroid Build Coastguard Worker options, usage);
49*71db0c75SAndroid Build Coastguard Worker if (pid >= 0)
50*71db0c75SAndroid Build Coastguard Worker pid = info.si_pid;
51*71db0c75SAndroid Build Coastguard Worker
52*71db0c75SAndroid Build Coastguard Worker if (wait_status) {
53*71db0c75SAndroid Build Coastguard Worker switch (info.si_code) {
54*71db0c75SAndroid Build Coastguard Worker case CLD_EXITED:
55*71db0c75SAndroid Build Coastguard Worker *wait_status = W_EXITCODE(info.si_status, 0);
56*71db0c75SAndroid Build Coastguard Worker break;
57*71db0c75SAndroid Build Coastguard Worker case CLD_DUMPED:
58*71db0c75SAndroid Build Coastguard Worker *wait_status = info.si_status | WCOREFLAG;
59*71db0c75SAndroid Build Coastguard Worker break;
60*71db0c75SAndroid Build Coastguard Worker case CLD_KILLED:
61*71db0c75SAndroid Build Coastguard Worker *wait_status = info.si_status;
62*71db0c75SAndroid Build Coastguard Worker break;
63*71db0c75SAndroid Build Coastguard Worker case CLD_TRAPPED:
64*71db0c75SAndroid Build Coastguard Worker case CLD_STOPPED:
65*71db0c75SAndroid Build Coastguard Worker *wait_status = W_STOPCODE(info.si_status);
66*71db0c75SAndroid Build Coastguard Worker break;
67*71db0c75SAndroid Build Coastguard Worker case CLD_CONTINUED:
68*71db0c75SAndroid Build Coastguard Worker *wait_status = __W_CONTINUED;
69*71db0c75SAndroid Build Coastguard Worker break;
70*71db0c75SAndroid Build Coastguard Worker default:
71*71db0c75SAndroid Build Coastguard Worker *wait_status = 0;
72*71db0c75SAndroid Build Coastguard Worker break;
73*71db0c75SAndroid Build Coastguard Worker }
74*71db0c75SAndroid Build Coastguard Worker }
75*71db0c75SAndroid Build Coastguard Worker #else
76*71db0c75SAndroid Build Coastguard Worker #error "wait4 and waitid syscalls not available."
77*71db0c75SAndroid Build Coastguard Worker #endif
78*71db0c75SAndroid Build Coastguard Worker if (pid < 0)
79*71db0c75SAndroid Build Coastguard Worker return Error(-pid);
80*71db0c75SAndroid Build Coastguard Worker return pid;
81*71db0c75SAndroid Build Coastguard Worker }
82*71db0c75SAndroid Build Coastguard Worker
83*71db0c75SAndroid Build Coastguard Worker } // namespace internal
84*71db0c75SAndroid Build Coastguard Worker } // namespace LIBC_NAMESPACE_DECL
85*71db0c75SAndroid Build Coastguard Worker
86*71db0c75SAndroid Build Coastguard Worker #endif // LLVM_LIBC_SRC_SYS_WAIT_WAIT4IMPL_H
87