X-Git-Url: http://git.shiar.net/netris.git/blobdiff_plain/4f561019fc85c2817e3a72341397d1df32bc0868..0e934ad47c5e35e9a652dbe56961a707a32e7a54:/inet.c diff --git a/inet.c b/inet.c index 2caca52..ca3230c 100644 --- a/inet.c +++ b/inet.c @@ -20,6 +20,7 @@ */ #include "netris.h" + #include #include #include @@ -28,20 +29,33 @@ #include #include #include +#include + +#include "inet.h" #define HEADER_SIZE sizeof(netint2[2]) #define HEADER_SIZE3 sizeof(netint4[3]) -ExtFunc MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event); +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) @@ -63,9 +77,9 @@ ExtFunc int InitiateConnection(char *hostStr, short port) } AddEventGen(&netGen); return 0; -} //InitiateConnection +} -ExtFunc void HandShake(void) +void HandShake(void) { //talk to your host MyEvent event; @@ -78,57 +92,58 @@ ExtFunc void HandShake(void) 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; } + case NP_team: + { //receive your teamnumber + memcpy(&Players[event.u.net.uid].team, event.u.net.data, + event.u.net.size); + break; + } //NP_team case NP_gamedata: { 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); memcpy(&Players[me].flags, &data, sizeof(data.playerflags)); + memcpy(&Players[me].flags, &data, sizeof(data.playerflags)); memcpy(&Game, &data.maxplayers, sizeof(data) - sizeof(data.playerflags)); - SRandom(Game.seed); break; - } + } //NP_gamedata case NP_error: { fprintf(stderr, "Rejected by server: %s\n", event.u.net.data); exit(1); - } + } //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? } -ExtFunc MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event) +MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event) { //receive int result; short uid, type, size; @@ -160,9 +175,9 @@ ExtFunc MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event) 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]; @@ -173,9 +188,9 @@ ExtFunc void SendPacket(short uid, NetPacketType type, int size, void *data) 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; @@ -186,9 +201,5 @@ ExtFunc void CloseNet(void) } if (netGen.next) RemoveEventGen(&netGen); -} //CloseNet +} -/* - * vi: ts=4 ai - * vim: noai si - */