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 */