--- /dev/null
+/* FCE Ultra - NES/Famicom Emulator
+ *
+ * Copyright notice for this file:
+ * Copyright (C) 2001 LULU
+ * Copyright (C) 2002 Ben Parnell
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "sdl.h"
+#include <SDL/SDL_net.h>
+#include "sdl-netplay.h"
+
+char *netplayhost=0;
+
+static int tonowait;
+
+int Port=0xFCE;
+int FDnetplay=0;
+
+
+static SDLNet_SocketSet socketset = NULL;
+static TCPsocket tcpsock = NULL, servsock = NULL;
+
+void cleanup(void)
+{
+ if (tcpsock != NULL) {
+ SDLNet_TCP_DelSocket(socketset, tcpsock);
+ SDLNet_TCP_Close(tcpsock);
+ tcpsock = NULL;
+ }
+ if (servsock != NULL) {
+ SDLNet_TCP_DelSocket(socketset, servsock);
+ SDLNet_TCP_Close(servsock);
+ servsock = NULL;
+ }
+ if (socketset != NULL) {
+ SDLNet_FreeSocketSet(socketset);
+ socketset = NULL;
+ }
+}
+
+int FCEUD_NetworkConnect(void)
+{
+ IPaddress serverIP;
+
+ tonowait=0;
+
+ if (netplay == 2) {
+ /* client */
+ printf("connecting to %s\n", netplayhost);
+
+ SDLNet_ResolveHost(&serverIP, netplayhost, Port);
+ if (serverIP.host == INADDR_NONE) {
+ fprintf(stderr, "Couldn't connected to %s\n", netplayhost);
+ return -1;
+ } else {
+ tcpsock = SDLNet_TCP_Open(&serverIP);
+ if (tcpsock == NULL) {
+ fprintf(stderr, "Couldn't connected to %s\n", netplayhost);
+ return -1;
+ }
+ }
+ printf("connected to %s\n", netplayhost);
+
+ socketset = SDLNet_AllocSocketSet(1);
+ if (socketset == NULL) {
+ fprintf(stderr, "Couldn't create socket set: %s\n",
+ SDLNet_GetError());
+ return -1;
+ }
+ SDLNet_TCP_AddSocket(socketset, tcpsock);
+
+ return 1;
+ } else {
+ /* server */
+
+ SDLNet_ResolveHost(&serverIP, NULL, Port);
+ printf("Server IP: %x, %d\n", serverIP.host, serverIP.port);
+ servsock = SDLNet_TCP_Open(&serverIP);
+ if (servsock == NULL) {
+ cleanup();
+ fprintf(stderr, "Couldn't create server socket: %s\n",
+ SDLNet_GetError());
+ return -1;
+ }
+
+ socketset = SDLNet_AllocSocketSet(2);
+ if (socketset == NULL) {
+ fprintf(stderr, "Couldn't create socket set: %s\n",
+ SDLNet_GetError());
+ return -1;
+ }
+ SDLNet_TCP_AddSocket(socketset, servsock);
+
+ if (SDLNet_CheckSockets(socketset, ~0)) {
+ tcpsock = SDLNet_TCP_Accept(servsock);
+ if (tcpsock == NULL) {
+ return -1;
+ }
+ SDLNet_TCP_AddSocket(socketset, tcpsock);
+
+ printf("OK, connected\n");
+ return 1;
+ }
+ }
+
+ return -1;
+}
+
+void FCEUD_NetworkClose(void)
+{
+ cleanup();
+}
+
+int FCEUD_NetworkRecvData(uint8 *data, uint32 len, int block)
+{
+ if(block)
+ {
+ if(SDLNet_TCP_Recv(tcpsock, (void *) data, len)!=len)
+ {
+ cleanup();
+ return(0);
+ }
+ switch(SDLNet_CheckSockets(socketset,0))
+ {
+ case -1:return(0);
+ case 0:NoWaiting&=~2;tonowait=0;break;
+ default:if(tonowait>=3)
+ NoWaiting|=2;
+ else tonowait++;
+ break;
+ }
+ return(1);
+ }
+ else
+ {
+ int t=SDLNet_CheckSockets(socketset,0);
+ if(t<0) return(0);
+ if(!t) return(-1);
+ return(SDLNet_TCP_Recv(tcpsock, (void *) data, len)==len);
+ }
+}
+
+/* 0 on failure, 1 on success. This function should always block. */
+int FCEUD_NetworkSendData(uint8 *Value, uint32 len)
+{
+ if (tcpsock)
+ return(SDLNet_TCP_Send(tcpsock, (void *) Value, len)==len);
+ return 0;
+}