tServer now uses new metaserver communication code - 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 82bba80eb18e42f467ac48c59d6222711170cb70
 (DIR) parent 8deb8cf2d3a6cd75cebbefcb6e8b15bc2c6a02b4
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Sun,  9 Sep 2001 21:35:29 +0000
       
       Server now uses new metaserver communication code
       
       
       Diffstat:
         M configure.in                        |       1 +
         M src/serverside.c                    |     163 +++++++++++++++----------------
       
       2 files changed, 78 insertions(+), 86 deletions(-)
       ---
 (DIR) diff --git a/configure.in b/configure.in
       t@@ -194,6 +194,7 @@ fi
        
        dnl Enable full warnings if using gcc
        if test -n "$GCC"; then
       +dnl   CFLAGS="$CFLAGS -Wall -Wfloat-equal -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wconversion -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wredundant-decls -Wnested-externs -Wunreachable-code -Wunused"
           CFLAGS="$CFLAGS -Wall"
        fi
        
 (DIR) diff --git a/src/serverside.c b/src/serverside.c
       t@@ -81,7 +81,7 @@ static GScanner *Scanner;
        #endif
        
        /* Data waiting to be sent to/read from the metaserver */
       -NetworkBuffer MetaNetBuf;
       +HttpConnection *MetaConn=NULL;
        gint MetaInputTag=0;
        
        /* Handle to the high score file */
       t@@ -127,10 +127,8 @@ void RegisterWithMetaServer(gboolean Up,gboolean SendData,
        /* recently. If networking is disabled, this function does nothing.  */
        #if NETWORKING
           struct HISCORE MultiScore[NUMHISCORE],AntiqueScore[NUMHISCORE];
       -   GString *text,*query;
       +   GString *headers,*body;
           gchar *prstr;
       -   gchar *MetaName;
       -   int MetaPort;
           int i;
        
           if (!MetaServer.Active || !NotifyMetaServer || WantQuit) return;
       t@@ -144,75 +142,68 @@ void RegisterWithMetaServer(gboolean Up,gboolean SendData,
        
        /* If the previous connect hung for so long that it's still active, then
           break the connection before we start a new one */
       -   ShutdownNetworkBuffer(&MetaNetBuf);
       -
       -/* If a proxy is defined, connect to that. Otherwise, connect to the
       -   metaserver directly */
       -   if (MetaServer.ProxyName[0]) {
       -      MetaName=MetaServer.ProxyName; MetaPort=MetaServer.ProxyPort;
       -   } else {
       -      MetaName=MetaServer.Name; MetaPort=MetaServer.Port;
       -   }
       -
       -   if (StartNetworkBufferConnect(&MetaNetBuf,MetaName,MetaPort)) {
       -      dopelog(2,_("Waiting for metaserver connect to %s:%d..."),MetaName,
       -              MetaPort);
       -   } else return;
       +   if (MetaConn) CloseHttpConnection(MetaConn);
        #ifdef GUI_SERVER
           if (MetaInputTag) gdk_input_remove(MetaInputTag);
       -   MetaInputTag=gdk_input_add(MetaNetBuf.fd,GDK_INPUT_READ|GDK_INPUT_WRITE,
       -                              GuiHandleMeta,NULL);
       +   MetaInputTag=0;
        #endif
       -   MetaPlayerPending=FALSE;
       -   text=g_string_new("");
       -   query=g_string_new("");
        
       -   g_string_assign(query,"output=text&");
       +   headers=g_string_new("");
       +   body=g_string_new("");
       +
       +   g_string_assign(body,"output=text&");
        
       -   g_string_sprintfa(query,"up=%d&port=%d&version=",Up ? 1 : 0,Port);
       -   AddURLEnc(query,VERSION);
       -   g_string_sprintfa(query,"&players=%d&maxplay=%d&comment=",
       +   g_string_sprintfa(body,"up=%d&port=%d&version=",Up ? 1 : 0,Port);
       +   AddURLEnc(body,VERSION);
       +   g_string_sprintfa(body,"&players=%d&maxplay=%d&comment=",
                             CountPlayers(FirstServer),MaxClients);
       -   AddURLEnc(query,MetaServer.Comment);
       +   AddURLEnc(body,MetaServer.Comment);
        
           if (MetaServer.LocalName[0]) {
       -      g_string_append(query,"&hostname=");
       -      AddURLEnc(query,MetaServer.LocalName);
       +      g_string_append(body,"&hostname=");
       +      AddURLEnc(body,MetaServer.LocalName);
           }
           if (MetaServer.Password[0]) {
       -      g_string_append(query,"&password=");
       -      AddURLEnc(query,MetaServer.Password);
       +      g_string_append(body,"&password=");
       +      AddURLEnc(body,MetaServer.Password);
           }
        
           if (SendData && HighScoreRead(MultiScore,AntiqueScore)) {
              for (i=0;i<NUMHISCORE;i++) {
                 if (MultiScore[i].Name && MultiScore[i].Name[0]) {
       -            g_string_sprintfa(query,"&nm[%d]=",i);
       -            AddURLEnc(query,MultiScore[i].Name);
       -            g_string_sprintfa(query,"&dt[%d]=",i);
       -            AddURLEnc(query,MultiScore[i].Time);
       -            g_string_sprintfa(query,"&st[%d]=%s&sc[%d]=",i,
       +            g_string_sprintfa(body,"&nm[%d]=",i);
       +            AddURLEnc(body,MultiScore[i].Name);
       +            g_string_sprintfa(body,"&dt[%d]=",i);
       +            AddURLEnc(body,MultiScore[i].Time);
       +            g_string_sprintfa(body,"&st[%d]=%s&sc[%d]=",i,
                                      MultiScore[i].Dead ? "dead" : "alive",i);
       -            AddURLEnc(query,prstr=FormatPrice(MultiScore[i].Money));
       +            AddURLEnc(body,prstr=FormatPrice(MultiScore[i].Money));
                    g_free(prstr);
                 }
              }
           }
        
       -   g_string_sprintf(text,"POST %s HTTP/1.1",MetaServer.Path);
       -   QueueMessageForSend(&MetaNetBuf,text->str);
       -   g_string_sprintf(text,"Host: %s:%d",MetaServer.Name,MetaServer.Port);
       -   QueueMessageForSend(&MetaNetBuf,text->str);
       -   QueueMessageForSend(&MetaNetBuf,
       -                       "Content-Type: application/x-www-form-urlencoded");
       -   g_string_sprintf(text,"Content-Length: %d\n",(int)strlen(query->str));
       -   QueueMessageForSend(&MetaNetBuf,text->str);
       -
       -   QueueMessageForSend(&MetaNetBuf,query->str);
       -
       -   g_string_free(query,TRUE);
       -   g_string_free(text,TRUE);
       +   g_string_sprintf(headers,
       +                    "Content-Type: application/x-www-form-urlencoded\n"
       +                    "Content-Length: %d",(int)strlen(body->str));
           
       +   MetaConn=OpenHttpConnection(MetaServer.Name,MetaServer.Port,
       +                               MetaServer.ProxyName,MetaServer.ProxyPort,
       +                               "POST",MetaServer.Path,headers->str,body->str);
       +   g_string_free(headers,TRUE);
       +   g_string_free(body,TRUE);
       +
       +   if (MetaConn) {
       +      dopelog(2,_("Waiting for metaserver connect to %s:%u..."),
       +              MetaServer.Name,MetaServer.Port);
       +   } else return;
       +#ifdef GUI_SERVER
       +   MetaInputTag=gdk_input_add(MetaConn->NetBuf.fd,
       +                              GDK_INPUT_READ|GDK_INPUT_WRITE,
       +                              GuiHandleMeta,NULL);
       +#endif
       +   MetaPlayerPending=FALSE;
       +
           MetaUpdateTimeout=time(NULL)+METAUPDATETIME;
           MetaMinTimeout=time(NULL)+METAMINTIME;
        #endif /* NETWORKING */
       t@@ -525,7 +516,7 @@ void PrintHelpTo(FILE *fp) {
           g_string_free(VarName,TRUE);
        }
        
       -void ServerHelp() {
       +void ServerHelp(void) {
        /* Displays a simple help screen listing the server commands and options */
           int i;
        #if CYGWIN || GUI_SERVER
       t@@ -565,7 +556,7 @@ void ServerHelp() {
        }
        
        #if NETWORKING
       -void CreatePidFile() {
       +void CreatePidFile(void) {
        /* Creates a pid file (if "PidFile" is non-NULL) and writes the process */
        /* ID into it                                                           */
           FILE *fp;
       t@@ -579,7 +570,7 @@ void CreatePidFile() {
           } else g_warning(_("Cannot create pid file %s"),PidFile);
        }
        
       -void RemovePidFile() {
       +void RemovePidFile(void) {
        /* Removes the previously-created pid file "PidFile" */
           if (PidFile) unlink(PidFile);
        }
       t@@ -625,8 +616,6 @@ void StartServer() {
           struct sigaction sact;
        #endif
        
       -   InitNetworkBuffer(&MetaNetBuf,'\n','\r');
       -
           Scanner=g_scanner_new(&ScannerConfig);
           Scanner->input_name="(stdin)";
           CreatePidFile();
       t@@ -704,7 +693,7 @@ void StartServer() {
           RegisterWithMetaServer(TRUE,TRUE,FALSE);
        }
        
       -void RequestServerShutdown() {
       +void RequestServerShutdown(void) {
        /* Begin the process of shutting down the server. In order to do this, */
        /* we need to log out all of the currently connected players, and tell */
        /* the metaserver that we're shutting down. We only shut down properly */
       t@@ -716,11 +705,11 @@ void RequestServerShutdown() {
           WantQuit=TRUE;
        }
        
       -gboolean IsServerShutdown() {
       +gboolean IsServerShutdown(void) {
        /* Returns TRUE if the actions initiated by RequestServerShutdown()  */
        /* have been successfully completed, such that we can shut down the  */
        /* server properly now.                                              */
       -   return (WantQuit && !FirstServer && !IsNetworkBufferActive(&MetaNetBuf));
       +   return (WantQuit && !FirstServer && !MetaConn);
        }
        
        void HandleServerCommand(char *string) {
       t@@ -763,7 +752,7 @@ void HandleServerCommand(char *string) {
           }
        }
        
       -Player *HandleNewConnection() {
       +Player *HandleNewConnection(void) {
           int cadsize;
           int ClientSock;
           struct sockaddr_in ClientAddr;
       t@@ -817,12 +806,11 @@ void ServerLoop() {
           struct timeval timeout;
           int MinTimeout;
           GString *LineBuf;
       -   gboolean EndOfLine,DoneOK,ReadingHeaders;
       +   gboolean EndOfLine,DoneOK;
           gchar *buf;
        
           StartServer();
        
       -   ReadingHeaders=TRUE;
           LineBuf=g_string_new("");
           while (1) {
              FD_ZERO(&readfs);
       t@@ -832,8 +820,10 @@ void ServerLoop() {
              FD_SET(ListenSock,&readfs);
              FD_SET(ListenSock,&errorfs);
              topsock=ListenSock+1;
       -      SetSelectForNetworkBuffer(&MetaNetBuf,&readfs,&writefs,
       -                                &errorfs,&topsock);
       +      if (MetaConn) {
       +         SetSelectForNetworkBuffer(&MetaConn->NetBuf,&readfs,&writefs,
       +                                   &errorfs,&topsock);
       +      }
              for (list=FirstServer;list;list=g_slist_next(list)) {
                 tmp=(Player *)list->data;
                 if (!IsCop(tmp)) {
       t@@ -880,20 +870,22 @@ void ServerLoop() {
              if (FD_ISSET(ListenSock,&readfs)) {
                 HandleNewConnection();
              }
       -      if (MetaNetBuf.WaitConnect) ReadingHeaders=TRUE;
       -      if (RespondToSelect(&MetaNetBuf,&readfs,&writefs,&errorfs,&DoneOK)) {
       -         while ((buf=GetWaitingMessage(&MetaNetBuf))) {
       -            if (buf[0] || ReadingHeaders) {
       -               dopelog(ReadingHeaders ? 4 : 2,"MetaServer: %s",buf);
       +      if (MetaConn) {
       +         if (RespondToSelect(&MetaConn->NetBuf,&readfs,&writefs,
       +                             &errorfs,&DoneOK)) {
       +            while ((buf=ReadHttpResponse(MetaConn))) {
       +               gboolean ReadingBody = (MetaConn->Status==HS_READBODY);
       +               if (buf[0] || !ReadingBody) {
       +                  dopelog(ReadingBody ? 2 : 4,"MetaServer: %s",buf);
       +               }
       +               g_free(buf);
                    }
       -            if (buf[0]==0) ReadingHeaders=FALSE;
       -            g_free(buf);
                 }
       -      }
       -      if (!DoneOK) {
       -         dopelog(4,"MetaServer: (closed)\n");
       -         ShutdownNetworkBuffer(&MetaNetBuf);
       -         if (IsServerShutdown()) break;
       +         if (!DoneOK) {
       +            dopelog(4,"MetaServer: (closed)\n");
       +            CloseHttpConnection(MetaConn); MetaConn=NULL;
       +            if (IsServerShutdown()) break;
       +         }
              }
              list=FirstServer;
              while (list) {
       t@@ -923,7 +915,7 @@ void ServerLoop() {
        static GtkWidget *TextOutput;
        static gint ListenTag=0;
        static void SetSocketWriteTest(Player *Play,gboolean WriteTest);
       -static void GuiSetTimeouts();
       +static void GuiSetTimeouts(void);
        static time_t NextTimeout=0;
        static guint TimeoutTag=-1;
        
       t@@ -938,7 +930,7 @@ static gint GuiDoTimeouts(gpointer data) {
           return FALSE;
        }
        
       -void GuiSetTimeouts() {
       +void GuiSetTimeouts(void) {
           int MinTimeout;
           time_t TimeNow;
           TimeNow=time(NULL);
       t@@ -993,22 +985,21 @@ static void GuiDoCommand(GtkWidget *widget,gpointer data) {
        void GuiHandleMeta(gpointer data,gint socket,GdkInputCondition condition) {
           gboolean DoneOK;
           gchar *buf;
       -   static gboolean ReadingHeaders=TRUE;
        
       -   if (MetaNetBuf.WaitConnect) ReadingHeaders=TRUE;
       -   if (NetBufHandleNetwork(&MetaNetBuf,condition&GDK_INPUT_READ,
       +   if (!MetaConn) return;
       +   if (NetBufHandleNetwork(&MetaConn->NetBuf,condition&GDK_INPUT_READ,
                                   condition&GDK_INPUT_WRITE,&DoneOK)) {
       -      while ((buf=GetWaitingMessage(&MetaNetBuf))) {
       -         if (buf[0] || ReadingHeaders) {
       -            dopelog(ReadingHeaders ? 4 : 2,"MetaServer: %s",buf);
       +      while ((buf=ReadHttpResponse(MetaConn))) {
       +         gboolean ReadingBody = (MetaConn->Status==HS_READBODY);
       +         if (buf[0] || !ReadingBody) {
       +            dopelog(ReadingBody ? 2 : 4,"MetaServer: %s",buf);
                 }
       -         if (buf[0]==0) ReadingHeaders=FALSE;
                 g_free(buf);
              }
           }
           if (!DoneOK) {
              dopelog(4,"MetaServer: (closed)\n");
       -      ShutdownNetworkBuffer(&MetaNetBuf);
       +      CloseHttpConnection(MetaConn); MetaConn=NULL;
              gdk_input_remove(MetaInputTag);
              MetaInputTag=0;
              if (IsServerShutdown()) GuiQuitServer();