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;