@@ -213,7 +213,8 @@ WSPIoctl(IN SOCKET Handle,
213
213
PSOCKET_INFORMATION Socket ;
214
214
INT ErrorCode ;
215
215
PWINSOCK_TEB_DATA ThreadData ;
216
-
216
+ BOOLEAN Blocking ;
217
+
217
218
/* Enter prolog */
218
219
ErrorCode = SockEnterApiFast (& ThreadData );
219
220
if (ErrorCode != NO_ERROR )
@@ -222,7 +223,7 @@ WSPIoctl(IN SOCKET Handle,
222
223
* lpErrno = ErrorCode ;
223
224
return SOCKET_ERROR ;
224
225
}
225
-
226
+
226
227
/* Get the socket structure */
227
228
Socket = SockFindAndReferenceSocket (Handle , TRUE);
228
229
if (!Socket )
@@ -231,31 +232,39 @@ WSPIoctl(IN SOCKET Handle,
231
232
ErrorCode = WSAENOTSOCK ;
232
233
goto error ;
233
234
}
234
-
235
+
235
236
/* Lock the socket */
236
237
EnterCriticalSection (& Socket -> Lock );
237
-
238
+
238
239
switch (dwIoControlCode ) {
239
-
240
- case FIONBIO :
241
-
240
+
241
+ case FIONBIO :
242
242
/* Check if the Buffer is OK */
243
243
if (cbInBuffer < sizeof (ULONG ))
244
244
{
245
245
/* Fail */
246
246
ErrorCode = WSAEFAULT ;
247
247
goto error ;
248
248
}
249
-
250
- return 0 ;
251
-
249
+
250
+ Blocking = (* (PULONG )lpvInBuffer ) ? TRUE : FALSE;
251
+
252
+ Socket -> SharedData .NonBlocking = Blocking ;
253
+
254
+ ErrorCode = SockSetInformation (Socket ,
255
+ AFD_INFO_BLOCKING_MODE ,
256
+ & Blocking ,
257
+ NULL ,
258
+ NULL );
259
+ break ;
260
+
252
261
default :
253
-
262
+
254
263
/* Unsupported for now */
255
- * lpErrno = WSAEINVAL ;
256
- return SOCKET_ERROR ;
264
+ ErrorCode = WSAEINVAL ;
265
+ break ;
257
266
}
258
-
267
+
259
268
error :
260
269
/* Check if we had a socket */
261
270
if (Socket )
@@ -264,15 +273,15 @@ WSPIoctl(IN SOCKET Handle,
264
273
LeaveCriticalSection (& Socket -> Lock );
265
274
SockDereferenceSocket (Socket );
266
275
}
267
-
276
+
268
277
/* Check for error */
269
278
if (ErrorCode != NO_ERROR )
270
279
{
271
280
/* Return error */
272
281
* lpErrno = ErrorCode ;
273
282
return SOCKET_ERROR ;
274
283
}
275
-
284
+
276
285
/* Return to caller */
277
286
return NO_ERROR ;
278
287
}
0 commit comments