* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * $Id: inet.c,v 1.18 1996/02/09 08:22:13 mhw Exp $
*/
#include "netris.h"
+
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
+#include <setjmp.h>
+
+#include "inet.h"
#define HEADER_SIZE sizeof(netint2[2])
#define HEADER_SIZE3 sizeof(netint4[3])
-ExtFunc MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event);
-EventGenRec netGen =
- { NULL, 0, FT_read, -1, NetGenFunc, EM_net, 0, "\0", 0, HEADER_SIZE3 };
+MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event);
+EventGenRec netGen = {
+ NULL, 0, FT_read, -1, NetGenFunc, EM_net, 0, "\0", 0, HEADER_SIZE3
+};
-ExtFunc int InitiateConnection(char *hostStr, short port)
+static sigjmp_buf close_env;
+
+void CatchInt(int sig)
+{
+ siglongjmp(close_env, 1);
+}
+
+int InitiateConnection(char *hostStr, short port)
{ //connect to host
struct sockaddr_in addr;
struct hostent *host;
+ if (sigsetjmp(close_env, 1))
+ exit(0);
+ signal(SIGINT, CatchInt); //handle exit (^C)
AtExit(CloseNet);
host = gethostbyname(hostStr);
if (!host)
}
AddEventGen(&netGen);
return 0;
-} //InitiateConnection
+}
-ExtFunc void HandShake(void)
+void HandShake(void)
{ //talk to your host
MyEvent event;
do {
if (WaitMyEvent(&event, EM_net) == E_net)
- switch (event.u.net.type) {
+ switch (event.u.net.type) {
case NP_hello:
{
me = event.u.net.uid;
- memcpy(&Players[me], &Players[0], sizeof(Player));
+ memcpy(&Players[me], &Players[0], sizeof(_Player));
fprintf(stderr, "Accepted (%s) as #%d (%s)\n",
event.u.net.data, me, Players[me].name);
SendPacket(0, NP_newPlayer,
- sizeof(Player) - sizeof(Players[me].host)
- - sizeof(Players[me].spy) - sizeof(Players[me].small),
+ sizeof(_Player) - sizeof(Players[me].host),
&Players[me]);
break;
}
{
static struct {
int playerflags;
- int maxplayers; //1
- int started; //2
- int continuous; //3
- long seed; //4
- int initspeed; //5
+ int maxplayers; //1
+ int started; //2
+ int continuous; //3
+ long seed; //4
+ int initspeed; //5
} data;
memcpy(&data, event.u.net.data, event.u.net.size);
} //NP_error
default:
break;
- }
+ }
else
fatal("Hm, the party apparantly ended prematurely.");
- }
- while (event.u.net.type != NP_gamedata);
-} //HandShake
-
-ExtFunc void CheckNetConn(void)
-{ //am I necessary?
+ } while (event.u.net.type != NP_gamedata);
}
-ExtFunc MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event)
+MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event)
{ //receive
int result;
short uid, type, size;
event->u.net.data = gen->buf + HEADER_SIZE3;
if (type == NP_endConn) return E_lostConn;
return E_net;
-} //NetGenFunc
+}
-ExtFunc void SendPacket(short uid, NetPacketType type, int size, void *data)
+void SendPacket(short uid, NetPacketType type, int size, void *data)
{ //send shit to server
netint4 header[3];
die("write (header)");
if (size > 0 && data && MyWrite(netGen.fd, data, size) != size)
die("write");
-} //SendPacket
+}
-ExtFunc void CloseNet(void)
+void CloseNet(void)
{ //kick some connection's ass!
MyEvent event;
}
if (netGen.next)
RemoveEventGen(&netGen);
-} //CloseNet
+}
-/*
- * vi: ts=4 ai
- * vim: noai si
- */