From 1b00f503c83cdcaf5b62e0d8c69194cef1958101 Mon Sep 17 00:00:00 2001 From: Timerix Date: Tue, 18 Nov 2025 16:01:39 +0500 Subject: [PATCH] implemented virtual logger --- dependencies/tlibc | 2 +- include/tcp-chat/log.h | 26 ++++++++++++++++ include/tcp-chat/server.h | 3 +- src/cli/ClientCLI/ClientCLI.c | 4 +-- src/cli/main.c | 24 ++++++++++++-- src/log.h | 8 ----- src/server/request_handlers/Login.c | 25 ++++++++++----- src/server/request_handlers/Register.c | 11 +++++-- .../request_handlers/ServerPublicInfo.c | 6 +++- .../request_handlers/request_handlers.h | 18 ++++++----- src/server/request_handlers/send_error.c | 31 ++++++++++--------- src/server/request_handlers/template | 3 ++ src/server/server.c | 23 +++++++++++--- src/server/server_internal.h | 6 ++++ 14 files changed, 139 insertions(+), 51 deletions(-) create mode 100644 include/tcp-chat/log.h delete mode 100644 src/log.h diff --git a/dependencies/tlibc b/dependencies/tlibc index bc41577..c68e4e8 160000 --- a/dependencies/tlibc +++ b/dependencies/tlibc @@ -1 +1 @@ -Subproject commit bc415772486c087abd9cac9b9f2dc2b5dd5e98db +Subproject commit c68e4e87b327ad21cd664e50ee2b5ef4ded3aed9 diff --git a/include/tcp-chat/log.h b/include/tcp-chat/log.h new file mode 100644 index 0000000..feb6f90 --- /dev/null +++ b/include/tcp-chat/log.h @@ -0,0 +1,26 @@ +#pragma once +#include +#include "tlibc/std.h" +#include "tlibc/string/cstr.h" + +typedef enum LogSeverity { + LogSeverity_Debug, + LogSeverity_Info, + LogSeverity_Warn, + LogSeverity_Error, +} LogSeverity; + +typedef void (*LogFunction_t)(void* logger, LogSeverity severity, cstr context, cstr msg); + +#define log(severity, context, format, ...) { \ + if(LOG_FUNC) { \ + char* ___log_msg = sprintf_malloc(format ,##__VA_ARGS__); \ + LOG_FUNC(LOGGER, severity, context, ___log_msg); \ + free(___log_msg); \ + } \ +} + +#define logDebug(context, format, ...) log(LogSeverity_Debug, context, format ,##__VA_ARGS__) +#define logInfo(context, format, ...) log(LogSeverity_Info, context, format ,##__VA_ARGS__) +#define logWarn(context, format, ...) log(LogSeverity_Warn, context, format ,##__VA_ARGS__) +#define logError(context, format, ...) log(LogSeverity_Error, context, format ,##__VA_ARGS__) diff --git a/include/tcp-chat/server.h b/include/tcp-chat/server.h index cb01343..630322f 100644 --- a/include/tcp-chat/server.h +++ b/include/tcp-chat/server.h @@ -1,9 +1,10 @@ #pragma once #include "tlibc/errors.h" #include "tlibc/string/str.h" +#include "tcp-chat/log.h" typedef struct Server Server; -Result(Server*) Server_createFromConfig(str config_str); +Result(Server*) Server_create(str config_str, void* logger, LogFunction_t log_func); void Server_free(Server* server); Result(void) Server_run(Server* server); diff --git a/src/cli/ClientCLI/ClientCLI.c b/src/cli/ClientCLI/ClientCLI.c index 57af3b4..0c22491 100644 --- a/src/cli/ClientCLI/ClientCLI.c +++ b/src/cli/ClientCLI/ClientCLI.c @@ -240,8 +240,8 @@ static Result(void) ClientCLI_saveServerInfo(ClientCLI* self, memcpy(si.desc, server_description.data, si.desc_len); si.desc[si.desc_len] = 0; - // TODO: check cred->server_address_id_cache_map - + // TODO: check server_address_id_cache_map + (void)self; // TODO: save server info to user's db Return RESULT_VOID; diff --git a/src/cli/main.c b/src/cli/main.c index 738da1b..ad3f081 100644 --- a/src/cli/main.c +++ b/src/cli/main.c @@ -1,6 +1,7 @@ #include "tlibc/tlibc.h" #include "tlibc/base64.h" #include "tlibc/filesystem.h" +#include "tlibc/time.h" #include "network/network.h" #include "cli/ClientCLI/ClientCLI.h" #include "server/server_internal.h" @@ -8,6 +9,8 @@ #define _DEFAULT_CONFIG_PATH_CLIENT "tcp-chat-client.config" #define _DEFAULT_CONFIG_PATH_SERVER "tcp-chat-server.config" +#define arg_is(LITERAL) str_equals(arg_str, STR(LITERAL)) + typedef enum ProgramMode { ClientMode, ServerMode, @@ -17,7 +20,24 @@ typedef enum ProgramMode { RandomBytesBase64, } ProgramMode; -#define arg_is(LITERAL) str_equals(arg_str, STR(LITERAL)) +static void log_func(void* logger, LogSeverity severity, cstr context, cstr msg){ + (void)logger; + + cstr severity_cstr; + switch(severity){ + default: severity_cstr = "INVALID_LOG_SEVERITY"; break; + case LogSeverity_Debug: severity_cstr = "DBUG"; break; + case LogSeverity_Info: severity_cstr = "INFO"; break; + case LogSeverity_Warn: severity_cstr = "WARN"; break; + case LogSeverity_Error: severity_cstr = "ERRR"; break; + } + + DateTime dt; + DateTime_getLocal(&dt); + + printf("[" FMT_DateTime_text "][%s/%s]: %s\n", DT_expand(dt), context, severity_cstr, msg); +} + int main(const int argc, cstr const* argv){ Deferral(32); @@ -163,7 +183,7 @@ int main(const int argc, cstr const* argv){ str config_str = Array_castTo_str(config_buf, false); config_buf.data = NULL; // init server - try_fatal(Server* server, p, Server_createFromConfig(config_str)); + try_fatal(Server* server, p, Server_create(config_str, NULL, log_func)); Defer(Server_free(server)); // manually close file and free config_buf file_close(config_file); diff --git a/src/log.h b/src/log.h deleted file mode 100644 index 36fc033..0000000 --- a/src/log.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once -#include - -#define log(context, severity, format, ...) printf("[%s/" severity "]: " format "\n", context ,##__VA_ARGS__) -#define logDebug(context, format, ...) log(context, "DEBUG", format ,##__VA_ARGS__) -#define logInfo(context, format, ...) log(context, "INFO", format ,##__VA_ARGS__) -#define logWarn(context, format, ...) log(context, "WARN", format ,##__VA_ARGS__) -#define logError(context, format, ...) log(context, "ERROR", format ,##__VA_ARGS__) diff --git a/src/server/request_handlers/Login.c b/src/server/request_handlers/Login.c index b7f2847..a1609d3 100644 --- a/src/server/request_handlers/Login.c +++ b/src/server/request_handlers/Login.c @@ -1,5 +1,7 @@ #include "request_handlers.h" +#define LOGGER server->logger +#define LOG_FUNC server->log_func declare_RequestHandler(Login) { @@ -12,8 +14,10 @@ declare_RequestHandler(Login) try_void(EncryptedSocketTCP_recvStruct(&conn->sock, &req)); if(conn->authorized){ - try_void(sendErrorMessage(log_ctx, false, conn, res_head, - STR("is logged in already"))); + try_void(sendErrorMessage(server, log_ctx, conn, res_head, + LogSeverity_Warn, + STR("is logged in already") + )); Return RESULT_VOID; } @@ -21,7 +25,10 @@ declare_RequestHandler(Login) str username_str = str_null; str username_check_error = validateUsername_cstr(req.username, &username_str); if(username_check_error.data){ - try_void(sendErrorMessage(log_ctx, false, conn, res_head, username_check_error)); + try_void(sendErrorMessage(server, log_ctx, conn, res_head, + LogSeverity_Warn, + username_check_error + )); Return RESULT_VOID; } @@ -41,9 +48,11 @@ declare_RequestHandler(Login) // try get id from name cache u64* id_ptr = HashMap_tryGetPtr(&server->users_name_id_map, username_str); if(id_ptr == NULL){ - try_void(sendErrorMessage_f(log_ctx, false, conn, res_head, + try_void(sendErrorMessage_f(server, log_ctx, conn, res_head, + LogSeverity_Warn, "Username '%s' is not registered\n", - username_str.data)); + username_str.data + )); Return RESULT_VOID; } u64 user_id = *id_ptr; @@ -54,8 +63,10 @@ declare_RequestHandler(Login) // validate token hash if(memcmp(token_hash, u->token_hash, sizeof(token_hash)) != 0){ - try_void(sendErrorMessage(log_ctx, false, conn, res_head, - STR("wrong password"))); + try_void(sendErrorMessage(server, log_ctx, conn, res_head, + LogSeverity_Warn, + STR("wrong password") + )); Return RESULT_VOID; } diff --git a/src/server/request_handlers/Register.c b/src/server/request_handlers/Register.c index 640383f..1d92769 100644 --- a/src/server/request_handlers/Register.c +++ b/src/server/request_handlers/Register.c @@ -1,5 +1,8 @@ #include "request_handlers.h" +#define LOGGER server->logger +#define LOG_FUNC server->log_func + declare_RequestHandler(Register) { Deferral(4); @@ -14,7 +17,10 @@ declare_RequestHandler(Register) str username_str = str_null; str username_check_error = validateUsername_cstr(req.username, &username_str); if(username_check_error.data){ - try_void(sendErrorMessage(log_ctx, false, conn, res_head, username_check_error)); + try_void(sendErrorMessage(server, log_ctx, conn, res_head, + LogSeverity_Warn, + username_check_error + )); Return RESULT_VOID; } @@ -25,7 +31,8 @@ declare_RequestHandler(Register) // check if name is taken if(HashMap_tryGetPtr(&server->users_name_id_map, username_str) != NULL){ - try_void(sendErrorMessage_f(log_ctx, false, conn, res_head, + try_void(sendErrorMessage_f(server, log_ctx, conn, res_head, + LogSeverity_Warn, "Username'%s' already exists\n", username_str.data)); Return RESULT_VOID; diff --git a/src/server/request_handlers/ServerPublicInfo.c b/src/server/request_handlers/ServerPublicInfo.c index 077bab4..1b2d951 100644 --- a/src/server/request_handlers/ServerPublicInfo.c +++ b/src/server/request_handlers/ServerPublicInfo.c @@ -1,5 +1,8 @@ #include "request_handlers.h" +#define LOGGER server->logger +#define LOG_FUNC server->log_func + declare_RequestHandler(ServerPublicInfo) { Deferral(4); @@ -14,7 +17,8 @@ declare_RequestHandler(ServerPublicInfo) Array(u8) content; switch(req.property){ default:{ - try_void(sendErrorMessage_f(log_ctx, false, conn, res_head, + try_void(sendErrorMessage_f(server, log_ctx, conn, res_head, + LogSeverity_Warn, "Unknown ServerPublicInfo property %u", req.property)); Return RESULT_VOID; diff --git a/src/server/request_handlers/request_handlers.h b/src/server/request_handlers/request_handlers.h index c4f5b8b..6d03e2b 100644 --- a/src/server/request_handlers/request_handlers.h +++ b/src/server/request_handlers/request_handlers.h @@ -1,24 +1,26 @@ #pragma once #include "network/tcp-chat-protocol/v1.h" #include "server/server_internal.h" -#include "log.h" -Result(void) sendErrorMessage(cstr log_ctx, bool logAsError, +Result(void) sendErrorMessage( + Server* server, cstr log_ctx, ClientConnection* conn, PacketHeader* res_head, - str msg); + LogSeverity log_severity, str msg); -Result(void) __sendErrorMessage_fv(cstr log_ctx, bool logAsError, +Result(void) __sendErrorMessage_fv( + Server* server, cstr log_ctx, ClientConnection* conn, PacketHeader* res_head, - cstr format, va_list argv); + LogSeverity log_severity, cstr format, va_list argv); -Result(void) sendErrorMessage_f(cstr log_ctx, bool logAsError, +Result(void) sendErrorMessage_f( + Server* server, cstr log_ctx, ClientConnection* conn, PacketHeader* res_head, - cstr format, ...) ATTRIBUTE_CHECK_FORMAT_PRINTF(5, 6); + LogSeverity log_severity, cstr format, ...) ATTRIBUTE_CHECK_FORMAT_PRINTF(6, 7); #define declare_RequestHandler(TYPE) \ - Result(void) handleRequest_##TYPE( \ + Result(void) handleRequest_##TYPE(\ Server* server, cstr log_ctx, cstr req_type_name, \ ClientConnection* conn, PacketHeader* req_head, PacketHeader* res_head) diff --git a/src/server/request_handlers/send_error.c b/src/server/request_handlers/send_error.c index a9027f0..06031c0 100644 --- a/src/server/request_handlers/send_error.c +++ b/src/server/request_handlers/send_error.c @@ -1,9 +1,12 @@ #include "request_handlers.h" -#include "log.h" -Result(void) sendErrorMessage(cstr log_ctx, bool logAsError, +#define LOGGER server->logger +#define LOG_FUNC server->log_func + +Result(void) sendErrorMessage( + Server* server, cstr log_ctx, ClientConnection* conn, PacketHeader* res_head, - str msg) + LogSeverity log_severity, str msg) { Deferral(1); @@ -11,11 +14,7 @@ Result(void) sendErrorMessage(cstr log_ctx, bool logAsError, if(msg.size > ERROR_MESSAGE_MAX_SIZE) msg.size = ERROR_MESSAGE_MAX_SIZE; - if(logAsError){ - logError(log_ctx, FMT_str, msg.size, msg.data); - } else { - logWarn(log_ctx, FMT_str, msg.size, msg.data); - } + log(log_severity, log_ctx, FMT_str, msg.size, msg.data); ErrorMessage res; ErrorMessage_construct(&res, res_head, msg.size); @@ -26,29 +25,31 @@ Result(void) sendErrorMessage(cstr log_ctx, bool logAsError, Return RESULT_VOID; } -Result(void) __sendErrorMessage_fv(cstr log_ctx, bool logAsError, - ClientConnection* conn, PacketHeader* res_head, - cstr format, va_list argv) +Result(void) __sendErrorMessage_fv( + Server* server, cstr log_ctx, + ClientConnection* conn, PacketHeader* res_head, + LogSeverity log_severity, cstr format, va_list argv) { Deferral(4); str msg = str_from_cstr(vsprintf_malloc(format, argv)); Defer(free(msg.data)); - try_void(sendErrorMessage(log_ctx, logAsError, conn, res_head, msg)); + try_void(sendErrorMessage(server, log_ctx, conn, res_head, log_severity, msg)); Return RESULT_VOID; } -Result(void) sendErrorMessage_f(cstr log_ctx, bool logAsError, +Result(void) sendErrorMessage_f( + Server* server, cstr log_ctx, ClientConnection* conn, PacketHeader* res_head, - cstr format, ...) + LogSeverity log_severity, cstr format, ...) { Deferral(1); va_list argv; va_start(argv, format); Defer(va_end(argv)); - try_void(__sendErrorMessage_fv(log_ctx, logAsError, conn, res_head, format, argv)); + try_void(__sendErrorMessage_fv(server, log_ctx, conn, res_head, log_severity, format, argv)); Return RESULT_VOID; } diff --git a/src/server/request_handlers/template b/src/server/request_handlers/template index 5e016b7..51caf71 100644 --- a/src/server/request_handlers/template +++ b/src/server/request_handlers/template @@ -1,5 +1,8 @@ #include "request_handlers.h" +#define LOGGER server->logger +#define LOG_FUNC server->log_func + declare_RequestHandler(NAME) { Deferral(4); diff --git a/src/server/server.c b/src/server/server.c index 7fbb2a7..f08706b 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -4,7 +4,6 @@ #include "tlibc/base64.h" #include "server/server_internal.h" #include "config.h" -#include "log.h" #include "network/tcp-chat-protocol/v1.h" #include "server/request_handlers/request_handlers.h" @@ -26,15 +25,22 @@ void Server_free(Server* self){ HashMap_destroy(&self->users_name_id_map); } -Result(Server*) Server_createFromConfig(str config_str){ + +#define LOGGER logger +#define LOG_FUNC log_func + +Result(Server*) Server_create(str config_str, void* logger, LogFunction_t log_func){ Deferral(16); cstr log_ctx = "ServerInit"; - logInfo(log_ctx, "parsing config"); Server* server = (Server*)malloc(sizeof(Server)); memset(server, 0, sizeof(Server)); bool success = false; Defer(if(!success) Server_free(server)); + + server->logger = logger; + server->log_func = log_func; + logDebug(log_ctx, "parsing config"); // parse name str tmp_str = str_null; @@ -103,6 +109,11 @@ Result(Server*) Server_createFromConfig(str config_str){ Return RESULT_VALUE(p, server); } +#undef LOGGER +#undef LOG_FUNC +#define LOGGER server->logger +#define LOG_FUNC server->log_func + Result(void) Server_run(Server* server){ Deferral(16); cstr log_ctx = "ListenerThread"; @@ -133,8 +144,10 @@ Result(void) Server_run(Server* server){ Return RESULT_VOID; } + static void* handleConnection(void* _args){ ConnectionHandlerArgs* args = (ConnectionHandlerArgs*)_args; + Server* server = args->server; char log_ctx[64]; sprintf(log_ctx, "Session-"FMT_x64, args->session_id); @@ -155,6 +168,7 @@ static void* handleConnection(void* _args){ static Result(void) try_handleConnection(ConnectionHandlerArgs* args, cstr log_ctx){ Deferral(16); + Server* server = args->server; ClientConnection* conn = NULL; // establish encrypted connection try(conn, p, ClientConnection_accept(args)); @@ -174,7 +188,8 @@ static Result(void) try_handleConnection(ConnectionHandlerArgs* args, cstr log_c switch(req_head.type){ // send error message and close connection default: - try_void(sendErrorMessage_f(log_ctx, false, conn, &res_head, + try_void(sendErrorMessage_f(server, log_ctx, conn, &res_head, + LogSeverity_Error, "Received unexpected packet of type %u", req_head.type)); Return RESULT_VOID; diff --git a/src/server/server_internal.h b/src/server/server_internal.h index 243a3cc..abc79d7 100644 --- a/src/server/server_internal.h +++ b/src/server/server_internal.h @@ -12,6 +12,11 @@ typedef struct ClientConnection ClientConnection; typedef struct Server { + /* from constructor */ + void* logger; + LogFunction_t log_func; + + /* from config */ str name; str description; u64 landing_channel_id; @@ -19,6 +24,7 @@ typedef struct Server { br_rsa_private_key rsa_sk; br_rsa_public_key rsa_pk; + /* database and cache */ IncrementalDB* db; Table* db_users_table; pthread_mutex_t users_cache_mutex;