| version 1.3 | | version 1.4 |
|---|
| | |
| #include <stdlib.h> | | #include <stdlib.h> |
| #include <winsock.h> | | #include <winsock.h> |
| #include <wsipx.h> | | #include <wsipx.h> |
| #include <errno.h> | | //#include <errno.h> |
| | | |
| #include "ipx_drv.h" | | #include "ipx_drv.h" |
| | | |
| #include "mono.h" | | #include "mono.h" |
| | | |
| | | static ipx_socket_t mysock; |
| | | |
| //#define n_printf(format, args...) mprintf((1, format, ## args)) | | //#define n_printf(format, args...) mprintf((1, format, ## args)) |
| | | |
| static int ipx_win_GetMyAddress( void ) | | static int ipx_win_GetMyAddress( void ) |
| | |
| return(0); | | return(0); |
| } | | } |
| | | |
| static int ipx_win_OpenSocket(ipx_socket_t *sk, int port) | | static int ipx_win_OpenSocket(int port) |
| { | | { |
| int sock; /* sock here means Linux socket handle */ | | int sock; /* sock here means Linux socket handle */ |
| int opt; | | int opt; |
| | |
| int len; | | int len; |
| struct sockaddr_ipx ipxs2; | | struct sockaddr_ipx ipxs2; |
| | | |
| | | WORD wVersionRequested; |
| | | WSADATA wsaData; |
| | | |
| | | wVersionRequested = MAKEWORD(2, 0); |
| | | if (WSAStartup( wVersionRequested, &wsaData)) |
| | | { |
| | | return -1; |
| | | } |
| | | #if 0 |
| | | if ( LOBYTE( wsaData.wVersion ) != 2 || |
| | | HIBYTE( wsaData.wVersion ) != 0 ) { |
| | | /* We couldn't find a usable WinSock DLL. */ |
| | | WSACleanup( ); |
| | | return -2; |
| | | } |
| | | #endif |
| | | |
| | | |
| /* DANG_FIXTHIS - kludge to support broken linux IPX stack */ | | /* DANG_FIXTHIS - kludge to support broken linux IPX stack */ |
| /* need to convert dynamic socket open into a real socket number */ | | /* need to convert dynamic socket open into a real socket number */ |
| /* if (port == 0) { | | /* if (port == 0) { |
| | |
| memcpy(ipx_MyAddress, ipxs2.sa_netnum, 4); | | memcpy(ipx_MyAddress, ipxs2.sa_netnum, 4); |
| memcpy(ipx_MyAddress + 4, ipxs2.sa_nodenum, 6); | | memcpy(ipx_MyAddress + 4, ipxs2.sa_nodenum, 6); |
| | | |
| sk->fd = sock; | | mysock.fd = sock; |
| sk->socket = port; | | mysock.socket = port; |
| | | |
| | | ipx_win_GetMyAddress(); |
| | | |
| return 0; | | return 0; |
| } | | } |
| | | |
| static void ipx_win_CloseSocket(ipx_socket_t *mysock) { | | static void ipx_win_CloseSocket(void) { |
| /* now close the file descriptor for the socket, and free it */ | | /* now close the file descriptor for the socket, and free it */ |
| mprintf((1,"IPX: closing file descriptor on socket %x\n", mysock->socket)); | | mprintf((1,"IPX: closing file descriptor on socket %x\n", mysock.socket)); |
| closesocket(mysock->fd); | | closesocket(mysock.fd); |
| | | WSACleanup(); |
| } | | } |
| | | |
| static int ipx_win_SendPacket(ipx_socket_t *mysock, IPXPacket_t *IPXHeader, | | static int ipx_win_SendPacket(IPXPacket_t *IPXHeader, |
| u_char *data, int dataLen) { | | ubyte *data, int dataLen) { |
| struct sockaddr_ipx ipxs; | | struct sockaddr_ipx ipxs; |
| | | |
| ipxs.sa_family = AF_IPX; | | ipxs.sa_family = AF_IPX; |
| | |
| /* ipxs.sa_netnum = htonl(MyNetwork); */ | | /* ipxs.sa_netnum = htonl(MyNetwork); */ |
| } | | } |
| memcpy(&ipxs.sa_nodenum, IPXHeader->Destination.Node, 6); | | memcpy(&ipxs.sa_nodenum, IPXHeader->Destination.Node, 6); |
| memcpy(&ipxs.sa_socket, IPXHeader->Destination.Socket, 2); | | // memcpy(&ipxs.sa_socket, IPXHeader->Destination.Socket, 2); |
| | | ipxs.sa_socket=htons(mysock.socket); |
| // ipxs.sa_type = IPXHeader->PacketType; | | // ipxs.sa_type = IPXHeader->PacketType; |
| /* ipxs.sipx_port=htons(0x452); */ | | /* ipxs.sipx_port=htons(0x452); */ |
| return sendto(mysock->fd, data, dataLen, 0, | | return sendto(mysock.fd, data, dataLen, 0, |
| (struct sockaddr *) &ipxs, sizeof(ipxs)); | | (struct sockaddr *) &ipxs, sizeof(ipxs)); |
| } | | } |
| | | |
| static int ipx_win_ReceivePacket(ipx_socket_t *s, char *buffer, int bufsize, | | static int ipx_win_ReceivePacket(char *buffer, int bufsize, |
| struct ipx_recv_data *rd) { | | struct ipx_recv_data *rd) { |
| int sz, size; | | int sz, size; |
| struct sockaddr_ipx ipxs; | | struct sockaddr_ipx ipxs; |
| | | |
| sz = sizeof(ipxs); | | sz = sizeof(ipxs); |
| if ((size = recvfrom(s->fd, buffer, bufsize, 0, | | if ((size = recvfrom(mysock.fd, buffer, bufsize, 0, |
| (struct sockaddr *) &ipxs, &sz)) <= 0) | | (struct sockaddr *) &ipxs, &sz)) <= 0) |
| return size; | | return size; |
| memcpy(rd->src_network, ipxs.sa_netnum, 4); | | memcpy(rd->src_network, ipxs.sa_netnum, 4); |
| memcpy(rd->src_node, ipxs.sa_nodenum, 6); | | memcpy(rd->src_node, ipxs.sa_nodenum, 6); |
| rd->src_socket = ipxs.sa_socket; | | rd->src_socket = ipxs.sa_socket; |
| rd->dst_socket = s->socket; | | rd->dst_socket = mysock.socket; |
| // rd->pkt_type = ipxs.sipx_type; | | // rd->pkt_type = ipxs.sipx_type; |
| | | |
| return size; | | return size; |
| } | | } |
| | | |
| | | static int ipx_win_general_PacketReady(void) { |
| | | return ipx_general_PacketReady(mysock.fd); |
| | | } |
| | | |
| struct ipx_driver ipx_win = { | | struct ipx_driver ipx_win = { |
| ipx_win_GetMyAddress, | | // ipx_win_GetMyAddress, |
| ipx_win_OpenSocket, | | ipx_win_OpenSocket, |
| ipx_win_CloseSocket, | | ipx_win_CloseSocket, |
| ipx_win_SendPacket, | | ipx_win_SendPacket, |
| ipx_win_ReceivePacket, | | ipx_win_ReceivePacket, |
| ipx_general_PacketReady | | ipx_win_general_PacketReady, |
| | | NULL, |
| | | 1, |
| | | NULL, |
| | | NULL, |
| | | NULL |
| }; | | }; |