1
0
mirror of https://github.com/solemnwarning/ipxwrapper synced 2024-12-30 16:45:37 +01:00

Cleaned up error handling a bit and changed DirectPlay discovery socket number.

This commit is contained in:
Daniel Collins 2011-08-28 18:49:37 +00:00
parent e5271a3df6
commit 4bbf47721c

View File

@ -46,8 +46,7 @@ const GUID IPX_GUID = {
{0xA9, 0xCD, 0x00, 0xAA, 0x00, 0x68, 0x86, 0xE3} {0xA9, 0xCD, 0x00, 0xAA, 0x00, 0x68, 0x86, 0xE3}
}; };
#define DIRECTPLAY_SOCKET 9001 #define DISCOVERY_SOCKET 42367
#define API_HEADER_SIZE sizeof(struct sockaddr_ipx) #define API_HEADER_SIZE sizeof(struct sockaddr_ipx)
/* Lock the object mutex and return the data pointer */ /* Lock the object mutex and return the data pointer */
@ -56,7 +55,10 @@ static struct sp_data *get_sp_data(IDirectPlaySP *sp) {
DWORD size; DWORD size;
HRESULT r = IDirectPlaySP_GetSPData(sp, (void**)&cont, &size, DPGET_LOCAL); HRESULT r = IDirectPlaySP_GetSPData(sp, (void**)&cont, &size, DPGET_LOCAL);
//log_printf("GetSPData: %d", r); if(r != DP_OK) {
log_printf("GetSPData: %d", (int)r);
abort();
}
WaitForSingleObject(cont->mutex, INFINITE); WaitForSingleObject(cont->mutex, INFINITE);
@ -69,7 +71,10 @@ static void release_sp_data(IDirectPlaySP *sp) {
DWORD size; DWORD size;
HRESULT r = IDirectPlaySP_GetSPData(sp, (void**)&cont, &size, DPGET_LOCAL); HRESULT r = IDirectPlaySP_GetSPData(sp, (void**)&cont, &size, DPGET_LOCAL);
//log_printf("GetSPData: %d", r); if(r != DP_OK) {
log_printf("GetSPData: %d", (int)r);
abort();
}
ReleaseMutex(cont->mutex); ReleaseMutex(cont->mutex);
} }
@ -139,7 +144,7 @@ static HRESULT WINAPI IPX_EnumSessions(LPDPSP_ENUMSESSIONSDATA data) {
memcpy(&addr, &(sp_data->addr), sizeof(addr)); memcpy(&addr, &(sp_data->addr), sizeof(addr));
memset(addr.sa_nodenum, 0xFF, 6); memset(addr.sa_nodenum, 0xFF, 6);
addr.sa_socket = htons(DIRECTPLAY_SOCKET); addr.sa_socket = htons(DISCOVERY_SOCKET);
if(sendto(sp_data->sock, data->lpMessage + API_HEADER_SIZE, data->dwMessageSize - API_HEADER_SIZE, 0, (struct sockaddr*)&addr, sizeof(addr)) == -1) { if(sendto(sp_data->sock, data->lpMessage + API_HEADER_SIZE, data->dwMessageSize - API_HEADER_SIZE, 0, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
log_printf("sendto failed: %s", w32_error(WSAGetLastError())); log_printf("sendto failed: %s", w32_error(WSAGetLastError()));
@ -155,7 +160,7 @@ static HRESULT WINAPI IPX_EnumSessions(LPDPSP_ENUMSESSIONSDATA data) {
static HRESULT WINAPI IPX_Send(LPDPSP_SENDDATA data) { static HRESULT WINAPI IPX_Send(LPDPSP_SENDDATA data) {
//log_printf("IPX_Send called"); //log_printf("IPX_Send called");
struct sockaddr_ipx addr_buf, *addr = NULL; struct sockaddr_ipx *addr = NULL;
struct sp_data *sp_data = get_sp_data(data->lpISP); struct sp_data *sp_data = get_sp_data(data->lpISP);
@ -172,14 +177,10 @@ static HRESULT WINAPI IPX_Send(LPDPSP_SENDDATA data) {
} }
if(!addr) { if(!addr) {
log_printf("No known address for player ID %u, falling back to broadcast", data->idPlayerTo); log_printf("No known address for player ID %u, dropping packet", data->idPlayerTo);
addr = &addr_buf; release_sp_data(data->lpISP);
return DP_OK;
memcpy(addr, &(sp_data->addr), sizeof(addr_buf));
memset(addr->sa_nodenum, 0xFF, 6);
addr->sa_socket = htons(DIRECTPLAY_SOCKET);
} }
if(sendto(sp_data->sock, data->lpMessage + API_HEADER_SIZE, data->dwMessageSize - API_HEADER_SIZE, 0, (struct sockaddr*)addr, sizeof(*addr)) == -1) { if(sendto(sp_data->sock, data->lpMessage + API_HEADER_SIZE, data->dwMessageSize - API_HEADER_SIZE, 0, (struct sockaddr*)addr, sizeof(*addr)) == -1) {
@ -256,11 +257,12 @@ static HRESULT WINAPI IPX_Reply(LPDPSP_REPLYDATA data) {
} }
static HRESULT WINAPI IPX_CreatePlayer(LPDPSP_CREATEPLAYERDATA data) { static HRESULT WINAPI IPX_CreatePlayer(LPDPSP_CREATEPLAYERDATA data) {
//log_printf("IPX_CreatePlayer called (player = %u, flags = %u, header = %p)", data->idPlayer, data->dwFlags, data->lpSPMessageHeader);
if(data->lpSPMessageHeader) { if(data->lpSPMessageHeader) {
HRESULT r = IDirectPlaySP_SetSPPlayerData(data->lpISP, data->idPlayer, data->lpSPMessageHeader, sizeof(struct sockaddr_ipx), DPSET_LOCAL); HRESULT r = IDirectPlaySP_SetSPPlayerData(data->lpISP, data->idPlayer, data->lpSPMessageHeader, sizeof(struct sockaddr_ipx), DPSET_LOCAL);
//log_printf("SetSPPlayerData: %d", r); if(r != DP_OK) {
log_printf("SetSPPlayerData: %d", (int)r);
return DPERR_GENERIC;
}
} }
return DP_OK; return DP_OK;
@ -308,7 +310,7 @@ static HRESULT WINAPI IPX_Open(LPDPSP_OPENDATA data) {
struct sockaddr_ipx addr; struct sockaddr_ipx addr;
memcpy(&addr, &(sp_data->addr), sizeof(addr)); memcpy(&addr, &(sp_data->addr), sizeof(addr));
addr.sa_socket = htons(DIRECTPLAY_SOCKET); addr.sa_socket = htons(DISCOVERY_SOCKET);
if(ipx_ex_bind(sp_data->sock, &addr) == -1) { if(ipx_ex_bind(sp_data->sock, &addr) == -1) {
release_sp_data(data->lpISP); release_sp_data(data->lpISP);
@ -323,6 +325,12 @@ static HRESULT WINAPI IPX_Open(LPDPSP_OPENDATA data) {
} }
static HRESULT WINAPI IPX_CloseEx(LPDPSP_CLOSEDATA data) { static HRESULT WINAPI IPX_CloseEx(LPDPSP_CLOSEDATA data) {
struct sp_data *sp_data = get_sp_data(data->lpISP);
/* Disable the special bind if in use */
ipx_ex_bind(sp_data->sock, NULL);
release_sp_data(data->lpISP);
return DP_OK; return DP_OK;
} }
@ -419,7 +427,15 @@ HRESULT WINAPI SPInit(LPSPINITDATA data) {
cont.mutex = mutex; cont.mutex = mutex;
HRESULT r = IDirectPlaySP_SetSPData(data->lpISP, &cont, sizeof(cont), DPSET_LOCAL); HRESULT r = IDirectPlaySP_SetSPData(data->lpISP, &cont, sizeof(cont), DPSET_LOCAL);
//log_printf("SetSPData: %d", r); if(r != DP_OK) {
log_printf("SetSPData: %d", (int)r);
closesocket(sp_data->sock);
CloseHandle(mutex);
free(sp_data);
return DPERR_UNAVAILABLE;
}
data->lpCB->EnumSessions = &IPX_EnumSessions; data->lpCB->EnumSessions = &IPX_EnumSessions;
data->lpCB->Send = &IPX_Send; data->lpCB->Send = &IPX_Send;