code duplication
[netris.git] / inet.c
diff --git a/inet.c b/inet.c
index b21b1374437b668bcbf4251401f3809676ea37b1..33d49b05c0a767b826c951c031bc1caea82b76da 100644 (file)
--- a/inet.c
+++ b/inet.c
  * 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);
+static MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event);
+static EventGenRec netGen = {
+       NULL, 0, FT_read, -1, NetGenFunc, EM_net, 0, "\0", 0, HEADER_SIZE3
+};
 
-EventGenRec netGen[MAX_SCREENS] = {
-       { NULL, 0, FT_read, -1, NetGenFunc, EM_net, 0, "\0", 0, HEADER_SIZE3 } };
 
+static sigjmp_buf close_env;
+
+static void CatchInt(int sig)
+{
+       siglongjmp(close_env, 1);
+}
 
-ExtFunc int InitiateConnection(char *hostStr, short port)
+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)
@@ -53,21 +65,20 @@ ExtFunc int InitiateConnection(char *hostStr, short port)
        addr.sin_family = host->h_addrtype;
        memcpy(&addr.sin_addr, host->h_addr, host->h_length);
        addr.sin_port = htons(port);
-       if ((netGen[0].fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+       if ((netGen.fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
                die("socket");
-       if (connect(netGen[0].fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+       if (connect(netGen.fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
                if (errno != ECONNREFUSED)
                        die("connect");
-               close(netGen[0].fd);
+               close(netGen.fd);
                sleep(1);
                goto again;
        }
-       AddEventGen(&netGen[0]);
-       totalPlayers = 1;
+       AddEventGen(&netGen);
        return 0;
-} //InitiateConnection
+}
 
-ExtFunc void HandShake(void)
+void HandShake(void)
 { //talk to your host
        MyEvent event;
 
@@ -80,115 +91,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_t));
                                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(player_t) - sizeof(Players[me].host),
                                        &Players[me]);
                                break;
                        }
-                       case NP_gamedata:
-                       {
-                               memcpy(&Game, event.u.net.data, event.u.net.size);
-                               SRandom(Game.seed);
+                       case NP_team:
+                       { //receive your teamnumber
+                               memcpy(&Players[event.u.net.uid].team, event.u.net.data,
+                                       event.u.net.size);
                                break;
-                       }
-                       case NP_newPlayer:
+                       } //NP_team
+                       case NP_gamedata:
                        {
-                               totalPlayers++;
-                               memcpy(&Players[event.u.net.uid],
-                                       event.u.net.data, event.u.net.size);
-                               fprintf(stderr, "Receiving player #%d (%s)\n",
-                                       event.u.net.uid, Players[event.u.net.uid].name);
+                               static struct {
+                                       int playerflags;
+                                       int gravity;     //1
+                                       int started;     //2
+                                       int continuous;  //3
+                                       long seed;       //4
+                                       float shapes[7];
+                                       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.gravity, &data.gravity,
+                                       sizeof(data) - sizeof(data.playerflags));
                                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_goAhead);
-
-       // send Players[0]
-       // receive seed, initspeed
-               // receive #players
-               // receive Players[*]
-
-       /*
-                       {
-                       netint4 data[3];
-                       int len;
-                       int seed;
-
-                       if (protocolVersion >= 3)
-                               len = sizeof(data);
-                       else
-                               len = sizeof(netint4[2]);
-                       if ((Players[0].flags & SCF_setSeed))
-                               seed = Game.seed;
-                       else
-                               seed = time(0);
-                       if (waitConn)
-                               SRandom(seed);
-                       data[0] = hton4(Players[0].flags);
-                       data[1] = hton4(seed);
-                       data[2] = hton4(Game.initspeed);
-                       SendPackets(0, NP_startConn, len, data);
-                       if (WaitMyEvent(&event, EM_net) != E_net ||
-                                       event.u.net.type != NP_startConn)
-                               fatal("Network negotiation failed");
-                       memcpy(data, event.u.net.data, len);
-                       Players[1].flags = ntoh4(data[0]);
-                       seed = ntoh4(data[1]);
-                       if (initConn) {
-                               if ((Players[0].flags & SCF_setSeed) != (Players[1].flags & SCF_setSeed))
-                                       fatal("If one player sets the random number seed, "
-                                                       "both must.");
-                               if ((Players[0].flags & SCF_setSeed) && seed != Game.seed)
-                                       fatal("Both players have set the random number seed, "
-                                                       "and they are unequal.");
-                               if (protocolVersion >= 3 && Game.initspeed != ntoh4(data[2]))
-                                       fatal("Your opponent is using a different step-down "
-                                               "interval (-i).\nYou must both use the same one.");
-                               SRandom(seed);
-                       }
-               }
-               */
-//             SendPackets(0, NP_initData, strlen(Players[0].name) + 1, Players[0].name);
-
-/*
-                       if (WaitMyEvent(&event, EM_net) != E_net ||
-                                       event.u.net.type != NP_userName)
-                               fatal("Network negotiation failed");
-                       strncpy(Players[1].name, event.u.net.data,
-                               sizeof(Players[1].name) - 1);
-                       Players[1].name[sizeof(Players[1].name)-1] = 0;
-                       for (i = 0; Players[1].name[i]; ++i)
-                               if (!isprint(Players[1].name[i]))
-                                       Players[1].name[i] = '?';
-                       for (i = 0; Players[1].host[i]; ++i)
-                               if (!isprint(Players[1].host[i]))
-                                       Players[1].host[i] = '?';
-*/
-} //HandShake
-
-ExtFunc void CheckNetConn(void)
-{ //am I necessary?
+       } while (event.u.net.type != NP_gamedata);
 }
 
 
-ExtFunc MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event)
+static MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event)
 { //receive
        int result;
        short uid, type, size;
@@ -218,40 +172,33 @@ ExtFunc MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event)
        event->u.net.type = type;
        event->u.net.size = size - HEADER_SIZE3;
        event->u.net.data = gen->buf + HEADER_SIZE3;
-       if (type == NP_endConn) {
-               fprintf(stderr, "Close connection\n");
-               return E_lostConn;
-       }
+       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];
 
        header[0] = hton4(uid);
        header[1] = hton4(type);
        header[2] = hton4(size + HEADER_SIZE3);
-       if (MyWrite(netGen[0].fd, header, HEADER_SIZE3) != HEADER_SIZE3)
+       if (MyWrite(netGen.fd, header, HEADER_SIZE3) != HEADER_SIZE3)
                die("write (header)");
-       if (size > 0 && data && MyWrite(netGen[0].fd, data, size) != size)
+       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[0].fd >= 0) {
+       if (netGen.fd >= 0) {
                SendPacket(0, NP_endConn, 0, NULL);
-               close(netGen[0].fd);
-               netGen[0].fd = -1;
+               close(netGen.fd);
+               netGen.fd = -1;
        }
-       if (netGen[0].next)
-               RemoveEventGen(&netGen[0]);
-} //CloseNet
+       if (netGen.next)
+               RemoveEventGen(&netGen);
+}
 
-/*
- * vi: ts=4 ai
- * vim: noai si
- */