• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// +build cgo
2
3package psx
4
5import (
6	"runtime"
7	"syscall"
8	"testing"
9)
10
11// The man page for errno indicates that it is never set to zero, so
12// validate that it retains its value over a successful Syscall[36]()
13// and is overwritten on a failing syscall.
14func TestErrno(t *testing.T) {
15	// This testing is much easier if we don't have to guess which
16	// thread is running this Go code.
17	runtime.LockOSThread()
18	defer runtime.UnlockOSThread()
19
20	// Start from a known bad state and clean up afterwards.
21	setErrno(int(syscall.EPERM))
22	defer setErrno(0)
23
24	v3, _, errno := Syscall3(syscall.SYS_GETUID, 0, 0, 0)
25	if errno != 0 {
26		t.Fatalf("psx getuid failed: %v", errno)
27	}
28	v6, _, errno := Syscall6(syscall.SYS_GETUID, 0, 0, 0, 0, 0, 0)
29	if errno != 0 {
30		t.Fatalf("psx getuid failed: %v", errno)
31	}
32
33	if v3 != v6 {
34		t.Errorf("psx getuid failed to match v3=%d, v6=%d", v3, v6)
35	}
36
37	if v := setErrno(-1); v != int(syscall.EPERM) {
38		t.Errorf("psx changes prevailing errno got=%v(%d) want=%v", syscall.Errno(v), v, syscall.EPERM)
39	}
40}
41