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