Source file src/internal/syscall/unix/siginfo_linux.go

     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  

View as plain text