- Map winsock sockopts to the POSIX equivalents for IP multicast.
- Remap winsock1 constant values to winsock2 using a forwarder function. - Change a FIXME to a TRACE, it appeared to be simply reporting progress.
This commit is contained in:
parent
39f73ddeaa
commit
ceb86a90f8
|
@ -278,6 +278,34 @@ static int _px_tcp_ops[] = {
|
|||
0
|
||||
};
|
||||
|
||||
static const int _ws_ip_ops[] =
|
||||
{
|
||||
WS_IP_MULTICAST_IF,
|
||||
WS_IP_MULTICAST_TTL,
|
||||
WS_IP_MULTICAST_LOOP,
|
||||
WS_IP_ADD_MEMBERSHIP,
|
||||
WS_IP_DROP_MEMBERSHIP,
|
||||
WS_IP_OPTIONS,
|
||||
WS_IP_HDRINCL,
|
||||
WS_IP_TOS,
|
||||
WS_IP_TTL,
|
||||
0
|
||||
};
|
||||
|
||||
static const int _px_ip_ops[] =
|
||||
{
|
||||
IP_MULTICAST_IF,
|
||||
IP_MULTICAST_TTL,
|
||||
IP_MULTICAST_LOOP,
|
||||
IP_ADD_MEMBERSHIP,
|
||||
IP_DROP_MEMBERSHIP,
|
||||
IP_OPTIONS,
|
||||
IP_HDRINCL,
|
||||
IP_TOS,
|
||||
IP_TTL,
|
||||
0
|
||||
};
|
||||
|
||||
static DWORD opentype_tls_index = -1; /* TLS index for SO_OPENTYPE flag */
|
||||
|
||||
inline static DWORD NtStatusToWSAError ( const DWORD status )
|
||||
|
@ -482,6 +510,18 @@ static int convert_sockopt(INT *level, INT *optname)
|
|||
}
|
||||
FIXME("Unknown IPPROTO_TCP optname 0x%x\n", *optname);
|
||||
break;
|
||||
case WS_IPPROTO_IP:
|
||||
*level = IPPROTO_IP;
|
||||
for(i=0; _ws_ip_ops[i]; i++) {
|
||||
if (_ws_ip_ops[i] == *optname ) break;
|
||||
}
|
||||
if( _ws_ip_ops[i] ) {
|
||||
*optname = _px_ip_ops[i];
|
||||
return 1;
|
||||
}
|
||||
FIXME("Unknown IPPROTO_IP optname 0x%x\n", *optname);
|
||||
break;
|
||||
default: FIXME("Unimplemented or unknown socket level\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1488,7 +1528,7 @@ int WINAPI WS_bind(SOCKET s, const struct WS_sockaddr* name, int namelen)
|
|||
int on = 1;
|
||||
/* The game GrandPrixLegends binds more than one time, but does
|
||||
* not do a SO_REUSEADDR - Stevens says this is ok */
|
||||
FIXME( "Setting WS_SO_REUSEADDR on socket before we binding it\n");
|
||||
TRACE( "Setting WS_SO_REUSEADDR on socket before we bind it\n");
|
||||
WS_setsockopt( s, WS_SOL_SOCKET, WS_SO_REUSEADDR, (char*)&on, sizeof(on) );
|
||||
|
||||
if (bind(fd, uaddr, uaddrlen) < 0)
|
||||
|
@ -2724,6 +2764,7 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname,
|
|||
level = SOL_SOCKET;
|
||||
}else{
|
||||
if (!convert_sockopt(&level, &optname)) {
|
||||
ERR("Invalid level (%d) or optname (%d)\n", level, optname);
|
||||
SetLastError(WSAENOPROTOOPT);
|
||||
close(fd);
|
||||
return SOCKET_ERROR;
|
||||
|
@ -2791,6 +2832,7 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname,
|
|||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
TRACE("Setting socket error, %d\n", wsaErrno());
|
||||
SetLastError(wsaErrno());
|
||||
close(fd);
|
||||
}
|
||||
|
|
|
@ -40,6 +40,9 @@
|
|||
#define recv linux_recv
|
||||
/* */
|
||||
|
||||
#define setsockopt linux_setsockopt
|
||||
#define getsockopt linux_getsockopt
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <errno.h>
|
||||
|
@ -85,9 +88,55 @@ extern int WINAPI closesocket(SOCKET);
|
|||
extern int WINAPI ioctlsocket(SOCKET,long,u_long*);
|
||||
/* */
|
||||
|
||||
/* for the get/setsockopt forwarders */
|
||||
#undef setsockopt
|
||||
#undef getsockopt
|
||||
extern int WINAPI setsockopt(SOCKET s, INT level, INT optname ,char* optval, INT optlen);
|
||||
extern int WINAPI getsockopt(SOCKET s, INT level, INT optname ,char* optval, INT* optlen);
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(winsock);
|
||||
|
||||
/* internal remapper function for the IP_ constants */
|
||||
static INT _remap_optname(INT level, INT optname)
|
||||
{
|
||||
TRACE("level=%d, optname=%d\n", level, optname);
|
||||
if (level == WS_IPPROTO_IP) {
|
||||
switch (optname) { /***** from value *****/
|
||||
case 2: return 9; /* IP_MULTICAST_IF */
|
||||
case 3: return 10; /* IP_MULTICAST_TTL */
|
||||
case 4: return 11; /* IP_MULTICAST_LOOP */
|
||||
case 5: return 12; /* IP_ADD_MEMBERSHIP */
|
||||
case 6: return 13; /* IP_DROP_MEMBERSHIP */
|
||||
case 7: return 4; /* IP_TTL */
|
||||
case 8: return 3; /* IP_TOS */
|
||||
case 9: return 14; /* IP_DONTFRAGMENT */
|
||||
default: FIXME("Unknown optname %d, can't remap!\n", optname); return optname;
|
||||
}
|
||||
} else {
|
||||
/* don't need to do anything */
|
||||
return optname;
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* setsockopt (WSOCK32.21)
|
||||
*
|
||||
* We have these forwarders because, for reasons unknown to us mere mortals,
|
||||
* the values of the IP_ constants changed between winsock.h and winsock2.h.
|
||||
* So, we need to remap them here.
|
||||
*/
|
||||
INT WINAPI WS1_setsockopt(SOCKET s, INT level, INT optname, char *optval, INT optlen)
|
||||
{
|
||||
return setsockopt(s, level, _remap_optname(level, optname), optval, optlen);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* getsockopt (WSOCK32.7)
|
||||
*/
|
||||
INT WINAPI WS1_getsockopt(SOCKET s, INT level, INT optname, char *optval, INT *optlen)
|
||||
{
|
||||
return getsockopt(s, level, _remap_optname(level, optname), optval, optlen);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* WsControl (WSOCK32.1001)
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
4 stdcall connect(long ptr long) ws2_32.connect
|
||||
5 stdcall getpeername(long ptr ptr) ws2_32.getpeername
|
||||
6 stdcall getsockname(long ptr ptr) ws2_32.getsockname
|
||||
7 stdcall getsockopt(long long long ptr ptr) ws2_32.getsockopt
|
||||
7 stdcall getsockopt(long long long ptr ptr) WS1_getsockopt
|
||||
8 stdcall htonl(long) ws2_32.htonl
|
||||
9 stdcall htons(long) ws2_32.htons
|
||||
10 stdcall inet_addr(str) ws2_32.inet_addr
|
||||
|
@ -18,7 +18,7 @@
|
|||
18 stdcall select(long ptr ptr ptr ptr) ws2_32.select
|
||||
19 stdcall send(long ptr long long) ws2_32.send
|
||||
20 stdcall sendto(long ptr long long ptr long) ws2_32.sendto
|
||||
21 stdcall setsockopt(long long long ptr long) ws2_32.setsockopt
|
||||
21 stdcall setsockopt(long long long ptr long) WS1_setsockopt
|
||||
22 stdcall shutdown(long long) ws2_32.shutdown
|
||||
23 stdcall socket(long long long) ws2_32.socket
|
||||
51 stdcall gethostbyaddr(ptr long long) ws2_32.gethostbyaddr
|
||||
|
|
|
@ -669,6 +669,32 @@ typedef struct WS(WSAData)
|
|||
#define WS_TCP_NODELAY 1
|
||||
#endif
|
||||
|
||||
/* IPPROTO_IP options */
|
||||
#ifndef __WINE_WINSOCK2__ /* WinSock2 has different values for the IP_ constants */
|
||||
# ifndef USE_WS_PREFIX
|
||||
# define IP_OPTIONS 1
|
||||
# define IP_MULTICAST_IF 2
|
||||
# define IP_MULTICAST_TTL 3
|
||||
# define IP_MULTICAST_LOOP 4
|
||||
# define IP_ADD_MEMBERSHIP 5
|
||||
# define IP_DROP_MEMBERSHIP 6
|
||||
# define IP_TTL 7
|
||||
# define IP_TOS 8
|
||||
# define IP_DONTFRAGMENT 9
|
||||
# else
|
||||
# define WS_IP_OPTIONS 1
|
||||
# define WS_IP_MULTICAST_IF 2
|
||||
# define WS_IP_MULTICAST_TTL 3
|
||||
# define WS_IP_MULTICAST_LOOP 4
|
||||
# define WS_IP_ADD_MEMBERSHIP 5
|
||||
# define WS_IP_DROP_MEMBERSHIP 6
|
||||
# define WS_IP_TTL 7
|
||||
# define WS_IP_TOS 8
|
||||
# define WS_IP_DONTFRAGMENT 9
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Socket I/O flags (supported by spec 1.1)
|
||||
*/
|
||||
|
|
|
@ -72,4 +72,28 @@ typedef struct _INTERFACE_INFO
|
|||
#define WS_IFF_MULTICAST 0x00000010 /* multicast is supported */
|
||||
#endif /* USE_WS_PREFIX */
|
||||
|
||||
#ifndef USE_WS_PREFIX
|
||||
#define IP_OPTIONS 1
|
||||
#define IP_HDRINCL 2
|
||||
#define IP_TOS 3
|
||||
#define IP_TTL 4
|
||||
#define IP_MULTICAST_IF 9
|
||||
#define IP_MULTICAST_TTL 10
|
||||
#define IP_MULTICAST_LOOP 11
|
||||
#define IP_ADD_MEMBERSHIP 12
|
||||
#define IP_DROP_MEMBERSHIP 13
|
||||
#define IP_DONTFRAGMENT 14
|
||||
#else
|
||||
#define WS_IP_OPTIONS 1
|
||||
#define WS_IP_HDRINCL 2
|
||||
#define WS_IP_TOS 3
|
||||
#define WS_IP_TTL 4
|
||||
#define WS_IP_MULTICAST_IF 9
|
||||
#define WS_IP_MULTICAST_TTL 10
|
||||
#define WS_IP_MULTICAST_LOOP 11
|
||||
#define WS_IP_ADD_MEMBERSHIP 12
|
||||
#define WS_IP_DROP_MEMBERSHIP 13
|
||||
#define WS_IP_DONTFRAGMENT 14
|
||||
#endif /* USE_WS_PREFIX */
|
||||
|
||||
#endif /* __WS2TCPIP__ */
|
||||
|
|
Loading…
Reference in New Issue