* 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);
+MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event);
+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 char netBuf[64];
-//static int netBufSize, netBufGoal = HEADER_SIZE3;
+static sigjmp_buf close_env;
-ExtFunc void make_netGen(void)
+void CatchInt(int sig)
{
- int i;
-
- for (i = 1; i <= MAX_SCREENS; i++)
- memcpy(netGen+i, &netGen[0], sizeof(EventGenRec));
-} //Make_netGen
-
+ siglongjmp(close_env, 1);
+}
-ExtFunc int InitiateConnection(char *hostStr, char *portStr)
+int InitiateConnection(char *hostStr, short port)
{ //connect to host
struct sockaddr_in addr;
struct hostent *host;
- short port;
-// make_netGen();
+ if (sigsetjmp(close_env, 1))
+ exit(0);
+ signal(SIGINT, CatchInt); //handle exit (^C)
AtExit(CloseNet);
- if (portStr)
- port = atoi(portStr); /* XXX Error checking */
- else
- port = DEFAULT_PORT;
host = gethostbyname(hostStr);
if (!host)
die("gethostbyname");
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 = 0;
+ 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(_Player) - sizeof(Players[me].host),
&Players[me]);
break;
}
- case NP_gamedata:
- {
- fprintf(stderr, ": %d\n", event.type);
+ 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 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));
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)
+MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event)
{ //receive
int result;
short uid, type, size;
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
- */