Skip to content

Commit 48d08ea

Browse files
committed
[MSWSOCK]
- Implement FIONBIO and fix the error case to not cause a deadlock later svn path=/branches/aicom-network-branch/; revision=48519
1 parent 641cb7e commit 48d08ea

File tree

1 file changed

+25
-16
lines changed

1 file changed

+25
-16
lines changed

dll/win32/mswsock/msafd/sockopt.c

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,8 @@ WSPIoctl(IN SOCKET Handle,
213213
PSOCKET_INFORMATION Socket;
214214
INT ErrorCode;
215215
PWINSOCK_TEB_DATA ThreadData;
216-
216+
BOOLEAN Blocking;
217+
217218
/* Enter prolog */
218219
ErrorCode = SockEnterApiFast(&ThreadData);
219220
if (ErrorCode != NO_ERROR)
@@ -222,7 +223,7 @@ WSPIoctl(IN SOCKET Handle,
222223
*lpErrno = ErrorCode;
223224
return SOCKET_ERROR;
224225
}
225-
226+
226227
/* Get the socket structure */
227228
Socket = SockFindAndReferenceSocket(Handle, TRUE);
228229
if (!Socket)
@@ -231,31 +232,39 @@ WSPIoctl(IN SOCKET Handle,
231232
ErrorCode = WSAENOTSOCK;
232233
goto error;
233234
}
234-
235+
235236
/* Lock the socket */
236237
EnterCriticalSection(&Socket->Lock);
237-
238+
238239
switch(dwIoControlCode) {
239-
240-
case FIONBIO:
241-
240+
241+
case FIONBIO:
242242
/* Check if the Buffer is OK */
243243
if(cbInBuffer < sizeof(ULONG))
244244
{
245245
/* Fail */
246246
ErrorCode = WSAEFAULT;
247247
goto error;
248248
}
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+
252261
default:
253-
262+
254263
/* Unsupported for now */
255-
*lpErrno = WSAEINVAL;
256-
return SOCKET_ERROR;
264+
ErrorCode = WSAEINVAL;
265+
break;
257266
}
258-
267+
259268
error:
260269
/* Check if we had a socket */
261270
if (Socket)
@@ -264,15 +273,15 @@ WSPIoctl(IN SOCKET Handle,
264273
LeaveCriticalSection(&Socket->Lock);
265274
SockDereferenceSocket(Socket);
266275
}
267-
276+
268277
/* Check for error */
269278
if (ErrorCode != NO_ERROR)
270279
{
271280
/* Return error */
272281
*lpErrno = ErrorCode;
273282
return SOCKET_ERROR;
274283
}
275-
284+
276285
/* Return to caller */
277286
return NO_ERROR;
278287
}

0 commit comments

Comments
 (0)