reactos/dll/win32/ws2_32/src/ioctl.c

98 lines
2.7 KiB
C

/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS WinSock 2 API
* FILE: dll/win32/ws2_32_new/src/ioctl.c
* PURPOSE: Socket I/O Control Code support.
* PROGRAMMER: Alex Ionescu (alex@relsoft.net)
*/
/* INCLUDES ******************************************************************/
#include <ws2_32.h>
#define NDEBUG
#include <debug.h>
/* FUNCTIONS *****************************************************************/
/*
* @implemented
*/
INT
WSAAPI
ioctlsocket(IN SOCKET s,
IN LONG cmd,
IN OUT ULONG FAR* argp)
{
DWORD Dummy;
/* Let WSA do it */
return WSAIoctl(s,
cmd,
argp,
sizeof(ULONG),
argp,
sizeof(ULONG),
&Dummy,
NULL,
NULL);
}
/*
* @implemented
*/
INT
WSAAPI
WSAIoctl(IN SOCKET s,
IN DWORD dwIoControlCode,
IN LPVOID lpvInBuffer,
IN DWORD cbInBuffer,
OUT LPVOID lpvOutBuffer,
IN DWORD cbOutBuffer,
OUT LPDWORD lpcbBytesReturned,
IN LPWSAOVERLAPPED lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{
PWSSOCKET Socket;
INT Status;
INT ErrorCode;
LPWSATHREADID ThreadId;
DPRINT("WSAIoctl: %lx, %lx\n", s, dwIoControlCode);
/* Check for WSAStartup */
if ((ErrorCode = WsQuickPrologTid(&ThreadId)) == ERROR_SUCCESS)
{
/* Get the Socket Context */
if ((Socket = WsSockGetSocket(s)))
{
/* Make the call */
Status = Socket->Provider->Service.lpWSPIoctl(s,
dwIoControlCode,
lpvInBuffer,
cbInBuffer,
lpvOutBuffer,
cbOutBuffer,
lpcbBytesReturned,
lpOverlapped,
lpCompletionRoutine,
ThreadId,
&ErrorCode);
/* Deference the Socket Context */
WsSockDereference(Socket);
/* Return Provider Value */
if (Status == ERROR_SUCCESS) return Status;
}
else
{
/* No Socket Context Found */
ErrorCode = WSAENOTSOCK;
}
}
/* Return with an Error */
SetLastError(ErrorCode);
return SOCKET_ERROR;
}