| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package unix |
| |
| import ( |
| "syscall" |
| ) |
| |
| const is64bit = ^uint(0) >> 63 // 0 for 32-bit hosts, 1 for 64-bit ones. |
| |
| // SiginfoChild is a struct filled in by Linux waitid syscall. |
| // In C, siginfo_t contains a union with multiple members; |
| // this struct corresponds to one used when Signo is SIGCHLD. |
| // |
| // NOTE fields are exported to be used by TestSiginfoChildLayout. |
| type SiginfoChild struct { |
| Signo int32 |
| siErrnoCode // Two int32 fields, swapped on MIPS. |
| _ [is64bit]int32 // Extra padding for 64-bit hosts only. |
| |
| // End of common part. Beginning of signal-specific part. |
| |
| Pid int32 |
| Uid uint32 |
| Status int32 |
| |
| // Pad to 128 bytes. |
| _ [128 - (6+is64bit)*4]byte |
| } |
| |
| const ( |
| // Possible values for SiginfoChild.Code field. |
| _CLD_EXITED int32 = 1 |
| _CLD_KILLED = 2 |
| _CLD_DUMPED = 3 |
| _CLD_TRAPPED = 4 |
| _CLD_STOPPED = 5 |
| _CLD_CONTINUED = 6 |
| |
| // These are the same as in syscall/syscall_linux.go. |
| core = 0x80 |
| stopped = 0x7f |
| continued = 0xffff |
| ) |
| |
| // WaitStatus converts SiginfoChild, as filled in by the waitid syscall, |
| // to syscall.WaitStatus. |
| func (s *SiginfoChild) WaitStatus() (ws syscall.WaitStatus) { |
| switch s.Code { |
| case _CLD_EXITED: |
| ws = syscall.WaitStatus(s.Status << 8) |
| case _CLD_DUMPED: |
| ws = syscall.WaitStatus(s.Status) | core |
| case _CLD_KILLED: |
| ws = syscall.WaitStatus(s.Status) |
| case _CLD_TRAPPED, _CLD_STOPPED: |
| ws = syscall.WaitStatus(s.Status<<8) | stopped |
| case _CLD_CONTINUED: |
| ws = continued |
| } |
| return |
| } |