Patch: 004-socket.diff
Martin Wilck
Martin.Wilck at fujitsu-siemens.com
Mon Jan 7 09:36:58 CST 2002
#4 in series (incremental)
Patch file: 004-socket.diff
Purpose: Move socket() functionality to WS2_32 code
Created: 2002-01-07
Applies: CVS 2002-01-07
(with 003-sock_basic.diff applied)
This patch moves the functionality of WS_socket() to WSASocketA().
WSASocketA() accounts for WSA_FLAG_OVERLAPPED.
dlls/winsock/socket.c:
WS_socket(): Is now a wrapper around WSASocketA().
WSA_FLAG_OVERLAPPED is set according to the SO_OPENTYPE value.
WSASocketA(): Has the functionality formerly in WS_socket().
Honours WSA_FLAG_OVERLAPPED.
Martin Wilck <Martin.Wilck at Fujitsu-Siemens.com>
diff -ru -X diffignore CVS/wine/dlls/winsock/socket.c MW/wine/dlls/winsock/socket.c
--- CVS/wine/dlls/winsock/socket.c Mon Jan 7 12:45:56 2002
+++ MW/wine/dlls/winsock/socket.c Mon Jan 7 12:51:27 2002
@@ -2329,81 +2329,14 @@
*/
SOCKET WINAPI WS_socket(int af, int type, int protocol)
{
- SOCKET ret;
-
TRACE("af=%d type=%d protocol=%d\n", af, type, protocol);
- /* check the socket family */
- switch(af)
- {
-#ifdef HAVE_IPX
- case WS_AF_IPX: af = AF_IPX;
-#endif
- case AF_INET:
- case AF_UNSPEC: break;
- default: SetLastError(WSAEAFNOSUPPORT);
- return INVALID_SOCKET;
- }
-
- /* check the socket type */
- switch(type)
- {
- case WS_SOCK_STREAM:
- type=SOCK_STREAM;
- break;
- case WS_SOCK_DGRAM:
- type=SOCK_DGRAM;
- break;
- case WS_SOCK_RAW:
- type=SOCK_RAW;
- break;
- default: SetLastError(WSAESOCKTNOSUPPORT);
- return INVALID_SOCKET;
- }
-
- /* check the protocol type */
- if ( protocol < 0 ) /* don't support negative values */
- { SetLastError(WSAEPROTONOSUPPORT); return INVALID_SOCKET; }
-
- if ( af == AF_UNSPEC) /* did they not specify the address family? */
- switch(protocol)
- {
- case IPPROTO_TCP:
- if (type == SOCK_STREAM) { af = AF_INET; break; }
- case IPPROTO_UDP:
- if (type == SOCK_DGRAM) { af = AF_INET; break; }
- default: SetLastError(WSAEPROTOTYPE); return INVALID_SOCKET;
- }
-
- SERVER_START_REQ( create_socket )
- {
- req->family = af;
- req->type = type;
- req->protocol = protocol;
- req->access = GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE;
- req->flags = 0U;
- req->inherit = TRUE;
- set_error( wine_server_call( req ) );
- ret = (SOCKET)reply->handle;
- }
- SERVER_END_REQ;
- if (ret)
- {
- TRACE("\tcreated %04x\n", ret );
- return ret;
- }
-
- if (GetLastError() == WSAEACCES) /* raw socket denied */
- {
- if (type == SOCK_RAW)
- MESSAGE("WARNING: Trying to create a socket of type SOCK_RAW, will fail unless running as root\n");
- else
- MESSAGE("WS_SOCKET: not enough privileges to create socket, try running as root\n");
- SetLastError(WSAESOCKTNOSUPPORT);
- }
+ /* The Winsock2 specification states that socket() always opens sockets
+ in overlapped mode.
+ FIXME: is the SO_OPENTYPE behaviour correct? */
- WARN("\t\tfailed!\n");
- return INVALID_SOCKET;
+ return WSASocketA ( af, type, protocol, NULL, 0,
+ (opentype ? 0 : WSA_FLAG_OVERLAPPED) );
}
/***********************************************************************
@@ -2974,17 +2907,88 @@
LPWSAPROTOCOL_INFOA lpProtocolInfo,
GROUP g, DWORD dwFlags)
{
+ SOCKET ret;
+
/*
FIXME: The "advanced" parameters of WSASocketA (lpProtocolInfo,
- g, dwFlags) are ignored.
+ g, dwFlags except WSA_FLAG_OVERLAPPED) are ignored.
*/
TRACE("af=%d type=%d protocol=%d protocol_info=%p group=%d flags=0x%lx\n",
af, type, protocol, lpProtocolInfo, g, dwFlags );
- return ( WS_socket (af, type, protocol) );
-}
+ /* check the socket family */
+ switch(af)
+ {
+#ifdef HAVE_IPX
+ case WS_AF_IPX: af = AF_IPX;
+#endif
+ case AF_INET:
+ case AF_UNSPEC: break;
+ default: SetLastError(WSAEAFNOSUPPORT);
+ return INVALID_SOCKET;
+ }
+
+ /* check the socket type */
+ switch(type)
+ {
+ case WS_SOCK_STREAM:
+ type=SOCK_STREAM;
+ break;
+ case WS_SOCK_DGRAM:
+ type=SOCK_DGRAM;
+ break;
+ case WS_SOCK_RAW:
+ type=SOCK_RAW;
+ break;
+ default: SetLastError(WSAESOCKTNOSUPPORT);
+ return INVALID_SOCKET;
+ }
+
+ /* check the protocol type */
+ if ( protocol < 0 ) /* don't support negative values */
+ { SetLastError(WSAEPROTONOSUPPORT); return INVALID_SOCKET; }
+
+ if ( af == AF_UNSPEC) /* did they not specify the address family? */
+ switch(protocol)
+ {
+ case IPPROTO_TCP:
+ if (type == SOCK_STREAM) { af = AF_INET; break; }
+ case IPPROTO_UDP:
+ if (type == SOCK_DGRAM) { af = AF_INET; break; }
+ default: SetLastError(WSAEPROTOTYPE); return INVALID_SOCKET;
+ }
+
+ SERVER_START_REQ( create_socket )
+ {
+ req->family = af;
+ req->type = type;
+ req->protocol = protocol;
+ req->access = GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE;
+ req->flags = dwFlags;
+ req->inherit = TRUE;
+ set_error( wine_server_call( req ) );
+ ret = (SOCKET)reply->handle;
+ }
+ SERVER_END_REQ;
+ if (ret)
+ {
+ TRACE("\tcreated %04x\n", ret );
+ return ret;
+ }
+
+ if (GetLastError() == WSAEACCES) /* raw socket denied */
+ {
+ if (type == SOCK_RAW)
+ MESSAGE("WARNING: Trying to create a socket of type SOCK_RAW, will fail unless running as root\n");
+ else
+ MESSAGE("WS_SOCKET: not enough privileges to create socket, try running as root\n");
+ SetLastError(WSAESOCKTNOSUPPORT);
+ }
+ WARN("\t\tfailed!\n");
+ return INVALID_SOCKET;
+}
/***********************************************************************
* __WSAFDIsSet (WINSOCK.151)
More information about the wine-devel
mailing list