added tlibtoml submodule
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
#include "modes/modes.h"
|
||||
|
||||
#define _DEFAULT_CONFIG_PATH_CLIENT "tcp-chat-client.config"
|
||||
#define _DEFAULT_CONFIG_PATH_SERVER "tcp-chat-server.config"
|
||||
#define _DEFAULT_CONFIG_PATH_SERVER "tcp-chat-server.toml"
|
||||
|
||||
#define arg_is(LITERAL) str_equals(arg_str, STR(LITERAL))
|
||||
|
||||
|
||||
@@ -67,10 +67,9 @@ Result(void) run_ServerMode(cstr config_path) {
|
||||
Defer(file_close(config_file));
|
||||
|
||||
// read whole file into str
|
||||
Array(u8) config_buf = Array_u8_construct(NULL, 0);
|
||||
try_void(file_readWhole(config_file, &config_buf));
|
||||
Defer(Array_u8_destroy(&config_buf));
|
||||
str config_str = Array_u8_castTo_str(config_buf, false);
|
||||
str config_file_content = str_null;
|
||||
try_void(file_readWholeText(config_file, &config_file_content));
|
||||
Defer(str_destroy(config_file_content));
|
||||
|
||||
// create logger
|
||||
ServerLogger logger;
|
||||
@@ -78,14 +77,19 @@ Result(void) run_ServerMode(cstr config_path) {
|
||||
Defer(ServerLogger_destroy(&logger));
|
||||
|
||||
// init server
|
||||
try(Server* server, p, Server_create(config_str, &logger, log_func));
|
||||
try(Server* server, p,
|
||||
Server_create(
|
||||
config_file_content, config_path,
|
||||
&logger, log_func
|
||||
)
|
||||
);
|
||||
Defer(Server_free(server));
|
||||
|
||||
// manually close file and free config_buf
|
||||
file_close(config_file);
|
||||
config_file = NULL;
|
||||
Array_u8_destroy(&config_buf);
|
||||
config_buf.data = NULL;
|
||||
str_destroy(config_file_content);
|
||||
config_file_content.data = NULL;
|
||||
|
||||
// start infinite loop on main thread
|
||||
try_void(Server_run(server));
|
||||
|
||||
34
src/config.c
34
src/config.c
@@ -1,34 +0,0 @@
|
||||
#include "config.h"
|
||||
|
||||
Result(void) config_findValue(str config_str, str key, str* value, bool throwNotFoundError){
|
||||
u32 line_n = 0;
|
||||
while(config_str.len > 0){
|
||||
line_n++;
|
||||
i32 line_end = str_seekChar(config_str, '\n', 0);
|
||||
if(line_end < 0)
|
||||
line_end = config_str.len - 1;
|
||||
str line = str_sliceBefore(config_str, line_end);
|
||||
config_str = str_sliceAfter(config_str, line_end + 1);
|
||||
|
||||
i32 sep_pos = str_seekChar(line, '=', 1);
|
||||
if(sep_pos < 0){
|
||||
//not a 'key = value' line
|
||||
continue;
|
||||
}
|
||||
|
||||
str line_key = str_sliceBefore(line, sep_pos - 1);
|
||||
str_trim(&line_key, false);
|
||||
if(str_equals(line_key, key)){
|
||||
str line_value = str_sliceAfter(line, sep_pos + 1);
|
||||
str_trim(&line_value, false);
|
||||
*value = line_value;
|
||||
return RESULT_VOID;
|
||||
}
|
||||
}
|
||||
|
||||
if(throwNotFoundError){
|
||||
char* err_msg = sprintf_malloc("can't find key '"FMT_str"'", key.len, key.data);
|
||||
return RESULT_ERROR(err_msg, true);
|
||||
}
|
||||
return RESULT_VOID;
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
#pragma once
|
||||
#include "tlibc/errors.h"
|
||||
#include "tlibc/string/str.h"
|
||||
|
||||
/// searches for pattern `key = value`
|
||||
Result(void) config_findValue(str config_str, str key, str* value, bool throwNotFoundError);
|
||||
@@ -3,9 +3,9 @@
|
||||
#include "tlibc/time.h"
|
||||
#include "tlibc/base64.h"
|
||||
#include "server/server_internal.h"
|
||||
#include "config.h"
|
||||
#include "network/tcp-chat-protocol/v1.h"
|
||||
#include "server/responses/responses.h"
|
||||
#include "tlibtoml.h"
|
||||
|
||||
static void* handleConnection(void* _args);
|
||||
static Result(void) try_handleConnection(ConnectionHandlerArgs* args, cstr log_ctx);
|
||||
@@ -36,7 +36,9 @@ void Server_free(Server* self){
|
||||
#define LOG_FUNC log_func
|
||||
#define LOG_CONTEXT log_ctx
|
||||
|
||||
Result(Server*) Server_create(str config_str, void* logger, LogFunction_t log_func){
|
||||
Result(Server*) Server_create(str config_file_content, cstr config_file_name,
|
||||
void* logger, LogFunction_t log_func)
|
||||
{
|
||||
Deferral(16);
|
||||
cstr log_ctx = "ServerInit";
|
||||
|
||||
@@ -47,53 +49,48 @@ Result(Server*) Server_create(str config_str, void* logger, LogFunction_t log_fu
|
||||
|
||||
self->logger = logger;
|
||||
self->log_func = log_func;
|
||||
|
||||
logDebug("parsing config");
|
||||
try(TomlTable* config_toml, p, toml_load_str_filename(config_file_content, config_file_name));
|
||||
Defer(TomlTable_free(config_toml));
|
||||
|
||||
// parse name
|
||||
str tmp_str = str_null;
|
||||
try_void(config_findValue(config_str, STR("name"), &tmp_str, true));
|
||||
self->name = str_copy(tmp_str);
|
||||
try(str* v_name, p, TomlTable_get_str(config_toml, STR("name")));
|
||||
self->name = str_copy(*v_name);
|
||||
|
||||
// parse description
|
||||
try_void(config_findValue(config_str, STR("description"), &tmp_str, true));
|
||||
self->description = str_copy(tmp_str);
|
||||
try(str* v_desc, p, TomlTable_get_str(config_toml, STR("description")));
|
||||
self->description = str_copy(*v_desc);
|
||||
|
||||
// parse landing_channel_id
|
||||
try_void(config_findValue(config_str, STR("landing_channel_id"), &tmp_str, true));
|
||||
char* lci_cstr = str_copy(tmp_str).data;
|
||||
Defer(free(lci_cstr));
|
||||
if(sscanf(lci_cstr, FMT_u64, &self->landing_channel_id) != 1){
|
||||
Return RESULT_ERROR("can't parse 'landing_channel_id' value as number", false);
|
||||
}
|
||||
try(i64 v_landing_channel_id, i, TomlTable_get_integer(config_toml, STR("landing_channel_id")));
|
||||
self->landing_channel_id = v_landing_channel_id;
|
||||
|
||||
// parse local_address
|
||||
try_void(config_findValue(config_str, STR("local_address"), &tmp_str, true));
|
||||
char* local_end_cstr = str_copy(tmp_str).data;
|
||||
Defer(free(local_end_cstr));
|
||||
try_void(EndpointIPv4_parse(local_end_cstr, &self->local_end));
|
||||
try(str* v_local_address, p, TomlTable_get_str(config_toml, STR("local_address")));
|
||||
try_assert(v_local_address->isZeroTerminated);
|
||||
try_void(EndpointIPv4_parse(v_local_address->data, &self->local_end));
|
||||
|
||||
// parse rsa_private_key
|
||||
try_void(config_findValue(config_str, STR("rsa_private_key"), &tmp_str, true));
|
||||
char* sk_base64_cstr = str_copy(tmp_str).data;
|
||||
Defer(free(sk_base64_cstr));
|
||||
try(str* v_rsa_sk, p, TomlTable_get_str(config_toml, STR("rsa_private_key")));
|
||||
try_assert(v_rsa_sk->isZeroTerminated);
|
||||
try_void(RSA_parsePrivateKey_base64(v_rsa_sk->data, &self->rsa_sk));
|
||||
|
||||
// parse rsa_public_key
|
||||
try_void(config_findValue(config_str, STR("rsa_public_key"), &tmp_str, true));
|
||||
char* pk_base64_cstr = str_copy(tmp_str).data;
|
||||
Defer(free(pk_base64_cstr));
|
||||
|
||||
try_void(RSA_parsePrivateKey_base64(sk_base64_cstr, &self->rsa_sk));
|
||||
try_void(RSA_parsePublicKey_base64(pk_base64_cstr, &self->rsa_pk));
|
||||
try(str* v_rsa_pk, p, TomlTable_get_str(config_toml, STR("rsa_public_key")));
|
||||
try_assert(v_rsa_pk->isZeroTerminated);
|
||||
try_void(RSA_parsePublicKey_base64(v_rsa_pk->data, &self->rsa_pk));
|
||||
|
||||
// parse db_aes_key
|
||||
try_void(config_findValue(config_str, STR("db_aes_key"), &tmp_str, true));
|
||||
Array(u8) db_aes_key = Array_u8_alloc(base64_decodedSize(tmp_str.data, tmp_str.len));
|
||||
try(str* v_db_aes_key, p, TomlTable_get_str(config_toml, STR("db_aes_key")));
|
||||
str db_aes_key_s = *v_db_aes_key;
|
||||
Array(u8) db_aes_key = Array_u8_alloc(base64_decodedSize(db_aes_key_s.data, db_aes_key_s.len));
|
||||
Defer(free(db_aes_key.data));
|
||||
base64_decode(tmp_str.data, tmp_str.len, db_aes_key.data);
|
||||
base64_decode(db_aes_key_s.data, db_aes_key_s.len, db_aes_key.data);
|
||||
|
||||
// parse db_dir and open db
|
||||
try_void(config_findValue(config_str, STR("db_dir"), &tmp_str, true));
|
||||
try(self->db, p, idb_open(tmp_str, db_aes_key));
|
||||
try(str* v_db_dir, p, TomlTable_get_str(config_toml, STR("db_dir")));
|
||||
try(self->db, p, idb_open(*v_db_dir, db_aes_key));
|
||||
|
||||
// build users cache
|
||||
logDebug("loading users...");
|
||||
|
||||
Reference in New Issue
Block a user