1 // Copyright 2023 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4 5 package unix
6 7 import (
8 "syscall"
9 )
10 11 const is64bit = ^uint(0) >> 63 // 0 for 32-bit hosts, 1 for 64-bit ones.
12 13 // SiginfoChild is a struct filled in by Linux waitid syscall.
14 // In C, siginfo_t contains a union with multiple members;
15 // this struct corresponds to one used when Signo is SIGCHLD.
16 //
17 // NOTE fields are exported to be used by TestSiginfoChildLayout.
18 type SiginfoChild struct {
19 Signo int32
20 siErrnoCode // Two int32 fields, swapped on MIPS.
21 _ [is64bit]int32 // Extra padding for 64-bit hosts only.
22 23 // End of common part. Beginning of signal-specific part.
24 25 Pid int32
26 Uid uint32
27 Status int32
28 29 // Pad to 128 bytes.
30 _ [128 - (6+is64bit)*4]byte
31 }
32 33 const (
34 // Possible values for SiginfoChild.Code field.
35 _CLD_EXITED int32 = 1
36 _CLD_KILLED = 2
37 _CLD_DUMPED = 3
38 _CLD_TRAPPED = 4
39 _CLD_STOPPED = 5
40 _CLD_CONTINUED = 6
41 42 // These are the same as in syscall/syscall_linux.go.
43 core = 0x80
44 stopped = 0x7f
45 continued = 0xffff
46 )
47 48 // WaitStatus converts SiginfoChild, as filled in by the waitid syscall,
49 // to syscall.WaitStatus.
50 func (s *SiginfoChild) WaitStatus() (ws syscall.WaitStatus) {
51 switch s.Code {
52 case _CLD_EXITED:
53 ws = syscall.WaitStatus(s.Status << 8)
54 case _CLD_DUMPED:
55 ws = syscall.WaitStatus(s.Status) | core
56 case _CLD_KILLED:
57 ws = syscall.WaitStatus(s.Status)
58 case _CLD_TRAPPED, _CLD_STOPPED:
59 ws = syscall.WaitStatus(s.Status<<8) | stopped
60 case _CLD_CONTINUED:
61 ws = continued
62 }
63 return
64 }
65