tMetaserver list functions now operate on passed variables, not a global - 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 7b1208f1e56d5539ce80984621f6050223a1d869
 (DIR) parent 53df30758f616cb8384288ec861c49eccd3212fb
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Mon, 24 Sep 2001 21:55:59 +0000
       
       Metaserver list functions now operate on passed variables, not a global
       
       
       Diffstat:
         M src/curses_client.c                 |       4 ++--
         M src/gtk_client.c                    |      32 +++++++++++++++++++------------
         M src/message.c                       |      22 +++++++++++++---------
         M src/message.h                       |       4 ++--
       
       4 files changed, 37 insertions(+), 25 deletions(-)
       ---
 (DIR) diff --git a/src/curses_client.c b/src/curses_client.c
       t@@ -240,7 +240,7 @@ static char *SelectServerFromMetaServer(Player *Play) {
        
           if (!MetaConn) return "Cannot connect";
        
       -   ClearServerList();
       +   ClearServerList(&ServerList);
        
           while(DoneOK) {
              FD_ZERO(&readfds); FD_ZERO(&writefds);
       t@@ -257,7 +257,7 @@ static char *SelectServerFromMetaServer(Player *Play) {
                if (c=='\f') wrefresh(curscr);
              }
              if (RespondToSelect(&MetaConn->NetBuf,&readfds,&writefds,NULL,&DoneOK)) {
       -         while (HandleWaitingMetaServerData(MetaConn)) {}
       +         while (HandleWaitingMetaServerData(MetaConn,&ServerList)) {}
              }
              if (!DoneOK) {
                 g_print("Metaserver communication closed");
 (DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c
       t@@ -73,10 +73,6 @@ struct ClientDataStruct {
        static struct ClientDataStruct ClientData;
        static gboolean InGame=FALSE;
        
       -/*#ifdef NETWORKING
       -static gboolean MetaServerRead=FALSE;
       -#endif*/
       -
        static GtkWidget *FightDialog=NULL,*SpyReportsDialog;
        static gboolean IsShowingPlayerList=FALSE,IsShowingTalkList=FALSE,
                        IsShowingInventory=FALSE,IsShowingGunShop=FALSE;
       t@@ -98,6 +94,9 @@ static void GetClientMessage(gpointer data,gint socket,
        static void SocketStatus(NetworkBuffer *NetBuf,gboolean Read,gboolean Write);
        static void MetaSocketStatus(NetworkBuffer *NetBuf,gboolean Read,
                                     gboolean Write);
       +
       +/* List of servers on the metaserver */
       +static GSList *MetaList=NULL;
        #endif
        
        static void HandleClientMessage(char *buf,Player *Play);
       t@@ -1905,6 +1904,7 @@ struct StartGameStruct {
        #ifdef NETWORKING
           gint ConnectTag;
           HttpConnection *MetaConn;
       +   GSList *NewMetaList;
        #endif
        };
        
       t@@ -1976,7 +1976,8 @@ static void ConnectToServer(GtkWidget *widget,struct StartGameStruct *widgets) {
           DoConnect(widgets);
        }
        
       -static void FillMetaServerList(struct StartGameStruct *widgets) {
       +static void FillMetaServerList(struct StartGameStruct *widgets,
       +                               gboolean UseNewList) {
           GtkWidget *metaserv;
           ServerData *ThisServer;
           gchar *titles[5];
       t@@ -1987,8 +1988,13 @@ static void FillMetaServerList(struct StartGameStruct *widgets) {
           gtk_clist_freeze(GTK_CLIST(metaserv));
           gtk_clist_clear(GTK_CLIST(metaserv));
        
       +   if (UseNewList && widgets->NewMetaList) {
       +     ClearServerList(&MetaList);
       +     MetaList=widgets->NewMetaList;
       +     widgets->NewMetaList=NULL;
       +   }
        
       -   for (ListPt=ServerList;ListPt;ListPt=g_slist_next(ListPt)) {
       +   for (ListPt=MetaList;ListPt;ListPt=g_slist_next(ListPt)) {
              ThisServer=(ServerData *)(ListPt->data);
              titles[0]=ThisServer->Name;
              titles[1]=g_strdup_printf("%d",ThisServer->Port);
       t@@ -2021,13 +2027,14 @@ static void HandleMetaSock(gpointer data,gint socket,
        
           if (NetBufHandleNetwork(&widgets->MetaConn->NetBuf,condition&GDK_INPUT_READ,
                                   condition&GDK_INPUT_WRITE,&DoneOK)) {
       -      while (HandleWaitingMetaServerData(widgets->MetaConn)) {}
       +      while (HandleWaitingMetaServerData(widgets->MetaConn,
       +                                         &widgets->NewMetaList)) {}
           }
           if (!DoneOK) {
       -      g_print("Metaserver communicated closed\n");
       +      g_print("Metaserver communication closed\n");
              CloseHttpConnection(widgets->MetaConn);
              widgets->MetaConn=NULL;
       -      FillMetaServerList(widgets);
       +      FillMetaServerList(widgets,TRUE);
           }
        }
        
       t@@ -2049,13 +2056,12 @@ static void UpdateMetaServerList(GtkWidget *widget,
              CloseHttpConnection(widgets->MetaConn);
              widgets->MetaConn=NULL;
           }
       +   ClearServerList(&widgets->NewMetaList);
        
           widgets->MetaConn = OpenMetaHttpConnection();
        
           if (widgets->MetaConn) {
              metaserv=widgets->metaserv;
       -      gtk_clist_clear(GTK_CLIST(metaserv));
       -      ClearServerList();
              SetNetworkBufferCallBack(&widgets->MetaConn->NetBuf,
                                       MetaSocketStatus,(gpointer)widgets);
           }
       t@@ -2105,6 +2111,7 @@ static void CloseNewGameDia(GtkWidget *widget,
              CloseHttpConnection(widgets->MetaConn);
              widgets->MetaConn=NULL;
           }
       +   ClearServerList(&widgets->NewMetaList);
        #endif
        }
        
       t@@ -2140,6 +2147,7 @@ void NewGameDialog(void) {
        
           widgets.ConnectTag=0;
           widgets.MetaConn=NULL;
       +   widgets.NewMetaList=NULL;
        
        #endif /* NETWORKING */
        
       t@@ -2324,7 +2332,7 @@ void NewGameDialog(void) {
           if (UpdateMeta) {
              UpdateMetaServerList(NULL,&widgets);
           } else {
       -      FillMetaServerList(&widgets);
       +      FillMetaServerList(&widgets,FALSE);
           }
        #endif
        
 (DIR) diff --git a/src/message.c b/src/message.c
       t@@ -300,6 +300,7 @@ void InitNetworkBuffer(NetworkBuffer *NetBuf,char Terminator,char StripChar) {
           NetBuf->ReadBuf.Length=NetBuf->WriteBuf.Length=0;
           NetBuf->ReadBuf.DataPresent=NetBuf->WriteBuf.DataPresent=0;
           NetBuf->WaitConnect=FALSE;
       +   NetBuf->Error=0;
        }
        
        void SetNetworkBufferCallBack(NetworkBuffer *NetBuf,NBCallBack CallBack,
       t@@ -603,7 +604,7 @@ gboolean WriteDataToWire(NetworkBuffer *NetBuf) {
        /* TRUE on success, or FALSE if the buffer's maximum length is        */
        /* reached, or the remote end has closed the connection.              */
           ConnBuf *conn;
       -   int CurrentPosition,BytesSent;
       +   int CurrentPosition,BytesSent,Error;
           conn=&NetBuf->WriteBuf;
           if (!conn->Data || !conn->DataPresent) return TRUE;
           if (conn->Length==MAXWRITEBUF) return FALSE;
       t@@ -612,10 +613,13 @@ gboolean WriteDataToWire(NetworkBuffer *NetBuf) {
              BytesSent=send(NetBuf->fd,&conn->Data[CurrentPosition],
                             conn->DataPresent-CurrentPosition,0);
              if (BytesSent==SOCKET_ERROR) {
       +         Error=GetSocketError();
        #ifdef CYGWIN
       -         if (GetSocketError()==WSAEWOULDBLOCK) break; else return FALSE;
       +         if (Error==WSAEWOULDBLOCK) break;
       +         else { NetBuf->Error=Error; return FALSE; }
        #else
       -         if (GetSocketError()==EAGAIN) break; else return FALSE;
       +         if (Error==EAGAIN) break;
       +         else if (Error!=EINTR) { NetBuf->Error=Error; return FALSE; }
        #endif
              } else {
                 CurrentPosition+=BytesSent;
       t@@ -783,7 +787,7 @@ gboolean HandleHttpCompletion(HttpConnection *conn) {
           return TRUE;
        }
        
       -gboolean HandleWaitingMetaServerData(HttpConnection *conn) {
       +gboolean HandleWaitingMetaServerData(HttpConnection *conn,GSList **listpt) {
           gchar *msg;
           ServerData *NewServer;
        
       t@@ -807,7 +811,7 @@ gboolean HandleWaitingMetaServerData(HttpConnection *conn) {
              NewServer->Update=ReadHttpResponse(conn);
              NewServer->Comment=ReadHttpResponse(conn);
              NewServer->UpSince=ReadHttpResponse(conn);
       -      ServerList=g_slist_append(ServerList,NewServer);
       +      *listpt=g_slist_append(*listpt,NewServer);
           } else if (conn->Status==HS_READSEPARATOR) {
              /* This should be the first line of the body, the "MetaServer:" line */
              msg=ReadHttpResponse(conn);
       t@@ -824,14 +828,14 @@ gboolean HandleWaitingMetaServerData(HttpConnection *conn) {
           return TRUE;
        }
        
       -void ClearServerList() {
       +void ClearServerList(GSList **listpt) {
           ServerData *ThisServer;
       -   while (ServerList) {
       -      ThisServer=(ServerData *)(ServerList->data);
       +   while (*listpt) {
       +      ThisServer=(ServerData *)((*listpt)->data);
              g_free(ThisServer->Name); g_free(ThisServer->Comment);
              g_free(ThisServer->Version); g_free(ThisServer->Update);
              g_free(ThisServer->UpSince); g_free(ThisServer);
       -      ServerList=g_slist_remove(ServerList,ThisServer);
       +      *listpt=g_slist_remove(*listpt,ThisServer);
           }
        }
        #endif /* NETWORKING */
 (DIR) diff --git a/src/message.h b/src/message.h
       t@@ -134,8 +134,8 @@ HttpConnection *OpenMetaHttpConnection(void);
        void CloseHttpConnection(HttpConnection *conn);
        gchar *ReadHttpResponse(HttpConnection *conn);
        gboolean HandleHttpCompletion(HttpConnection *conn);
       -gboolean HandleWaitingMetaServerData(HttpConnection *conn);
       -void ClearServerList(void);
       +gboolean HandleWaitingMetaServerData(HttpConnection *conn,GSList **listpt);
       +void ClearServerList(GSList **listpt);
        #endif /* NETWORKING */
        
        extern GSList *FirstClient;