@@ -54,3 +54,42 @@ func TestPipe2(t *testing.T) {
54
54
t .Fatalf ("bad close: %v" , err )
55
55
}
56
56
}
57
+
58
+ func checkNonblocking (t * testing.T , fd int , name string ) {
59
+ t .Helper ()
60
+ flags , err := unix .FcntlInt (uintptr (fd ), unix .F_GETFL , 0 )
61
+ if err != nil {
62
+ t .Errorf ("fcntl(%s, F_GETFL) failed: %v" , name , err )
63
+ } else if flags & unix .O_NONBLOCK == 0 {
64
+ t .Errorf ("O_NONBLOCK not set in %s flags %#x" , name , flags )
65
+ }
66
+ }
67
+
68
+ func checkCloseonexec (t * testing.T , fd int , name string ) {
69
+ t .Helper ()
70
+ flags , err := unix .FcntlInt (uintptr (fd ), unix .F_GETFD , 0 )
71
+ if err != nil {
72
+ t .Errorf ("fcntl(%s, F_GETFD) failed: %v" , name , err )
73
+ } else if flags & unix .FD_CLOEXEC == 0 {
74
+ t .Errorf ("FD_CLOEXEC not set in %s flags %#x" , name , flags )
75
+ }
76
+ }
77
+
78
+ func TestNonblockingPipe2 (t * testing.T ) {
79
+ var pipes [2 ]int
80
+ err := unix .Pipe2 (pipes [:], unix .O_NONBLOCK | unix .O_CLOEXEC )
81
+ if err != nil {
82
+ t .Fatalf ("pipe2: %v" , err )
83
+ }
84
+ r := pipes [0 ]
85
+ w := pipes [1 ]
86
+ defer func () {
87
+ unix .Close (r )
88
+ unix .Close (w )
89
+ }()
90
+
91
+ checkNonblocking (t , r , "reader" )
92
+ checkCloseonexec (t , r , "reader" )
93
+ checkNonblocking (t , w , "writer" )
94
+ checkCloseonexec (t , w , "writer" )
95
+ }
0 commit comments