+static qboolean NetConn_BuildStatusResponse(const char* challenge, char* out_msg, size_t out_size, qboolean fullstatus)
+{
+ unsigned int nb_clients = 0, i;
+ int length;
+
+ // How many clients are there?
+ for (i = 0;i < (unsigned int)svs.maxclients;i++)
+ if (svs.clients[i].active)
+ nb_clients++;
+
+ // TODO: we should add more information for the full status string
+ length = dpsnprintf(out_msg, out_size,
+ "\377\377\377\377%s\x0A"
+ "\\gamename\\%s\\modname\\%s\\sv_maxclients\\%d"
+ "\\clients\\%d\\mapname\\%s\\hostname\\%s""\\protocol\\%d"
+ "%s%s"
+ "%s",
+ fullstatus ? "statusResponse" : "infoResponse",
+ gamename, com_modname, svs.maxclients,
+ nb_clients, sv.name, hostname.string, NET_PROTOCOL_VERSION,
+ challenge ? "\\challenge\\" : "", challenge ? challenge : "",
+ fullstatus ? "\n" : "");
+
+ // Make sure it fits in the buffer
+ if (length < 0)
+ return false;
+
+ if (fullstatus)
+ {
+ char *ptr;
+ int left;
+
+ ptr = out_msg + length;
+ left = out_size - length;
+
+ for (i = 0;i < (unsigned int)svs.maxclients;i++)
+ {
+ client_t *cl = &svs.clients[i];
+ if (cl->active)
+ {
+ int nameind, cleanind;
+ char curchar;
+ char cleanname [sizeof(cl->name)];
+
+ // Remove all characters '"' and '\' in the player name
+ nameind = 0;
+ cleanind = 0;
+ do
+ {
+ curchar = cl->name[nameind++];
+ if (curchar != '"' && curchar != '\\')
+ {
+ cleanname[cleanind++] = curchar;
+ if (cleanind == sizeof(cleanname) - 1)
+ break;
+ }
+ } while (curchar != '\0');
+
+ length = dpsnprintf(ptr, left, "%d %d \"%s\"\n",
+ cl->frags,
+ (int)(cl->ping * 1000.0f),
+ cleanname);
+ if(length < 0)
+ return false;
+ left -= length;
+ ptr += length;
+ }
+ }
+ }
+
+ return true;
+}
+