tHandling of not-yet-fully-connected players much improved, to cut down on invalid packets - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit ac035dba03aa85c81f2c394ff428452bdef9cad4
 (DIR) parent 658b93f9bdd6342e90eb03adaa9508ed754b1178
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Mon,  3 Dec 2001 16:10:56 +0000
       
       Handling of not-yet-fully-connected players much improved, to cut down on
       invalid packets
       
       
       Diffstat:
         M src/AIPlayer.c                      |       1 +
         M src/dopewars.c                      |       6 ++++++
         M src/dopewars.h                      |       1 +
         M src/message.c                       |      15 +++++++++------
         M src/serverside.c                    |      40 ++++++++++++++++++++++----------
       
       5 files changed, 45 insertions(+), 18 deletions(-)
       ---
 (DIR) diff --git a/src/AIPlayer.c b/src/AIPlayer.c
       t@@ -274,6 +274,7 @@ int HandleAIMessage(char *Message,Player *AIPlay) {
           GSList *list;
           struct timeval tv;
           gboolean Handled;
       +
           if (ProcessMessage(Message,AIPlay,&From,&AI,&Code,
                              &Data,FirstClient)==-1) {
              g_warning("Bad network message. Oops."); return 0;
 (DIR) diff --git a/src/dopewars.c b/src/dopewars.c
       t@@ -727,6 +727,12 @@ GSList *AddPlayer(int fd,Player *NewPlayer,GSList *First) {
           return g_slist_append(First,(gpointer)NewPlayer);
        }
        
       +gboolean IsConnectedPlayer(Player *play) {
       +/* Returns TRUE only if the given player has properly connected (i.e. has
       +   a valid name) */
       +  return (play && play->Name && play->Name[0]);
       +}
       +
        void UpdatePlayer(Player *Play) {
        /* Redimensions the Gun and Drug lists for "Play" */
           Play->Guns=(Inventory *)g_realloc(Play->Guns,NumGun*sizeof(Inventory));
 (DIR) diff --git a/src/dopewars.h b/src/dopewars.h
       t@@ -403,4 +403,5 @@ void RestoreConfig(void);
        void ScannerErrorHandler(GScanner *scanner,gchar *msg,gint error);
        void OpenLog(void);
        void CloseLog(void);
       +gboolean IsConnectedPlayer(Player *play);
        #endif
 (DIR) diff --git a/src/message.c b/src/message.c
       t@@ -433,12 +433,15 @@ void BroadcastToClients(AICode AI,MsgCode Code,char *Data,
        /* Sends the message made up of AI,Code and Data to all players except     */
        /* "Except" (if non-NULL). It will be sent by the server, and on behalf of */
        /* player "From"                                                           */
       -   Player *tmp;
       -   GSList *list;
       -   for (list=FirstServer;list;list=g_slist_next(list)) {
       -      tmp=(Player *)list->data;
       -      if (tmp!=Except) SendServerMessage(From,AI,Code,tmp,Data);
       -   }
       +  Player *tmp;
       +  GSList *list;
       +
       +  for (list=FirstServer;list;list=g_slist_next(list)) {
       +    tmp=(Player *)list->data;
       +    if (IsConnectedPlayer(tmp) && tmp!=Except) {
       +      SendServerMessage(From,AI,Code,tmp,Data);
       +    }
       +  }
        }
        
        void SendInventory(Player *From,AICode AI,MsgCode Code,
 (DIR) diff --git a/src/serverside.c b/src/serverside.c
       t@@ -369,7 +369,9 @@ void HandleServerMessage(gchar *buf,Player *Play) {
                       SetPlayerName(Play,Data);
                       for (list=FirstServer;list;list=g_slist_next(list)) {
                          pt=(Player *)list->data;
       -                  if (pt!=Play && !IsCop(pt)) SendPlayerDetails(pt,Play,C_LIST);
       +                  if (pt!=Play && IsConnectedPlayer(pt) && !IsCop(pt)) {
       +                    SendPlayerDetails(pt,Play,C_LIST);
       +                  }
                       }
                       SendServerMessage(NULL,C_NONE,C_ENDLIST,Play,NULL);
                       RegisterWithMetaServer(TRUE,FALSE,TRUE);
       t@@ -380,7 +382,9 @@ void HandleServerMessage(gchar *buf,Player *Play) {
                       }
                       for (list=FirstServer;list;list=g_slist_next(list)) {
                          pt=(Player *)list->data;
       -                  if (pt!=Play) SendPlayerDetails(Play,pt,C_JOIN);
       +                  if (IsConnectedPlayer(pt) && pt!=Play) {
       +                    SendPlayerDetails(Play,pt,C_JOIN);
       +                  }
                       }
                       Play->EventNum=E_ARRIVE;
                       SendPlayerData(Play);
       t@@ -525,8 +529,8 @@ void HandleServerMessage(gchar *buf,Player *Play) {
                 BroadcastToClients(C_NONE,C_MSG,Data,Play,Play);
                 break;
              default:
       -         g_warning("%s:%c:%s:%s",GetPlayerName(Play),Code,
       -                                 GetPlayerName(To),Data);
       +         dopelog(0,_("Unknown message: %s:%c:%s:%s"),GetPlayerName(Play),Code,
       +                 GetPlayerName(To),Data);
                 break;
           }
        }
       t@@ -536,6 +540,9 @@ void ClientLeftServer(Player *Play) {
        /* cleans up after them if necessary.                            */
           Player *tmp;
           GSList *list;
       +
       +   if (!IsConnectedPlayer(Play)) return;
       +
           if (Play->EventNum==E_FIGHT || Play->EventNum==E_FIGHTASK) {
              WithdrawFromCombat(Play);
           }
       t@@ -1447,9 +1454,13 @@ void GuiServerLoop(gboolean is_service) {
        
        void FinishGame(Player *Play,char *Message) {
        /* Tells player "Play" that the game is over; display "Message" */
       -   ClientLeftServer(Play);
           Play->EventNum=E_FINISH;
       +   ClientLeftServer(Play);
           SendHighScores(Play,TRUE,Message);
       +
       +/* Blank the name, so that CountPlayers ignores this player */
       +   SetPlayerName(Play,NULL);
       +
        /* Make sure they do actually disconnect, eventually! */
           if (ConnectTimeout) {
              Play->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout;
       t@@ -1928,7 +1939,8 @@ void SendEvent(Player *To) {
                 case E_ARRIVE:
                    for (list=FirstServer;list;list=g_slist_next(list)) {
                       Play=(Player *)list->data;
       -               if (Play!=To && Play->IsAt==To->IsAt &&
       +               if (IsConnectedPlayer(Play) && Play!=To &&
       +                   Play->IsAt==To->IsAt &&
                           Play->EventNum==E_NONE && TotalGunsCarried(To)>0) {
                          text=g_strdup_printf(_("AE^%s is already here!^"
                                                 "Do you Attack, or Evade?"),
       t@@ -2392,6 +2404,11 @@ void WithdrawFromCombat(Player *Play) {
           GSList *list;
           gchar *text;
        
       +   for (list=FirstServer;list;list=g_slist_next(list)) {
       +      Attack=(Player *)list->data;
       +      if (Attack->Attacking==Play) Attack->Attacking=NULL;
       +   }
       +
           if (!Play->FightArray) return;
        
           ResolveTipoff(Play);
       t@@ -2406,11 +2423,6 @@ void WithdrawFromCombat(Player *Play) {
              if (!FightDone) break;
           }
        
       -   for (list=FirstServer;list;list=g_slist_next(list)) {
       -      Attack=(Player *)list->data;
       -      if (Attack->Attacking==Play) Attack->Attacking=NULL;
       -   }
       -
           SendFightLeave(Play,FightDone);
           g_ptr_array_remove(Play->FightArray,(gpointer)Play);
        
       t@@ -2734,6 +2746,7 @@ void HandleAnswer(Player *From,Player *To,char *answer) {
                 break;
           } else if (From->EventNum==E_ARRIVE) {
              if ((answer[0]=='A' || answer[0]=='T') && 
       +          IsConnectedPlayer(From->OnBehalfOf) &&
                  g_slist_find(FirstServer,(gpointer)From->OnBehalfOf)) {
                 Defender=From->OnBehalfOf;
                 From->OnBehalfOf=NULL; /* So we don't think it was a tipoff */
       t@@ -2995,6 +3008,8 @@ GSList *HandleTimeouts(GSList *First) {
                 dopelog(1,_("Player removed due to idle timeout"));
                 SendPrintMessage(NULL,C_NONE,Play,"Disconnected due to idle timeout");
                 ClientLeftServer(Play);
       +/* Blank the name, so that CountPlayers ignores this player */
       +         SetPlayerName(Play,NULL);
        /* Make sure they do actually disconnect, eventually! */
                 if (ConnectTimeout) {
                    Play->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout;
       t@@ -3003,7 +3018,8 @@ GSList *HandleTimeouts(GSList *First) {
                 Play->ConnectTimeout=0;
                 dopelog(1,_("Player removed due to connect timeout"));
                 First=RemovePlayer(Play,First);
       -      } else if (Play->FightTimeout!=0 && Play->FightTimeout<=timenow) {
       +      } else if (IsConnectedPlayer(Play) &&
       +                 Play->FightTimeout!=0 && Play->FightTimeout<=timenow) {
                 ClearFightTimeout(Play);
                 if (IsCop(Play)) Fire(Play);
                 else SendFightReload(Play);