@@ -97,12 +97,26 @@ impl Socket {
9797 } ;
9898 let socket = unsafe {
9999 match c:: WSASocketW ( fam, ty, 0 , ptr:: null_mut ( ) , 0 ,
100- c:: WSA_FLAG_OVERLAPPED ) {
101- c:: INVALID_SOCKET => Err ( last_error ( ) ) ,
100+ c:: WSA_FLAG_OVERLAPPED | c:: WSA_FLAG_NO_HANDLE_INHERIT ) {
101+ c:: INVALID_SOCKET => {
102+ match c:: WSAGetLastError ( ) {
103+ c:: WSAEPROTOTYPE => {
104+ match c:: WSASocketW ( fam, ty, 0 , ptr:: null_mut ( ) , 0 ,
105+ c:: WSA_FLAG_OVERLAPPED ) {
106+ c:: INVALID_SOCKET => Err ( last_error ( ) ) ,
107+ n => {
108+ let s = Socket ( n) ;
109+ s. set_no_inherit ( ) ?;
110+ Ok ( s)
111+ } ,
112+ }
113+ } ,
114+ n => Err ( io:: Error :: from_raw_os_error ( n) ) ,
115+ }
116+ } ,
102117 n => Ok ( Socket ( n) ) ,
103118 }
104119 } ?;
105- socket. set_no_inherit ( ) ?;
106120 Ok ( socket)
107121 }
108122
@@ -168,7 +182,6 @@ impl Socket {
168182 n => Ok ( Socket ( n) ) ,
169183 }
170184 } ?;
171- socket. set_no_inherit ( ) ?;
172185 Ok ( socket)
173186 }
174187
@@ -178,16 +191,34 @@ impl Socket {
178191 cvt ( c:: WSADuplicateSocketW ( self . 0 ,
179192 c:: GetCurrentProcessId ( ) ,
180193 & mut info) ) ?;
194+
181195 match c:: WSASocketW ( info. iAddressFamily ,
182196 info. iSocketType ,
183197 info. iProtocol ,
184198 & mut info, 0 ,
185- c:: WSA_FLAG_OVERLAPPED ) {
186- c:: INVALID_SOCKET => Err ( last_error ( ) ) ,
199+ c:: WSA_FLAG_OVERLAPPED | c:: WSA_FLAG_NO_HANDLE_INHERIT ) {
200+ c:: INVALID_SOCKET => {
201+ match c:: WSAGetLastError ( ) {
202+ c:: WSAEPROTOTYPE => {
203+ match c:: WSASocketW ( info. iAddressFamily ,
204+ info. iSocketType ,
205+ info. iProtocol ,
206+ & mut info, 0 ,
207+ c:: WSA_FLAG_OVERLAPPED ) {
208+ c:: INVALID_SOCKET => Err ( last_error ( ) ) ,
209+ n => {
210+ let s = Socket ( n) ;
211+ s. set_no_inherit ( ) ?;
212+ Ok ( s)
213+ } ,
214+ }
215+ } ,
216+ n => Err ( io:: Error :: from_raw_os_error ( n) ) ,
217+ }
218+ } ,
187219 n => Ok ( Socket ( n) ) ,
188220 }
189221 } ?;
190- socket. set_no_inherit ( ) ?;
191222 Ok ( socket)
192223 }
193224
@@ -312,13 +343,19 @@ impl Socket {
312343 }
313344 }
314345
346+ #[ cfg( not( target_vendor = "uwp" ) ) ]
315347 fn set_no_inherit ( & self ) -> io:: Result < ( ) > {
316348 sys:: cvt ( unsafe {
317349 c:: SetHandleInformation ( self . 0 as c:: HANDLE ,
318350 c:: HANDLE_FLAG_INHERIT , 0 )
319351 } ) . map ( |_| ( ) )
320352 }
321353
354+ #[ cfg( target_vendor = "uwp" ) ]
355+ fn set_no_inherit ( & self ) -> io:: Result < ( ) > {
356+ Err ( io:: Error :: new ( io:: ErrorKind :: Other , "Unavailable on UWP" ) )
357+ }
358+
322359 pub fn shutdown ( & self , how : Shutdown ) -> io:: Result < ( ) > {
323360 let how = match how {
324361 Shutdown :: Write => c:: SD_SEND ,
0 commit comments