added tlibtoml submodule

This commit is contained in:
2025-11-27 01:46:44 +05:00
parent f5169e8a8f
commit c263d02b36
15 changed files with 108 additions and 95 deletions

View File

@@ -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))

View File

@@ -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));

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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...");