home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / vmsnet / vmstrek / part39 < prev    next >
Encoding:
Internet Message Format  |  1992-11-20  |  14.6 KB

  1. 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
  2. Newsgroups: vmsnet.sources.games
  3. Subject: Vmsnetrek 39/47
  4. Message-ID: <1992Nov20.204316.1@acad2.alaska.edu>
  5. From: asdmf@acad2.alaska.edu
  6. Date: Sat, 21 Nov 1992 00:43:16 GMT
  7. Sender: news@raven.alaska.edu (USENET News System)
  8. Organization: University of Alaska
  9. Nntp-Posting-Host: acad2.alaska.edu
  10. Lines: 414
  11. Xref: uunet vmsnet.sources.games:539
  12.  
  13. -+-+-+-+-+-+-+-+ START OF PART 39 -+-+-+-+-+-+-+-+
  14. Xint handleUdpReply(), handleSequence();
  15. Xint exit();
  16. X
  17. Xstruct packet_handler handlers`091`093 = `123
  18. X    `123 0, NULL `125,`009/* record 0 */
  19. X    `123 sizeof(struct mesg_spacket), handleMessage `125, `009    /* SP_MESS
  20. VAGE */
  21. X    `123 sizeof(struct plyr_info_spacket), handlePlyrInfo `125,   /* SP_PLAY
  22. VER_INFO */
  23. X    `123 sizeof(struct kills_spacket), handleKills `125,`009    /* SP_KILLS
  24. V */
  25. X    `123 sizeof(struct player_spacket), handlePlayer `125,`009    /* SP_PLAY
  26. VER */
  27. X    `123 sizeof(struct torp_info_spacket), handleTorpInfo `125,   /* SP_TORP
  28. V_INFO */
  29. X    `123 sizeof(struct torp_spacket), handleTorp `125, `009    /* SP_TORP */
  30. X    `123 sizeof(struct phaser_spacket), handlePhaser `125,`009    /* SP_PHAS
  31. VER */
  32. X    `123 sizeof(struct plasma_info_spacket), handlePlasmaInfo`125,/* SP_PLAS
  33. VMA_INFO */
  34. X    `123 sizeof(struct plasma_spacket), handlePlasma`125,`009    /* SP_PLASM
  35. VA */
  36. X    `123 sizeof(struct warning_spacket), handleWarning `125,`009    /* SP_WA
  37. VRNING */
  38. X    `123 sizeof(struct motd_spacket), handleMotd `125,`009    /* SP_MOTD */
  39. X    `123 sizeof(struct you_spacket), handleSelf `125,`009`009    /* SP_YOU *
  40. V/
  41. X    `123 sizeof(struct queue_spacket), handleQueue `125,`009    /* SP_QUEUE
  42. V */
  43. X    `123 sizeof(struct status_spacket), handleStatus `125,`009    /* SP_STAT
  44. VUS */
  45. X    `123 sizeof(struct planet_spacket), handlePlanet `125, `009    /* SP_PLA
  46. VNET */
  47. X    `123 sizeof(struct pickok_spacket), handlePickok `125,`009    /* SP_PICK
  48. VOK */
  49. X    `123 sizeof(struct login_spacket), handleLogin `125, `009    /* SP_LOGIN
  50. V */
  51. X    `123 sizeof(struct flags_spacket), handleFlags `125,`009    /* SP_FLAGS
  52. V */
  53. X    `123 sizeof(struct mask_spacket), handleMask `125,`009    /* SP_MASK */
  54. X    `123 sizeof(struct pstatus_spacket), handlePStatus `125,`009    /* SP_PS
  55. VTATUS */
  56. X    `123 sizeof(struct badversion_spacket), handleBadVersion `125,/* SP_BADV
  57. VERSION */
  58. X    `123 sizeof(struct hostile_spacket), handleHostile `125,      /* SP_HOST
  59. VILE */
  60. X    `123 sizeof(struct stats_spacket), handleStats `125,`009    /* SP_STATS
  61. V */
  62. X    `123 sizeof(struct plyr_login_spacket), handlePlyrLogin `125, /* SP_PL_L
  63. VOGIN */
  64. X    `123 sizeof(struct reserved_spacket), handleReserved `125,    /* SP_RESE
  65. VRVED */
  66. X    `123 sizeof(struct planet_loc_spacket), handlePlanetLoc `125, /* SP_PLAN
  67. VET_LOC */
  68. X#ifdef INCLUDE_SCAN
  69. X    `123 sizeof(struct scan_spacket), handleScan `125,`009    /* SP_SCAN (AT
  70. VM) */
  71. X#else
  72. X    `123 0, exit `125,`009`009/* note exit won't be called */
  73. X#endif
  74. X    `123 sizeof(struct udp_reply_spacket), handleUdpReply `125,   /* SP_UDP_
  75. VSTAT */
  76. X    `123 sizeof(struct sequence_spacket), handleSequence `125,    /* SP_SEQU
  77. VENCE */
  78. X    `123 sizeof(struct sc_sequence_spacket), handleSequence `125  /* SP_SC_S
  79. VEQUENCE */
  80. X`125;
  81. X
  82. Xint sizes`091`093 = `123
  83. X    0,`009/* record 0 */
  84. X    sizeof(struct mesg_cpacket), `009`009/* CP_MESSAGE */
  85. X    sizeof(struct speed_cpacket),`009`009/* CP_SPEED */
  86. X    sizeof(struct dir_cpacket),`009`009`009/* CP_DIRECTION */
  87. X    sizeof(struct phaser_cpacket),`009`009/* CP_PHASER */
  88. X    sizeof(struct plasma_cpacket),`009`009/* CP_PLASMA */
  89. X    sizeof(struct torp_cpacket),`009`009/* CP_TORP */
  90. X    sizeof(struct quit_cpacket), `009`009/* CP_QUIT */
  91. X    sizeof(struct login_cpacket),`009`009/* CP_LOGIN */
  92. X    sizeof(struct outfit_cpacket),`009`009/* CP_OUTFIT */
  93. X    sizeof(struct war_cpacket),`009`009`009/* CP_WAR */
  94. X    sizeof(struct practr_cpacket),`009`009/* CP_PRACTR */
  95. X    sizeof(struct shield_cpacket),`009`009/* CP_SHIELD */
  96. X    sizeof(struct repair_cpacket),`009`009/* CP_REPAIR */
  97. X    sizeof(struct orbit_cpacket),`009`009/* CP_ORBIT */
  98. X    sizeof(struct planlock_cpacket),`009`009/* CP_PLANLOCK */
  99. X    sizeof(struct playlock_cpacket),`009`009/* CP_PLAYLOCK */
  100. X    sizeof(struct bomb_cpacket),`009`009/* CP_BOMB */
  101. X    sizeof(struct beam_cpacket),`009`009/* CP_BEAM */
  102. X    sizeof(struct cloak_cpacket),`009`009/* CP_CLOAK */
  103. X    sizeof(struct det_torps_cpacket),`009`009/* CP_DET_TORPS */
  104. X    sizeof(struct det_mytorp_cpacket),`009`009/* CP_DET_MYTORP */
  105. X    sizeof(struct copilot_cpacket),`009`009/* CP_COPILOT */
  106. X    sizeof(struct refit_cpacket),`009`009/* CP_REFIT */
  107. X    sizeof(struct tractor_cpacket),`009`009/* CP_TRACTOR */
  108. X    sizeof(struct repress_cpacket),`009`009/* CP_REPRESS */
  109. X    sizeof(struct coup_cpacket),`009`009/* CP_COUP */
  110. X    sizeof(struct socket_cpacket),`009`009/* CP_SOCKET */
  111. X    sizeof(struct options_cpacket),`009`009/* CP_OPTIONS */
  112. X    sizeof(struct bye_cpacket),`009`009`009/* CP_BYE */
  113. X    sizeof(struct dockperm_cpacket),`009`009/* CP_DOCKPERM */
  114. X    sizeof(struct updates_cpacket),`009`009/* CP_UPDATES */
  115. X    sizeof(struct resetstats_cpacket),`009`009/* CP_RESETSTATS */
  116. X    sizeof(struct reserved_cpacket),`009`009/* CP_RESERVED */
  117. X#ifdef INCLUDE_SCAN
  118. X    sizeof(struct scan_cpacket),`009`009/* CP_SCAN (ATM) */
  119. X#else
  120. X    0,
  121. X#endif
  122. X    sizeof(struct udp_req_cpacket),`009`009/* CP_UDP_REQ */
  123. X    sizeof(struct sequence_cpacket)`009`009/* CP_SEQUENCE */
  124. X`125;
  125. X
  126. X#define NUM_PACKETS (sizeof(handlers) / sizeof(handlers`0910`093) - 1)
  127. X#define NUM_SIZES (sizeof(sizes) / sizeof(sizes`0910`093) - 1)
  128. X
  129. Xint serverDead=0;
  130. X
  131. Xstatic int udpLocalPort = 0;
  132. Xstatic int udpServerPort = 0;
  133. Xstatic long serveraddr = 0;
  134. Xstatic long sequence;
  135. Xstatic int drop_flag = 0;
  136. Xstatic int chan = -1;`009`009/* tells sequence checker where packet is from*
  137. V/
  138. Xstatic short fSpeed, fDirection, fShield, fOrbit, fRepair, fBeamup, fBeamdow
  139. Vn,
  140. X`009fCloak, fBomb, fDockperm, fPhaser, fPlasma, fPlayLock, fPlanLock,
  141. X`009fTractor, fRepress;
  142. X
  143. X/* reset all the "force command" variables */
  144. XresetForce()
  145. X`123
  146. X    fSpeed = fDirection = fShield = fOrbit = fRepair = fBeamup = fBeamdown =
  147. X    fCloak = fBomb = fDockperm = fPhaser = fPlasma = fPlayLock = fPlanLock =
  148. X    fTractor = fRepress = -1;
  149. X`125
  150. X
  151. X/*
  152. X * If something we want to happen hasn't yet, send it again.
  153. X *
  154. X * The low byte is the request, the high byte is a max count.  When the max
  155. X * count reaches zero, the client stops trying.  Checking is done with a
  156. X * macro for speed & clarity.
  157. X */
  158. X#define FCHECK_FLAGS(flag, force, const) `123`009`009`009\
  159. X`009if (force > 0) `123`009`009`009`009`009\
  160. X`009    if (((me->p_flags & flag) && 1) `094 ((force & 0xff) && 1)) `123`009
  161. V\
  162. X`009`009speedReq.type = const;`009`009`009`009\
  163. X`009`009speedReq.speed = (force & 0xff);`009`009\
  164. X`009`009sendServerPacket(&speedReq);`009`009`009\
  165. X`009`009V_UDPDIAG(("Forced %d:%d\n", const, force & 0xff));`009\
  166. X`009`009force -= 0x100;`009`009`009`009`009\
  167. X`009`009if (force < 0x100) force = -1;`009/* give up */`009\
  168. X`009    `125 else`009`009`009`009`009`009\
  169. X`009`009force = -1;`009`009`009`009`009\
  170. X`009`125`009`009`009`009`009`009`009\
  171. X`125
  172. X#define FCHECK_VAL(value, force, const) `123`009`009`009\
  173. X`009if (force > 0) `123`009`009`009`009`009\
  174. X`009    if ((value) != (force & 0xff)) `123`009`009`009\
  175. X`009`009speedReq.type = const;`009`009`009`009\
  176. X`009`009speedReq.speed = (force & 0xff);`009`009\
  177. X`009`009sendServerPacket(&speedReq);`009`009`009\
  178. X`009`009V_UDPDIAG(("Forced %d:%d\n", const, force & 0xff));`009\
  179. X`009`009force -= 0x100;`009`009`009`009`009\
  180. X`009`009if (force < 0x100) force = -1;`009/* give up */`009\
  181. X`009    `125 else`009`009`009`009`009`009\
  182. X`009`009force = -1;`009`009`009`009`009\
  183. X`009`125`009`009`009`009`009`009`009\
  184. X`125
  185. X#define FCHECK_TRACT(flag, force, const) `123`009`009`009\
  186. X`009if (force > 0) `123`009`009`009`009`009\
  187. X`009    if (((me->p_flags & flag) && 1) `094 ((force & 0xff) && 1)) `123`009
  188. V\
  189. X`009`009tractorReq.type = const;`009`009`009\
  190. X`009`009tractorReq.state = ((force & 0xff) >= 0x40);`009\
  191. X`009`009tractorReq.pnum = (force & 0xff) & (`1260x40);`009\
  192. X`009`009sendServerPacket(&tractorReq);`009`009`009\
  193. X`009`009V_UDPDIAG(("Forced %d:%d/%d\n", const,`009`009\
  194. X`009`009`009tractorReq.state, tractorReq.pnum));`009\
  195. X`009`009force -= 0x100;`009`009`009`009`009\
  196. X`009`009if (force < 0x100) force = -1;`009/* give up */`009\
  197. X`009    `125 else`009`009`009`009`009`009\
  198. X`009`009force = -1;`009`009`009`009`009\
  199. X`009`125`009`009`009`009`009`009`009\
  200. X`125
  201. X
  202. XcheckForce()
  203. X`123
  204. X    struct speed_cpacket speedReq;
  205. X    struct tractor_cpacket tractorReq;
  206. X
  207. X    FCHECK_VAL(me->p_speed, fSpeed, CP_SPEED);`009/* almost always repeats *
  208. V/
  209. X    FCHECK_VAL(me->p_dir, fDirection, CP_DIRECTION);`009/* (ditto) */
  210. X    FCHECK_FLAGS(PFSHIELD, fShield, CP_SHIELD);
  211. X    FCHECK_FLAGS(PFORBIT, fOrbit, CP_ORBIT);
  212. X    FCHECK_FLAGS(PFREPAIR, fRepair, CP_REPAIR);
  213. X    FCHECK_FLAGS(PFBEAMUP, fBeamup, CP_BEAM);
  214. X    FCHECK_FLAGS(PFBEAMDOWN, fBeamdown, CP_BEAM);
  215. X    FCHECK_FLAGS(PFCLOAK, fCloak, CP_CLOAK);
  216. X    FCHECK_FLAGS(PFBOMB, fBomb, CP_BOMB);
  217. X    FCHECK_FLAGS(PFDOCKOK, fDockperm, CP_DOCKPERM);
  218. X    FCHECK_VAL(phasers`091me->p_no`093.ph_status, fPhaser, CP_PHASER);/* bug
  219. V: dir 0 */
  220. X    FCHECK_VAL(plasmatorps`091me->p_no`093.pt_status, fPlasma, CP_PLASMA); /
  221. V*(ditto)*/
  222. X    FCHECK_FLAGS(PFPLOCK, fPlayLock, CP_PLAYLOCK);
  223. X    FCHECK_FLAGS(PFPLLOCK, fPlanLock, CP_PLANLOCK);
  224. X
  225. X    FCHECK_TRACT(PFTRACT, fTractor, CP_TRACTOR);
  226. X    FCHECK_TRACT(PFPRESS, fRepress, CP_REPRESS);
  227. X`125
  228. X connectToServer(port)
  229. Xint port;
  230. X`123
  231. X    int s;
  232. X    struct sockaddr_in addr;
  233. X    struct sockaddr_in naddr;
  234. X    int len;
  235. X/*    int readfds;*/
  236. X    fd_set readfds;
  237. X    struct timeval timeout;
  238. X    struct hostent *hp;
  239. X
  240. X    serverDead=0;
  241. X    if (sock!=-1) `123
  242. X`009shutdown(sock, 2);
  243. X`009sock= -1;
  244. X    `125
  245. X    sleep(3);`009`009/* I think this is necessary for some unknown reason */
  246. X
  247. X    printf("Waiting for connection (port %d).\n", port);
  248. X
  249. X    if ((s=socket(AF_INET, SOCK_STREAM, 0)) < 0) `123
  250. X`009printf("I can't create a socket\n");
  251. X`009exit(2);
  252. X    `125
  253. X
  254. X    addr.sin_family = AF_INET;
  255. X    addr.sin_addr.s_addr = INADDR_ANY;
  256. X    addr.sin_port = htons(port);
  257. X
  258. X    if (bind(s, &addr, sizeof(addr)) < 0) `123
  259. X`009sleep(10);
  260. X`009if (bind(s, &addr, sizeof(addr)) < 0) `123
  261. X`009    sleep(10);
  262. X`009    if (bind(s, &addr, sizeof(addr)) < 0) `123
  263. X`009`009printf("I can't bind to port!\n");
  264. X`009`009exit(3);
  265. X`009    `125
  266. X`009`125
  267. X    `125
  268. X
  269. X    listen(s,1);
  270. X
  271. X    len=sizeof(naddr);
  272. X
  273. Xtryagain:
  274. X    timeout.tv_sec=240;`009/* four minutes */
  275. X    timeout.tv_usec=0;
  276. X/*    readfds=(1<<s);*/
  277. X    FD_ZERO(&readfds);
  278. X    FD_SET(s, &readfds);
  279. X    if (select(32, &readfds, NULL, NULL, &timeout) == 0) `123
  280. X`009printf("Well, I think the server died!\n");
  281. X`009exit(0);
  282. X    `125
  283. X
  284. X    sock=accept(s,&naddr,&len);
  285. X
  286. X    if (sock==-1) `123
  287. X`009extern int errno;
  288. X`009printf("Augh!  Bad accept: %d\n", errno);
  289. X`009goto tryagain;
  290. X    `125
  291. X
  292. X/*    printf("Got connection.\n");*/
  293. X
  294. X    close(s);
  295. X    pickSocket(port);`009/* new socket != port */
  296. X
  297. X    /*
  298. X     * This isn't strictly necessary; it tries to determine who the
  299. X     * caller is, and set "serverName" and "serveraddr" appropriately.
  300. X     */
  301. X    len = sizeof(struct sockaddr_in);
  302. X    if (getpeername(sock, (struct sockaddr *) &addr, &len) < 0) `123
  303. X`009perror("unable to get peername");
  304. X`009serverName = "nowhere";
  305. X    `125 else `123
  306. X`009serveraddr = addr.sin_addr.s_addr;
  307. X`009hp = gethostbyaddr((char *)&addr.sin_addr.s_addr, sizeof(long),AF_INET);
  308. X`009if (hp != NULL) `123
  309. X`009    serverName = (char *) malloc(strlen(hp->h_name)+1);
  310. X`009    strcpy(serverName, hp->h_name);
  311. X`009`125 else `123
  312. X`009    serverName = (char *) malloc(strlen(inet_ntoa(addr.sin_addr))+1);
  313. X`009    strcpy(serverName, inet_ntoa(addr.sin_addr));
  314. X`009`125
  315. X    `125
  316. X    printf("Got connection from server %s (0x%x)\n", serverName, serveraddr)
  317. V;
  318. X`125
  319. X
  320. XcallServer(port, server)
  321. Xint port;
  322. Xchar *server;
  323. X`123
  324. X    int s;
  325. X    struct sockaddr_in addr;
  326. X    struct hostent *hp;
  327. X
  328. X    serverDead=0;
  329. X
  330. X    printf("Calling %s on port %d.\n", server, port);
  331. X
  332. X    if ((s=socket(AF_INET, SOCK_STREAM, 0)) < 0) `123
  333. X`009printf("I can't create a socket\n");
  334. X`009exit(0);
  335. X    `125
  336. X
  337. X    addr.sin_family = AF_INET;
  338. X    addr.sin_port = htons(port);
  339. X   `032
  340. X    if ((addr.sin_addr.s_addr = inet_addr(server)) == -1) `123
  341. X`009if ((hp = gethostbyname(server)) == NULL) `123
  342. X`009    printf("Who is %s?\n", server);
  343. X`009    exit(0);
  344. X`009`125 else `123
  345. X`009    addr.sin_addr.s_addr = *(long *) hp->h_addr;
  346. X`009`125
  347. X    `125
  348. X    serveraddr = addr.sin_addr.s_addr;
  349. X
  350. X    if (connect(s, &addr, sizeof(addr)) < 0) `123
  351. X`009printf("Server not listening!\n");
  352. X`009printf("(you may need to run 'xstartd')\n");
  353. X`009exit(0);
  354. X    `125
  355. X
  356. X    printf("Got connection. \n");
  357. X
  358. X    sock=s;
  359. X    pickSocket(port);`009/* new socket != port */
  360. X`125
  361. X
  362. XisServerDead()
  363. X`123
  364. X    return(serverDead);
  365. X`125
  366. X
  367. XsocketPause()
  368. X`123
  369. X    struct timeval timeout;
  370. X/*    int readfds;*/
  371. X    fd_set readfds;
  372. X
  373. X    timeout.tv_sec=1;
  374. X    timeout.tv_usec=0;
  375. X/*    readfds = 1<<sock;*/
  376. X    FD_ZERO(&readfds);
  377. X    FD_SET(sock, &readfds);
  378. X    select(32,&readfds,0,0,&timeout);
  379. X`125
  380. X
  381. XreadFromServer()
  382. X`123
  383. X    struct timeval timeout;
  384. X    fd_set readfds;
  385. X    int retval = 0;
  386. X
  387. X    if (serverDead) return(0);
  388. X    if (commMode == COMM_TCP) drop_flag=0;`009/* just in case */
  389. X    timeout.tv_sec=1;
  390. X    timeout.tv_usec=0;
  391. X/*    readfds = 1<<sock;*/
  392. X    FD_ZERO(&readfds);
  393. X    FD_SET(sock, &readfds);
  394. X    if (udpSock >= 0)
  395. X`009FD_SET(udpSock, &readfds);
  396. X/* readfds = 1<<sock; */
  397. X/* printf("1) readfds ar/*%x\n", readfds */
  398. X    `009FD_ISSET(sock,`009`009&readfds);
  399. X   if (select(32,&readfds,0,0,&timeout) != 0) `123
  400. X`009/* Read info from the xtrek server */
  401. X`009if (FD_ISSET(sock, &readfds)) `123
  402. X`009    chan = sock;
  403. X`009    retval += doRead(sock);
  404. X        `125
  405. X`009if (udpSock >= 0 && FD_ISSET(udpSock, &readfds)) `123
  406. X`009    V_UDPDIAG(("Activity on UDP socket\n"));
  407. X`009    chan = udpSock;
  408. X`009    if (commStatus == STAT_VERIFY_UDP) `123
  409. X`009`009warning("UDP connection established");
  410. X`009`009sequence = 0;`009`009/* reset sequence #s */
  411. X`009`009resetForce();
  412. X`009`009commMode = COMM_UDP;
  413. X`009`009commStatus = STAT_CONNECTED;
  414. X`009`009commSwitchTimeout = 0;
  415. X`009`009if (udpClientRecv != MODE_SIMPLE)
  416. X`009`009    sendUdpReq(COMM_MODE + udpClientRecv);
  417. X`009`009if (udpWin) `123
  418. X`009`009    udprefresh(UDP_CURRENT);
  419. X`009`009    udprefresh(UDP_STATUS);
  420. X`009`009`125
  421. X`009    `125
  422. X`009    retval += doRead(udpSock);
  423. X`009`125
  424. X    `125
  425. X
  426. +-+-+-+-+-+-+-+-  END  OF PART 39 +-+-+-+-+-+-+-+-
  427.