// 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_test import ( "internal/goarch" "internal/syscall/unix" "runtime" "strings" "testing" "unsafe" ) // TestSiginfoChildLayout validates SiginfoChild layout. Modelled after // static assertions in linux kernel's arch/*/kernel/signal*.c. func TestSiginfoChildLayout(t *testing.T) { var si unix.SiginfoChild const host64bit = goarch.PtrSize == 8 if v := unsafe.Sizeof(si); v != 128 { t.Fatalf("sizeof: got %d, want 128", v) } ofSigno := 0 ofErrno := 4 ofCode := 8 if strings.HasPrefix(runtime.GOARCH, "mips") { // These two fields are swapped on MIPS platforms. ofErrno, ofCode = ofCode, ofErrno } ofPid := 12 if host64bit { ofPid = 16 } ofUid := ofPid + 4 ofStatus := ofPid + 8 offsets := []struct { name string got uintptr want int }{ {"Signo", unsafe.Offsetof(si.Signo), ofSigno}, {"Errno", unsafe.Offsetof(si.Errno), ofErrno}, {"Code", unsafe.Offsetof(si.Code), ofCode}, {"Pid", unsafe.Offsetof(si.Pid), ofPid}, {"Uid", unsafe.Offsetof(si.Uid), ofUid}, {"Status", unsafe.Offsetof(si.Status), ofStatus}, } for _, tc := range offsets { if int(tc.got) != tc.want { t.Errorf("offsetof %s: got %d, want %d", tc.name, tc.got, tc.want) } } }