home *** CD-ROM | disk | FTP | other *** search
- Path: uunet!cs.utexas.edu!usc!sol.ctr.columbia.edu!destroyer!cs.ubc.ca!bcsystems!spruce.pfc.forestry.ca!news.u.washington.edu!raven.alaska.edu!acad2.alaska.edu!asdmf
- Newsgroups: vmsnet.sources.games
- Subject: Vmsnetrek 39/47
- Message-ID: <1992Nov20.204316.1@acad2.alaska.edu>
- From: asdmf@acad2.alaska.edu
- Date: Sat, 21 Nov 1992 00:43:16 GMT
- Sender: news@raven.alaska.edu (USENET News System)
- Organization: University of Alaska
- Nntp-Posting-Host: acad2.alaska.edu
- Lines: 414
- Xref: uunet vmsnet.sources.games:539
-
- -+-+-+-+-+-+-+-+ START OF PART 39 -+-+-+-+-+-+-+-+
- Xint handleUdpReply(), handleSequence();
- Xint exit();
- X
- Xstruct packet_handler handlers`091`093 = `123
- X `123 0, NULL `125,`009/* record 0 */
- X `123 sizeof(struct mesg_spacket), handleMessage `125, `009 /* SP_MESS
- VAGE */
- X `123 sizeof(struct plyr_info_spacket), handlePlyrInfo `125, /* SP_PLAY
- VER_INFO */
- X `123 sizeof(struct kills_spacket), handleKills `125,`009 /* SP_KILLS
- V */
- X `123 sizeof(struct player_spacket), handlePlayer `125,`009 /* SP_PLAY
- VER */
- X `123 sizeof(struct torp_info_spacket), handleTorpInfo `125, /* SP_TORP
- V_INFO */
- X `123 sizeof(struct torp_spacket), handleTorp `125, `009 /* SP_TORP */
- X `123 sizeof(struct phaser_spacket), handlePhaser `125,`009 /* SP_PHAS
- VER */
- X `123 sizeof(struct plasma_info_spacket), handlePlasmaInfo`125,/* SP_PLAS
- VMA_INFO */
- X `123 sizeof(struct plasma_spacket), handlePlasma`125,`009 /* SP_PLASM
- VA */
- X `123 sizeof(struct warning_spacket), handleWarning `125,`009 /* SP_WA
- VRNING */
- X `123 sizeof(struct motd_spacket), handleMotd `125,`009 /* SP_MOTD */
- X `123 sizeof(struct you_spacket), handleSelf `125,`009`009 /* SP_YOU *
- V/
- X `123 sizeof(struct queue_spacket), handleQueue `125,`009 /* SP_QUEUE
- V */
- X `123 sizeof(struct status_spacket), handleStatus `125,`009 /* SP_STAT
- VUS */
- X `123 sizeof(struct planet_spacket), handlePlanet `125, `009 /* SP_PLA
- VNET */
- X `123 sizeof(struct pickok_spacket), handlePickok `125,`009 /* SP_PICK
- VOK */
- X `123 sizeof(struct login_spacket), handleLogin `125, `009 /* SP_LOGIN
- V */
- X `123 sizeof(struct flags_spacket), handleFlags `125,`009 /* SP_FLAGS
- V */
- X `123 sizeof(struct mask_spacket), handleMask `125,`009 /* SP_MASK */
- X `123 sizeof(struct pstatus_spacket), handlePStatus `125,`009 /* SP_PS
- VTATUS */
- X `123 sizeof(struct badversion_spacket), handleBadVersion `125,/* SP_BADV
- VERSION */
- X `123 sizeof(struct hostile_spacket), handleHostile `125, /* SP_HOST
- VILE */
- X `123 sizeof(struct stats_spacket), handleStats `125,`009 /* SP_STATS
- V */
- X `123 sizeof(struct plyr_login_spacket), handlePlyrLogin `125, /* SP_PL_L
- VOGIN */
- X `123 sizeof(struct reserved_spacket), handleReserved `125, /* SP_RESE
- VRVED */
- X `123 sizeof(struct planet_loc_spacket), handlePlanetLoc `125, /* SP_PLAN
- VET_LOC */
- X#ifdef INCLUDE_SCAN
- X `123 sizeof(struct scan_spacket), handleScan `125,`009 /* SP_SCAN (AT
- VM) */
- X#else
- X `123 0, exit `125,`009`009/* note exit won't be called */
- X#endif
- X `123 sizeof(struct udp_reply_spacket), handleUdpReply `125, /* SP_UDP_
- VSTAT */
- X `123 sizeof(struct sequence_spacket), handleSequence `125, /* SP_SEQU
- VENCE */
- X `123 sizeof(struct sc_sequence_spacket), handleSequence `125 /* SP_SC_S
- VEQUENCE */
- X`125;
- X
- Xint sizes`091`093 = `123
- X 0,`009/* record 0 */
- X sizeof(struct mesg_cpacket), `009`009/* CP_MESSAGE */
- X sizeof(struct speed_cpacket),`009`009/* CP_SPEED */
- X sizeof(struct dir_cpacket),`009`009`009/* CP_DIRECTION */
- X sizeof(struct phaser_cpacket),`009`009/* CP_PHASER */
- X sizeof(struct plasma_cpacket),`009`009/* CP_PLASMA */
- X sizeof(struct torp_cpacket),`009`009/* CP_TORP */
- X sizeof(struct quit_cpacket), `009`009/* CP_QUIT */
- X sizeof(struct login_cpacket),`009`009/* CP_LOGIN */
- X sizeof(struct outfit_cpacket),`009`009/* CP_OUTFIT */
- X sizeof(struct war_cpacket),`009`009`009/* CP_WAR */
- X sizeof(struct practr_cpacket),`009`009/* CP_PRACTR */
- X sizeof(struct shield_cpacket),`009`009/* CP_SHIELD */
- X sizeof(struct repair_cpacket),`009`009/* CP_REPAIR */
- X sizeof(struct orbit_cpacket),`009`009/* CP_ORBIT */
- X sizeof(struct planlock_cpacket),`009`009/* CP_PLANLOCK */
- X sizeof(struct playlock_cpacket),`009`009/* CP_PLAYLOCK */
- X sizeof(struct bomb_cpacket),`009`009/* CP_BOMB */
- X sizeof(struct beam_cpacket),`009`009/* CP_BEAM */
- X sizeof(struct cloak_cpacket),`009`009/* CP_CLOAK */
- X sizeof(struct det_torps_cpacket),`009`009/* CP_DET_TORPS */
- X sizeof(struct det_mytorp_cpacket),`009`009/* CP_DET_MYTORP */
- X sizeof(struct copilot_cpacket),`009`009/* CP_COPILOT */
- X sizeof(struct refit_cpacket),`009`009/* CP_REFIT */
- X sizeof(struct tractor_cpacket),`009`009/* CP_TRACTOR */
- X sizeof(struct repress_cpacket),`009`009/* CP_REPRESS */
- X sizeof(struct coup_cpacket),`009`009/* CP_COUP */
- X sizeof(struct socket_cpacket),`009`009/* CP_SOCKET */
- X sizeof(struct options_cpacket),`009`009/* CP_OPTIONS */
- X sizeof(struct bye_cpacket),`009`009`009/* CP_BYE */
- X sizeof(struct dockperm_cpacket),`009`009/* CP_DOCKPERM */
- X sizeof(struct updates_cpacket),`009`009/* CP_UPDATES */
- X sizeof(struct resetstats_cpacket),`009`009/* CP_RESETSTATS */
- X sizeof(struct reserved_cpacket),`009`009/* CP_RESERVED */
- X#ifdef INCLUDE_SCAN
- X sizeof(struct scan_cpacket),`009`009/* CP_SCAN (ATM) */
- X#else
- X 0,
- X#endif
- X sizeof(struct udp_req_cpacket),`009`009/* CP_UDP_REQ */
- X sizeof(struct sequence_cpacket)`009`009/* CP_SEQUENCE */
- X`125;
- X
- X#define NUM_PACKETS (sizeof(handlers) / sizeof(handlers`0910`093) - 1)
- X#define NUM_SIZES (sizeof(sizes) / sizeof(sizes`0910`093) - 1)
- X
- Xint serverDead=0;
- X
- Xstatic int udpLocalPort = 0;
- Xstatic int udpServerPort = 0;
- Xstatic long serveraddr = 0;
- Xstatic long sequence;
- Xstatic int drop_flag = 0;
- Xstatic int chan = -1;`009`009/* tells sequence checker where packet is from*
- V/
- Xstatic short fSpeed, fDirection, fShield, fOrbit, fRepair, fBeamup, fBeamdow
- Vn,
- X`009fCloak, fBomb, fDockperm, fPhaser, fPlasma, fPlayLock, fPlanLock,
- X`009fTractor, fRepress;
- X
- X/* reset all the "force command" variables */
- XresetForce()
- X`123
- X fSpeed = fDirection = fShield = fOrbit = fRepair = fBeamup = fBeamdown =
- X fCloak = fBomb = fDockperm = fPhaser = fPlasma = fPlayLock = fPlanLock =
- X fTractor = fRepress = -1;
- X`125
- X
- X/*
- X * If something we want to happen hasn't yet, send it again.
- X *
- X * The low byte is the request, the high byte is a max count. When the max
- X * count reaches zero, the client stops trying. Checking is done with a
- X * macro for speed & clarity.
- X */
- X#define FCHECK_FLAGS(flag, force, const) `123`009`009`009\
- X`009if (force > 0) `123`009`009`009`009`009\
- X`009 if (((me->p_flags & flag) && 1) `094 ((force & 0xff) && 1)) `123`009
- V\
- X`009`009speedReq.type = const;`009`009`009`009\
- X`009`009speedReq.speed = (force & 0xff);`009`009\
- X`009`009sendServerPacket(&speedReq);`009`009`009\
- X`009`009V_UDPDIAG(("Forced %d:%d\n", const, force & 0xff));`009\
- X`009`009force -= 0x100;`009`009`009`009`009\
- X`009`009if (force < 0x100) force = -1;`009/* give up */`009\
- X`009 `125 else`009`009`009`009`009`009\
- X`009`009force = -1;`009`009`009`009`009\
- X`009`125`009`009`009`009`009`009`009\
- X`125
- X#define FCHECK_VAL(value, force, const) `123`009`009`009\
- X`009if (force > 0) `123`009`009`009`009`009\
- X`009 if ((value) != (force & 0xff)) `123`009`009`009\
- X`009`009speedReq.type = const;`009`009`009`009\
- X`009`009speedReq.speed = (force & 0xff);`009`009\
- X`009`009sendServerPacket(&speedReq);`009`009`009\
- X`009`009V_UDPDIAG(("Forced %d:%d\n", const, force & 0xff));`009\
- X`009`009force -= 0x100;`009`009`009`009`009\
- X`009`009if (force < 0x100) force = -1;`009/* give up */`009\
- X`009 `125 else`009`009`009`009`009`009\
- X`009`009force = -1;`009`009`009`009`009\
- X`009`125`009`009`009`009`009`009`009\
- X`125
- X#define FCHECK_TRACT(flag, force, const) `123`009`009`009\
- X`009if (force > 0) `123`009`009`009`009`009\
- X`009 if (((me->p_flags & flag) && 1) `094 ((force & 0xff) && 1)) `123`009
- V\
- X`009`009tractorReq.type = const;`009`009`009\
- X`009`009tractorReq.state = ((force & 0xff) >= 0x40);`009\
- X`009`009tractorReq.pnum = (force & 0xff) & (`1260x40);`009\
- X`009`009sendServerPacket(&tractorReq);`009`009`009\
- X`009`009V_UDPDIAG(("Forced %d:%d/%d\n", const,`009`009\
- X`009`009`009tractorReq.state, tractorReq.pnum));`009\
- X`009`009force -= 0x100;`009`009`009`009`009\
- X`009`009if (force < 0x100) force = -1;`009/* give up */`009\
- X`009 `125 else`009`009`009`009`009`009\
- X`009`009force = -1;`009`009`009`009`009\
- X`009`125`009`009`009`009`009`009`009\
- X`125
- X
- XcheckForce()
- X`123
- X struct speed_cpacket speedReq;
- X struct tractor_cpacket tractorReq;
- X
- X FCHECK_VAL(me->p_speed, fSpeed, CP_SPEED);`009/* almost always repeats *
- V/
- X FCHECK_VAL(me->p_dir, fDirection, CP_DIRECTION);`009/* (ditto) */
- X FCHECK_FLAGS(PFSHIELD, fShield, CP_SHIELD);
- X FCHECK_FLAGS(PFORBIT, fOrbit, CP_ORBIT);
- X FCHECK_FLAGS(PFREPAIR, fRepair, CP_REPAIR);
- X FCHECK_FLAGS(PFBEAMUP, fBeamup, CP_BEAM);
- X FCHECK_FLAGS(PFBEAMDOWN, fBeamdown, CP_BEAM);
- X FCHECK_FLAGS(PFCLOAK, fCloak, CP_CLOAK);
- X FCHECK_FLAGS(PFBOMB, fBomb, CP_BOMB);
- X FCHECK_FLAGS(PFDOCKOK, fDockperm, CP_DOCKPERM);
- X FCHECK_VAL(phasers`091me->p_no`093.ph_status, fPhaser, CP_PHASER);/* bug
- V: dir 0 */
- X FCHECK_VAL(plasmatorps`091me->p_no`093.pt_status, fPlasma, CP_PLASMA); /
- V*(ditto)*/
- X FCHECK_FLAGS(PFPLOCK, fPlayLock, CP_PLAYLOCK);
- X FCHECK_FLAGS(PFPLLOCK, fPlanLock, CP_PLANLOCK);
- X
- X FCHECK_TRACT(PFTRACT, fTractor, CP_TRACTOR);
- X FCHECK_TRACT(PFPRESS, fRepress, CP_REPRESS);
- X`125
- X connectToServer(port)
- Xint port;
- X`123
- X int s;
- X struct sockaddr_in addr;
- X struct sockaddr_in naddr;
- X int len;
- X/* int readfds;*/
- X fd_set readfds;
- X struct timeval timeout;
- X struct hostent *hp;
- X
- X serverDead=0;
- X if (sock!=-1) `123
- X`009shutdown(sock, 2);
- X`009sock= -1;
- X `125
- X sleep(3);`009`009/* I think this is necessary for some unknown reason */
- X
- X printf("Waiting for connection (port %d).\n", port);
- X
- X if ((s=socket(AF_INET, SOCK_STREAM, 0)) < 0) `123
- X`009printf("I can't create a socket\n");
- X`009exit(2);
- X `125
- X
- X addr.sin_family = AF_INET;
- X addr.sin_addr.s_addr = INADDR_ANY;
- X addr.sin_port = htons(port);
- X
- X if (bind(s, &addr, sizeof(addr)) < 0) `123
- X`009sleep(10);
- X`009if (bind(s, &addr, sizeof(addr)) < 0) `123
- X`009 sleep(10);
- X`009 if (bind(s, &addr, sizeof(addr)) < 0) `123
- X`009`009printf("I can't bind to port!\n");
- X`009`009exit(3);
- X`009 `125
- X`009`125
- X `125
- X
- X listen(s,1);
- X
- X len=sizeof(naddr);
- X
- Xtryagain:
- X timeout.tv_sec=240;`009/* four minutes */
- X timeout.tv_usec=0;
- X/* readfds=(1<<s);*/
- X FD_ZERO(&readfds);
- X FD_SET(s, &readfds);
- X if (select(32, &readfds, NULL, NULL, &timeout) == 0) `123
- X`009printf("Well, I think the server died!\n");
- X`009exit(0);
- X `125
- X
- X sock=accept(s,&naddr,&len);
- X
- X if (sock==-1) `123
- X`009extern int errno;
- X`009printf("Augh! Bad accept: %d\n", errno);
- X`009goto tryagain;
- X `125
- X
- X/* printf("Got connection.\n");*/
- X
- X close(s);
- X pickSocket(port);`009/* new socket != port */
- X
- X /*
- X * This isn't strictly necessary; it tries to determine who the
- X * caller is, and set "serverName" and "serveraddr" appropriately.
- X */
- X len = sizeof(struct sockaddr_in);
- X if (getpeername(sock, (struct sockaddr *) &addr, &len) < 0) `123
- X`009perror("unable to get peername");
- X`009serverName = "nowhere";
- X `125 else `123
- X`009serveraddr = addr.sin_addr.s_addr;
- X`009hp = gethostbyaddr((char *)&addr.sin_addr.s_addr, sizeof(long),AF_INET);
- X`009if (hp != NULL) `123
- X`009 serverName = (char *) malloc(strlen(hp->h_name)+1);
- X`009 strcpy(serverName, hp->h_name);
- X`009`125 else `123
- X`009 serverName = (char *) malloc(strlen(inet_ntoa(addr.sin_addr))+1);
- X`009 strcpy(serverName, inet_ntoa(addr.sin_addr));
- X`009`125
- X `125
- X printf("Got connection from server %s (0x%x)\n", serverName, serveraddr)
- V;
- X`125
- X
- XcallServer(port, server)
- Xint port;
- Xchar *server;
- X`123
- X int s;
- X struct sockaddr_in addr;
- X struct hostent *hp;
- X
- X serverDead=0;
- X
- X printf("Calling %s on port %d.\n", server, port);
- X
- X if ((s=socket(AF_INET, SOCK_STREAM, 0)) < 0) `123
- X`009printf("I can't create a socket\n");
- X`009exit(0);
- X `125
- X
- X addr.sin_family = AF_INET;
- X addr.sin_port = htons(port);
- X `032
- X if ((addr.sin_addr.s_addr = inet_addr(server)) == -1) `123
- X`009if ((hp = gethostbyname(server)) == NULL) `123
- X`009 printf("Who is %s?\n", server);
- X`009 exit(0);
- X`009`125 else `123
- X`009 addr.sin_addr.s_addr = *(long *) hp->h_addr;
- X`009`125
- X `125
- X serveraddr = addr.sin_addr.s_addr;
- X
- X if (connect(s, &addr, sizeof(addr)) < 0) `123
- X`009printf("Server not listening!\n");
- X`009printf("(you may need to run 'xstartd')\n");
- X`009exit(0);
- X `125
- X
- X printf("Got connection. \n");
- X
- X sock=s;
- X pickSocket(port);`009/* new socket != port */
- X`125
- X
- XisServerDead()
- X`123
- X return(serverDead);
- X`125
- X
- XsocketPause()
- X`123
- X struct timeval timeout;
- X/* int readfds;*/
- X fd_set readfds;
- X
- X timeout.tv_sec=1;
- X timeout.tv_usec=0;
- X/* readfds = 1<<sock;*/
- X FD_ZERO(&readfds);
- X FD_SET(sock, &readfds);
- X select(32,&readfds,0,0,&timeout);
- X`125
- X
- XreadFromServer()
- X`123
- X struct timeval timeout;
- X fd_set readfds;
- X int retval = 0;
- X
- X if (serverDead) return(0);
- X if (commMode == COMM_TCP) drop_flag=0;`009/* just in case */
- X timeout.tv_sec=1;
- X timeout.tv_usec=0;
- X/* readfds = 1<<sock;*/
- X FD_ZERO(&readfds);
- X FD_SET(sock, &readfds);
- X if (udpSock >= 0)
- X`009FD_SET(udpSock, &readfds);
- X/* readfds = 1<<sock; */
- X/* printf("1) readfds ar/*%x\n", readfds */
- X `009FD_ISSET(sock,`009`009&readfds);
- X if (select(32,&readfds,0,0,&timeout) != 0) `123
- X`009/* Read info from the xtrek server */
- X`009if (FD_ISSET(sock, &readfds)) `123
- X`009 chan = sock;
- X`009 retval += doRead(sock);
- X `125
- X`009if (udpSock >= 0 && FD_ISSET(udpSock, &readfds)) `123
- X`009 V_UDPDIAG(("Activity on UDP socket\n"));
- X`009 chan = udpSock;
- X`009 if (commStatus == STAT_VERIFY_UDP) `123
- X`009`009warning("UDP connection established");
- X`009`009sequence = 0;`009`009/* reset sequence #s */
- X`009`009resetForce();
- X`009`009commMode = COMM_UDP;
- X`009`009commStatus = STAT_CONNECTED;
- X`009`009commSwitchTimeout = 0;
- X`009`009if (udpClientRecv != MODE_SIMPLE)
- X`009`009 sendUdpReq(COMM_MODE + udpClientRecv);
- X`009`009if (udpWin) `123
- X`009`009 udprefresh(UDP_CURRENT);
- X`009`009 udprefresh(UDP_STATUS);
- X`009`009`125
- X`009 `125
- X`009 retval += doRead(udpSock);
- X`009`125
- X `125
- X
- +-+-+-+-+-+-+-+- END OF PART 39 +-+-+-+-+-+-+-+-
-