diff src/input.c @ 4:aa38447a4b21

First entry of Paradise Server 2.9 patch 10 Beta
author darius
date Sat, 06 Dec 1997 04:37:03 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/input.c	Sat Dec 06 04:37:03 1997 +0000
@@ -0,0 +1,163 @@
+/*--------------------------------------------------------------------------
+NETREK II -- Paradise
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any NON-COMMERCIAL purpose (following the terms of
+the GNU General Public License (read the file 'COPYING')) and without
+fee is hereby granted, provided that this copyright notice appear in all
+copies.  No representations are made about the suitability of this
+software for any purpose.  This software is provided "as is" without
+express or implied warranty.
+
+    Xtrek Copyright 1986                            Chris Guthrie
+    Netrek (Xtrek II) Copyright 1989                Kevin P. Smith
+                                                    Scott Silvey
+    Paradise II (Netrek II) Copyright 1993          Larry Denys
+                                                    Kurt Olsen
+                                                    Brandon Gillespie
+
+    Comprehensive credits are available in the file "CREDITS"
+--------------------------------------------------------------------------*/
+
+#include "config.h"
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <signal.h>
+#include <errno.h>
+#include "defs.h"
+#include "struct.h"
+#include "data.h"
+#include "shmem.h"
+
+static int sendflag = 0;
+
+extern int intrupt();
+extern void start_interruptor();
+extern int isClientDead();
+int reconnect();
+extern int readFromClient();
+extern void stop_interruptor();
+extern int exitGame();
+extern int closeUdpConn();
+extern unsigned int sleep();
+extern int connectToClient();
+extern void (*r_signal()) ();
+
+void
+setflag()
+{
+  sendflag = 1;
+}
+
+
+void
+input()
+{
+  fd_set readfds;
+
+  start_interruptor();
+
+  /* Idea:  read from client often, send to client not so often */
+  while (me->p_status == PALIVE ||
+	 me->p_status == PEXPLODE ||
+	 me->p_status == PDEAD ||
+	 me->p_status == POBSERVE)
+  {
+    if (isClientDead())
+    {
+      if (!reconnect())
+	exit(0);
+    }
+    FD_ZERO(&readfds);
+    FD_SET(sock, &readfds);
+    if (udpSock >= 0)
+      FD_SET(udpSock, &readfds);
+
+    /*
+     * blocks indefinitely unless client input or timerDelay SIGALRM causes
+     * EINTR
+     */
+
+    if (socketWait() > 0)
+    {
+      readFromClient();
+    }
+    if (sendflag)
+    {
+      intrupt();
+      sendflag = 0;
+    }
+
+    /* statements below are executed once per timerDelay */
+    if (me->p_updates > delay)
+    {
+      me->p_flags &= ~(PFWAR);
+    }
+    if (me->p_updates > rdelay)
+    {
+      me->p_flags &= ~(PFREFITTING);
+    }
+
+    /*
+     * this will ghostbust a player if no ping has been received in
+     * ping_ghostbust_interval seconds
+     */
+
+    if (configvals->ping_allow_ghostbust
+	&& (me->p_status == PALIVE || me->p_status == POBSERVE)
+	&& ping_ghostbust > configvals->ping_ghostbust_interval)
+      me->p_ghostbuster = 100000;	/* ghostbusted */
+    else
+      /* Keep self from being nuked... */
+      me->p_ghostbuster = 0;
+  }
+  stop_interruptor();
+}
+
+int
+reconnect()
+{
+  int i;
+
+  if (noressurect)
+    exitGame();
+  stop_interruptor();
+
+  r_signal(SIGIO, SIG_IGN);
+#ifdef DEBUG
+  printf("Ack!  The client went away!\n");
+  printf("I will attempt to resurrect him!\n");
+  fflush(stdout);
+#endif
+  commMode = COMM_TCP;
+  if (udpSock >= 0)
+    closeUdpConn();
+
+  /* For next two minutes, we try to restore connection */
+  shutdown(sock, 2);
+  sock = -1;
+  for (i = 0;; i++)
+  {
+    me->p_ghostbuster = 0;
+    sleep(5);
+    if (connectToClient(host, nextSocket))
+      break;
+    if (i == 23)
+    {
+#ifdef DEBUG
+      printf("Oh well, maybe I'm getting rusty!\n");
+      fflush(stdout);
+#endif
+      return 0;
+    }
+  }
+  start_interruptor();
+#ifdef DEBUG
+  printf("A miracle!  He's alive!\n");
+  fflush(stdout);
+#endif
+  return 1;
+}