tReport metaserver errors with GError - 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 a2b557a74595793a733876f6164e1cce5df1e3a2
 (DIR) parent 0eda1a10d2f68195b4e12ec9c938f59100b6099b
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Mon,  2 Nov 2020 22:16:26 -0800
       
       Report metaserver errors with GError
       
       Diffstat:
         M src/curses_client/curses_client.c   |      16 +++++++---------
         M src/gui_client/newgamedia.c         |      13 +++++++++++--
         M src/message.c                       |      31 +++++++++++++++++++++----------
         M src/message.h                       |      13 ++++++++++++-
       
       4 files changed, 51 insertions(+), 22 deletions(-)
       ---
 (DIR) diff --git a/src/curses_client/curses_client.c b/src/curses_client/curses_client.c
       t@@ -421,12 +421,14 @@ static gboolean SelectServerFromMetaServer(Player *Play, GString *errstr)
              g_string_assign(errstr, merr);
              return FALSE;
            } else if (still_running == 0) {
       -      merr = HandleWaitingMetaServerData(&MetaConn, &ServerList);
       -      CloseCurlConnection(&MetaConn);
       -      if (merr) {
       -        g_string_assign(errstr, merr);
       -        return FALSE;
       +      GError *tmp_error = NULL;
       +      if (!HandleWaitingMetaServerData(&MetaConn, &ServerList, &tmp_error)) {
       +        CloseCurlConnection(&MetaConn);
       +        g_string_assign(errstr, tmp_error->message);
       +        g_error_free(tmp_error);
       +        return FALSE;
              }
       +      CloseCurlConnection(&MetaConn);
              break;
            }
          }
       t@@ -486,10 +488,6 @@ static gboolean SelectServerFromMetaServer(Player *Play, GString *errstr)
              break;
            }
          }
       -  if (!ServerList) {
       -    g_string_assign(errstr, "No servers listed on metaserver");
       -    return FALSE;
       -  }
          clear_line(top + 1);
          refresh();
          g_string_free(text, TRUE);
 (DIR) diff --git a/src/gui_client/newgamedia.c b/src/gui_client/newgamedia.c
       t@@ -124,14 +124,23 @@ static gboolean glib_socket(GIOChannel *ch, GIOCondition condition, gpointer dat
          if (g->still_running) {
            return TRUE;
          } else {
       +    GError *tmp_error = NULL;
            fprintf(stderr, "got data %s\n", stgam.MetaConn->data);
            fprintf(stderr, "last transfer done, kill timeout\n");
            if (g->timer_event) {
              g_source_remove(g->timer_event);
              g->timer_event = 0;
            }
       -    HandleWaitingMetaServerData(stgam.MetaConn, &stgam.NewMetaList);
       -    SetStartGameStatus(NULL);
       +    if (!HandleWaitingMetaServerData(stgam.MetaConn, &stgam.NewMetaList,
       +                                     &tmp_error)) {
       +      char *str = g_strdup_printf(_("Status: ERROR: %s"), tmp_error->message);
       +      SetStartGameStatus(str);
       +      g_free(str);
       +      g_error_free(tmp_error);
       +    } else {
       +      SetStartGameStatus(NULL);
       +    }
       +
            CloseCurlConnection(stgam.MetaConn);
            FillMetaServerList(TRUE);
            return FALSE;
 (DIR) diff --git a/src/message.c b/src/message.c
       t@@ -439,7 +439,13 @@ const char *OpenMetaHttpConnection(CurlConnection *conn)
          return errstr;
        }
        
       -const char *HandleWaitingMetaServerData(CurlConnection *conn, GSList **listpt)
       +GQuark dope_meta_error_quark(void)
       +{
       +  return g_quark_from_static_string("dope-meta-error-quark");
       +}
       +
       +gboolean HandleWaitingMetaServerData(CurlConnection *conn, GSList **listpt,
       +                                     GError **err)
        {
          char *msg;
        
       t@@ -447,14 +453,14 @@ const char *HandleWaitingMetaServerData(CurlConnection *conn, GSList **listpt)
        
          msg = conn->data;
          /* This should be the first line of the body, the "MetaServer:" line */
       -  if (!msg) return NULL;
       -  if (strlen(msg) >= 14 && strncmp(msg, "FATAL ERROR:", 12) == 0) {
       -          //todo
       -/*  SetError(&conn->NetBuf.error, &ETMeta, MEC_INTERNAL,
       -             g_strdup(&msg[13]));*/
       -  } else if (strncmp(msg, "MetaServer:", 11) != 0) {
       -          //todo
       -/*  SetError(&conn->NetBuf.error, &ETMeta, MEC_BADREPLY, g_strdup(msg));*/
       +  if (msg && strlen(msg) >= 14 && strncmp(msg, "FATAL ERROR:", 12) == 0) {
       +    g_set_error(err, DOPE_META_ERROR, DOPE_META_ERROR_INTERNAL,
       +                _("Internal metaserver error \"%s\""), &msg[13]);
       +    return FALSE;
       +  } else if (msg && strncmp(msg, "MetaServer:", 11) != 0) {
       +    g_set_error(err, DOPE_META_ERROR, DOPE_META_ERROR_BAD_REPLY,
       +                _("Bad metaserver reply \"%s\""), msg);
       +    return FALSE;
          }
        
          msg = CurlNextLine(conn, msg);
       t@@ -483,7 +489,12 @@ const char *HandleWaitingMetaServerData(CurlConnection *conn, GSList **listpt)
              *listpt = g_slist_append(*listpt, NewServer);
            }
          }
       -  return NULL;
       +  if (!*listpt) {
       +    g_set_error_literal(err, DOPE_META_ERROR, DOPE_META_ERROR_EMPTY,
       +                        _("No servers listed on metaserver"));
       +    return FALSE;
       +  }
       +  return TRUE;
        }
        
        void ClearServerList(GSList **listpt)
 (DIR) diff --git a/src/message.h b/src/message.h
       t@@ -76,6 +76,16 @@ void SendPrintMessage(Player *From, AICode AI, Player *To, char *Data);
        void SendQuestion(Player *From, AICode AI, Player *To, char *Data);
        
        #ifdef NETWORKING
       +#define DOPE_META_ERROR dope_meta_error_quark()
       +
       +typedef enum {
       +  DOPE_META_ERROR_EMPTY,     /* No servers listed on metaserver */
       +  DOPE_META_ERROR_INTERNAL,  /* Internal metaserver error */
       +  DOPE_META_ERROR_BAD_REPLY  /* Bad reply from metaserver */
       +} DopeMetaError;
       +
       +GQuark dope_meta_error_quark(void);
       +
        gboolean PlayerHandleNetwork(Player *Play, gboolean ReadReady,
                                     gboolean WriteReady, gboolean *DoneOK);
        gboolean ReadPlayerDataFromWire(Player *Play);
       t@@ -84,7 +94,8 @@ gboolean WritePlayerDataToWire(Player *Play);
        gchar *GetWaitingPlayerMessage(Player *Play);
        
        const char *OpenMetaHttpConnection(CurlConnection *conn);
       -const char *HandleWaitingMetaServerData(CurlConnection *conn, GSList **listpt);
       +gboolean HandleWaitingMetaServerData(CurlConnection *conn, GSList **listpt,
       +                                     GError **err);
        void ClearServerList(GSList **listpt);
        #endif /* NETWORKING */