siginfo_linux.mx raw

   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