/** * Create a path to the per-player settings directory. * @param path * Path inside the per-player settings directory. * @return * New path. Must be freed. */ char *file_path_player(const char *path) { StringBuffer *sb; HARD_ASSERT(path != NULL); sb = file_path_server_internal(); SOFT_ASSERT_LABEL(*cpl.account != '\0', done, "Account name is empty."); SOFT_ASSERT_LABEL(*cpl.name != '\0', done, "Player name is empty."); stringbuffer_append_printf(sb, "%s/%s/%s", cpl.account, cpl.name, path); done: return stringbuffer_finish(sb); }
/** * Parse a single metaserver data node within a 'server' node. * * @param node * The data node. * @param server * Allocated server structure. * @return * True on success, false on failure. */ static bool parse_metaserver_data_node (xmlNodePtr node, server_struct *server) { HARD_ASSERT(node != NULL); HARD_ASSERT(server != NULL); xmlChar *content = xmlNodeGetContent(node); SOFT_ASSERT_LABEL(content != NULL && *content != '\0', error, "Parsing error"); if (XML_STR_EQUAL(node->name, "Hostname")) { SOFT_ASSERT_LABEL(server->hostname == NULL, error, "Parsing error"); server->hostname = estrdup((const char *) content); } else if (XML_STR_EQUAL(node->name, "Port")) { SOFT_ASSERT_LABEL(server->port == 0, error, "Parsing error"); server->port = atoi((const char *) content); } else if (XML_STR_EQUAL(node->name, "PortCrypto")) { SOFT_ASSERT_LABEL(server->port_crypto == -1, error, "Parsing error"); server->port_crypto = atoi((const char *) content); } else if (XML_STR_EQUAL(node->name, "Name")) { SOFT_ASSERT_LABEL(server->name == NULL, error, "Parsing error"); server->name = estrdup((const char *) content); } else if (XML_STR_EQUAL(node->name, "PlayersCount")) { SOFT_ASSERT_LABEL(server->player == 0, error, "Parsing error"); server->player = atoi((const char *) content); } else if (XML_STR_EQUAL(node->name, "Version")) { SOFT_ASSERT_LABEL(server->version == NULL, error, "Parsing error"); server->version = estrdup((const char *) content); } else if (XML_STR_EQUAL(node->name, "TextComment")) { SOFT_ASSERT_LABEL(server->desc == NULL, error, "Parsing error"); server->desc = estrdup((const char *) content); } else if (XML_STR_EQUAL(node->name, "CertificatePublicKey")) { SOFT_ASSERT_LABEL(server->cert_pubkey == NULL, error, "Parsing error"); server->cert_pubkey = estrdup((const char *) content); } else if (XML_STR_EQUAL(node->name, "Certificate")) { SOFT_ASSERT_LABEL(server->cert == NULL, error, "Parsing error"); server->cert = estrdup((const char *) content); } else if (XML_STR_EQUAL(node->name, "CertificateSignature")) { SOFT_ASSERT_LABEL(server->cert_sig == NULL, error, "Parsing error"); unsigned char *sig; size_t sig_len; if (!math_base64_decode((const char *) content, &sig, &sig_len)) { LOG(ERROR, "Error decoding BASE64 certificate signature"); goto error; } server->cert_sig = sig; server->cert_sig_len = sig_len; } else { LOG(DEVEL, "Unrecognized node: %s", (const char *) node->name); } bool ret = true; goto out; error: ret = false; out: if (content != NULL) { xmlFree(content); } return ret; }