Update of /cvsroot/netrek/server/Vanilla/ntserv
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20227/ntserv

Modified Files:
	data.c ntscmds.c main.c openmem.c 
Log Message:
vote to ban

Index: ntscmds.c
===================================================================
RCS file: /cvsroot/netrek/server/Vanilla/ntserv/ntscmds.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- ntscmds.c	23 Apr 2006 10:39:10 -0000	1.7
+++ ntscmds.c	24 Apr 2006 12:35:17 -0000	1.8
@@ -30,6 +30,10 @@
 void do_player_eject(int who, int player, int mflags, int sendto);
 #endif
 
+#if defined (ALLOW_BAN)
+void do_player_ban(int who, int player, int mflags, int sendto);
+#endif
+
 #if defined (AUTO_INL)
 void do_start_inl(void);
 #endif
@@ -71,6 +75,9 @@
 #if defined (ALLOW_EJECT)
 void eject_player(int who);
 #endif
+#if defined (ALLOW_BAN)
+void ban_player(int who);
+#endif
 void do_client_query(char *comm, struct message *mess, int who);
 void do_ping_query(char *comm, struct message *mess, int who);
 void do_stats_query(char *comm, struct message *mess, int who);
@@ -189,6 +196,13 @@
 	do_player_eject,				/* EJECT */
 	2, PV_EJECT, 120, 600},
 #endif
+#if defined(ALLOW_BAN)
+    { "BAN",
+	C_VC_TEAM | C_GLOG | C_PLAYER | C_PR_INPICKUP,
+	"Eject and ban a player       e.g. 'BAN 0'", 
+	do_player_ban,					/* BAN */
+	2, PV_BAN, 120, 600},
+#endif
 #if defined(TRIPLE_PLANET_MAYHEM)
     { "TRIPLE",
         C_VC_ALL | C_GLOG | C_PR_INPICKUP,
@@ -272,9 +286,24 @@
     }
 
     pmessage(0, MALL, addr_mess(who,MALL), 
-	" %2s has been ejected by their team", j->p_mapchars);
+	"%2s has been ejected by their team", j->p_mapchars);
 
     eject_player(j->p_no);
+}
+
+void eject_player(int who)
+{
+  struct player *j;
+
+  j = &players[who];
+  j->p_ship.s_type = STARBASE;
+  j->p_whydead=KQUIT;
+  j->p_explode=10;
+  /* note VICIOUS_EJECT prevents animation of ship explosion */
+  j->p_status=PEXPLODE;
+  j->p_whodead=me->p_no;
+  bay_release(j);
+
 #if defined(VICIOUS_EJECT)
                                       /* Eject AND free the slot. I am sick
                                          of the idiots who login and just
@@ -288,22 +317,57 @@
       freeslot(j);
     }
 #endif
+
 }
+#endif /* ALLOW_EJECT */
 
-void eject_player(int who)
+#if defined (ALLOW_BAN)
+void do_player_ban(int who, int player, int mflags, int sendto)
 {
-  struct player* j;
+    struct player *j;
+    char *reason = NULL;
 
-  j = &players[who];
-  j->p_ship.s_type = STARBASE;
-  j->p_whydead=KQUIT;
-  j->p_explode=10;
-  /* note VICIOUS_EJECT prevents animation of ship explosion */
-  j->p_status=PEXPLODE;
-  j->p_whodead=me->p_no;
-  bay_release(j);
+    j = &players[player];
+
+    if (j->p_status == PFREE) {
+      reason = "You may not ban a free slot.";
+    } else if (j->p_flags & PFROBOT) {
+      reason = "You may not ban a robot.";
+    } else if (j->p_team != players[who].p_team) {
+      reason = "You may not ban players of the other team.";
+    }
+
+    if (reason != NULL) {
+      pmessage(players[who].p_team, MTEAM, 
+	       addr_mess(players[who].p_team,MTEAM), 
+	       reason);
+      return;
+    }
+
+    pmessage(0, MALL, addr_mess(who,MALL), 
+	"%2s has been temporarily banned by their team", j->p_mapchars);
+
+    eject_player(j->p_no);
+    ban_player(j->p_no);
 }
-#endif /* ALLOW_EJECT */
+
+void ban_player(int who)
+{
+  int i;
+  struct player *j = &players[who];
+  for (i=0; i<MAXBANS; i++) {
+    struct ban *b = &bans[i];
+    if (b->b_expire == 0) {
+      strcpy(b->b_ip, j->p_ip);
+      b->b_expire = 100;
+      ERROR(2,( "ban of %s was voted\n", b->b_ip));
+      return;
+    }
+  }
+  pmessage(0, MALL, addr_mess(who,MALL), 
+	   " temporary ban list is full, ban ineffective");
+}
+#endif /* ALLOW_BAN */
 
 #if defined(AUTO_PRACTICE)
 void do_start_basep(void)

Index: data.c
===================================================================
RCS file: /cvsroot/netrek/server/Vanilla/ntserv/data.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- data.c	22 Apr 2006 11:31:53 -0000	1.4
+++ data.c	24 Apr 2006 12:35:17 -0000	1.5
@@ -23,6 +23,7 @@
 struct ship *shipvals;
 struct pqueue *queues;
 struct queuewait *waiting;
+struct ban *bans;
 
 int	oldalert = PFGREEN;	/* Avoid changing more than we have to */
 

Index: main.c
===================================================================
RCS file: /cvsroot/netrek/server/Vanilla/ntserv/main.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- main.c	22 Apr 2006 11:31:53 -0000	1.6
+++ main.c	24 Apr 2006 12:35:17 -0000	1.7
@@ -42,7 +42,8 @@
 static void sendMotd(void);
 static void sendConfigMsg(void);
 static void printStats(void);
-static int checkbanned(char *login, char *host);
+static int check_temporary_bans(char *ip);
+static int check_permanent_bans(char *login, char *host);
 
 extern int ignored[MAXPLAYER];
 int indie = 0;			/* always be indie 8/28/91 TC */
@@ -406,25 +407,34 @@
     me->p_status = PALIVE;			/* Put player in game */
     me->p_ghostbuster = 0;
 
-    if (!bypassed)
-    if (checkbanned(login, host) == TRUE) {
-      FILE        *logfile;
-      time_t curtime;
-
-      pmessage(0, MALL, "GOD->ALL","%s (%s@%s) is banned from the game.",
-              me->p_name, me->p_login, host);
-      new_warning(UNDEF,"You are banned from the game.");
-      me->p_explode=100;
-      me->p_status=PEXPLODE;
-      me->p_whydead=KQUIT;   /* make him self destruct */
-      me->p_whodead=0;
-      logfile=fopen(LogFileName, "a");
-      if (logfile) {
-        curtime=time(NULL);
-        fprintf(logfile, "Banned and exiting: %s (%s@%s), (%c), %s",
-              me->p_name,  me->p_login, host, shipnos[me->p_no], ctime(&curtime)
-);
-        fclose(logfile);
+    if (!bypassed) {
+      char *reason = NULL;
+      if (check_permanent_bans(login, host) == TRUE) {
+	reason = "banned by the administrator";
+      } else if (check_permanent_bans(login, me->p_ip) == TRUE) {
+	reason = "banned by the administrator";
+      } else if (check_temporary_bans(me->p_ip) == TRUE) {
+	reason = "banned by the players";
+      }
+      if (reason != NULL) {
+	FILE *logfile;
+	time_t curtime;
+	
+	pmessage(0, MALL, "GOD->ALL","%s (%s@%s) is %s.",
+		 me->p_name, me->p_login, me->p_ip, reason);
+	new_warning(UNDEF,"You are banned from the game.");
+	me->p_explode=100;
+	me->p_status=PEXPLODE;
+	me->p_whydead=KQUIT;   /* make him self destruct */
+	me->p_whodead=0;
+	logfile=fopen(LogFileName, "a");
+	if (logfile) {
+	  curtime=time(NULL);
+	  fprintf(logfile, "Banned and exiting: %s (%s@%s), (%c), %s",
+		  me->p_name,  me->p_login, host, shipnos[me->p_no], ctime(&curtime)
+		  );
+	  fclose(logfile);
+	}
       }
     }
 
@@ -813,12 +823,34 @@
     fclose(logfile);
 }
 
-static int checkbanned(char *login, char *host)
+/* check temporary bans voted */
+static int check_temporary_bans(char *ip)
+{
+  int i;
+  for(i=0; i<MAXBANS; i++) {
+    struct ban *b = &bans[i];
+    if (b->b_expire) {
+      if (!strcmp(b->b_ip, ip)) {
+	ERROR(2,( "ban of %s has been probed\n", b->b_ip));
+	b->b_expire += 10;
+	return TRUE;
+      }
+      b->b_expire--;
+      if (!b->b_expire) {
+	ERROR(2,( "ban of %s has expired\n", b->b_ip));
+      }
+    }
+  }
+  return FALSE;
+}
+
+/* check permanent bans in file */
+static int check_permanent_bans(char *login, char *host)
 {
   FILE  *bannedfile;
   char  log_buf[64], host_buf[64], line_buf[160];
   char  *position;
-  int           num1;
+  int   num1;
   int   Hits=0;                 /* Hits==2 means we're banned */
 
   if ((bannedfile = fopen(Banned_File, "r")) == NULL) {

Index: openmem.c
===================================================================
RCS file: /cvsroot/netrek/server/Vanilla/ntserv/openmem.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- openmem.c	22 Apr 2006 02:16:46 -0000	1.2
+++ openmem.c	24 Apr 2006 12:35:17 -0000	1.3
@@ -79,6 +79,7 @@
     shipvals = sharedMemory->shipvals;
     queues = sharedMemory->queues;
     waiting = sharedMemory->waiting;
+    bans = sharedMemory->bans;
 }
 
 /*ARGSUSED*/