--- /dev/null
+/* FCE Ultra - NES/Famicom Emulator
+ *
+ * Copyright notice for this file:
+ * 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 <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <netdb.h>
+#include <errno.h>
+
+#ifndef socklen_t
+#define socklen_t int
+#endif
+#ifdef NETWORK
+static int Socket=-1;
+#endif
+#include "main.h"
+#include "unix-netplay.h"
+
+char *netplayhost=0;
+int Port=0xFCE;
+int netplay=0;
+
+int FCEUD_NetworkConnect(void)
+{
+#ifdef NETWORK
+ struct sockaddr_in sockn;
+ int TSocket;
+
+ memset(&sockn,0,sizeof(sockn));
+ sockn.sin_family=AF_INET;
+ sockn.sin_port=htons(Port);
+
+ if((TSocket=socket(AF_INET, SOCK_STREAM, 0))<0)
+ {
+ puts("Error creating socket.");
+ return(0);
+ }
+
+ if(netplay==1) /* Be a server. */
+ {
+ sockn.sin_addr.s_addr=INADDR_ANY;
+ if(bind(TSocket, (struct sockaddr *)&sockn, sizeof(sockn))<0)
+ {
+ close(TSocket);
+ puts("Error binding to socket.");
+ return(0);
+ }
+ if(listen(TSocket, 1)<0)
+ {
+ puts("Error listening on socket.");
+ close(TSocket);
+ return(0);
+ }
+ {
+ socklen_t len=sizeof(sockn);
+
+ printf("Accepting connection on port %d...\n",Port);
+ if((Socket=accept(TSocket,(struct sockaddr *)&sockn,&len))<0 )
+ {
+ puts("Error accepting a connection.");
+ close(TSocket);
+ return(0);
+ }
+ close(TSocket);
+ }
+
+ }
+ else /* Connect as a client if not a server. */
+ {
+ struct hostent *Host;
+
+ if((sockn.sin_addr.s_addr=inet_addr(netplayhost))==INADDR_NONE)
+ {
+ if(!(Host=gethostbyname(netplayhost)))
+ {
+ puts("Error getting network host entry.");
+ return(0);
+ }
+ memcpy(&sockn.sin_addr,Host->h_addr,Host->h_length);
+ }
+ printf("Attempting to connect to %s...\n",netplayhost);
+ if( connect(TSocket, (struct sockaddr *)&sockn, sizeof(sockn)) <0 )
+ {
+ puts("Error connecting to remote host.");
+ close(TSocket);
+ return(0);
+ }
+ Socket=TSocket;
+ }
+#endif
+ return(1);
+}
+
+/* 0 on failure, 1 on success, -1 if it would block and blocking is not
+ specified.
+*/
+
+int FCEUD_NetworkRecvData(uint8 *data, uint32 len, int block)
+{
+#ifdef NETWORK
+ if(block)
+ {
+ int t;
+ uint8 temp[32];
+ t=recv(Socket,temp,32,MSG_PEEK|MSG_DONTWAIT);
+ if(t==-1)
+ {
+ if(errno!=EAGAIN) return(0);
+ }
+ else if(t==32)
+ NoWaiting|=2;
+ else
+ NoWaiting&=~2;
+ return(recv(Socket,data,len,0)==len);
+ }
+ else
+ {
+ int t=recv(Socket,data,len,MSG_DONTWAIT);
+ if(t==-1)
+ {
+ if(errno==EAGAIN) // Would block
+ return(-1);
+ return(0);
+ }
+ return(1);
+ }
+#else
+ return 1;
+#endif
+}
+
+/* 0 on failure, 1 on success. This function should always block. */
+
+int FCEUD_NetworkSendData(uint8 *Value, uint32 len)
+{
+#ifdef NETWORK
+ return(send(Socket,Value,len,0)==len);
+#else
+ return 0;
+#endif
+}
+
+void FCEUD_NetworkClose(void)
+{
+#ifdef NETWORK
+ if(Socket>0)
+ close(Socket);
+ Socket=-1;
+#endif
+}
+