diff --git a/include/logging/logging_t.h b/include/logging/logging_t.h index 8c8c5de..939ae67 100644 --- a/include/logging/logging_t.h +++ b/include/logging/logging_t.h @@ -1,16 +1,33 @@ -// This file can be replaced with other logging system integration +#pragma once -#ifndef LOGGING_T_H_ -#define LOGGING_T_H_ +typedef enum { + COSIGNER_LOG_LEVEL_FATAL = 50000, + COSIGNER_LOG_LEVEL_ERROR = 40000, + COSIGNER_LOG_LEVEL_WARN = 30000, + COSIGNER_LOG_LEVEL_INFO = 20000, + COSIGNER_LOG_LEVEL_DEBUG = 10000, + COSIGNER_LOG_LEVEL_TRACE = 5000, +} COSIGNER_LOG_LEVEL; -#include +typedef void (*cosigner_log_callback)(int level, const char* file, int line, const char* func, const char* message, void* userp); -#define LOG(level, message, ...) do {printf((message), ##__VA_ARGS__);putchar('\n');} while(0) -#define LOG_DEBUG(message, ...) do {printf((message), ##__VA_ARGS__);putchar('\n');} while(0) -#define LOG_TRACE(message, ...) do {printf((message), ##__VA_ARGS__);putchar('\n');} while(0) -#define LOG_INFO(message, ...) do {printf((message), ##__VA_ARGS__);putchar('\n');} while(0) -#define LOG_WARN(message, ...) do {printf((message), ##__VA_ARGS__);putchar('\n');} while(0) -#define LOG_ERROR(message, ...) do {fprintf(stderr, (message), ##__VA_ARGS__);putchar('\n');} while(0) -#define LOG_FATAL(message, ...) do {fprintf(stderr, (message), ##__VA_ARGS__);putchar('\n');} while(0) +#ifdef __cplusplus +extern "C" { +#endif //__cplusplus -#endif +void cosigner_log_init(cosigner_log_callback cb, void* userp); + +void cosigner_log_msg(int level, const char* file, int line, const char* func, const char* message, ...) + __attribute__ ((format (printf, 5, 6))); + +#ifdef __cplusplus +} +#endif //__cplusplus + +#define LOG(level, message, ...) cosigner_log_msg((level), __FILE__, __LINE__, __func__, (message), ##__VA_ARGS__) +#define LOG_TRACE(message, ...) LOG(COSIGNER_LOG_LEVEL_TRACE, message, ##__VA_ARGS__) +#define LOG_DEBUG(message, ...) LOG(COSIGNER_LOG_LEVEL_DEBUG, message, ##__VA_ARGS__) +#define LOG_INFO(message, ...) LOG(COSIGNER_LOG_LEVEL_INFO, message, ##__VA_ARGS__) +#define LOG_WARN(message, ...) LOG(COSIGNER_LOG_LEVEL_WARN, message, ##__VA_ARGS__) +#define LOG_ERROR(message, ...) LOG(COSIGNER_LOG_LEVEL_ERROR, message, ##__VA_ARGS__) +#define LOG_FATAL(message, ...) LOG(COSIGNER_LOG_LEVEL_FATAL, message, ##__VA_ARGS__) diff --git a/src/common/Makefile b/src/common/Makefile index cd68bb6..d1eb327 100644 --- a/src/common/Makefile +++ b/src/common/Makefile @@ -11,9 +11,9 @@ endif COMMON_CFLAGS := $(COMMON_CFLAGS) C_Files := crypto/shamir_secret_sharing/verifiable_secret_sharing.c crypto/paillier/paillier.c crypto/paillier/paillier_zkp.c crypto/GFp_curve_algebra/GFp_curve_algebra.c \ - crypto/commitments/commitments.c crypto/zero_knowledge_proof/schnorr.c crypto/zero_knowledge_proof/range_proofs.c crypto/zero_knowledge_proof/diffie_hellman_log.c \ - crypto/commitments/ring_pedersen.c crypto/ed25519_algebra/ed25519_algebra.c crypto/drng/drng.c crypto/keccak1600/keccak1600.c - + crypto/commitments/commitments.c crypto/zero_knowledge_proof/schnorr.c crypto/zero_knowledge_proof/range_proofs.c crypto/zero_knowledge_proof/diffie_hellman_log.c \ + crypto/commitments/ring_pedersen.c crypto/ed25519_algebra/ed25519_algebra.c crypto/drng/drng.c crypto/keccak1600/keccak1600.c logging/logging_t.c + C_Objects := $(C_Files:.c=.o) Cpp_Files := cosigner/cosigner_exception.cpp cosigner/cmp_setup_service.cpp cosigner/cmp_offline_refresh_service.cpp cosigner/utils.cpp \ diff --git a/src/common/lib.lds b/src/common/lib.lds index b4d420f..d52fbff 100644 --- a/src/common/lib.lds +++ b/src/common/lib.lds @@ -14,6 +14,7 @@ libcosigner.so range_proof_*; schnorr_zkp_*; derive_*; + cosigner_log_*; _ZN10fireblocks6common8cosigner17*; _ZN10fireblocks6common8cosigner2*; _ZN10fireblocks6common8cosigner32*; diff --git a/src/common/logging/logging_t.c b/src/common/logging/logging_t.c new file mode 100644 index 0000000..ec1da77 --- /dev/null +++ b/src/common/logging/logging_t.c @@ -0,0 +1,46 @@ +#include "logging/logging_t.h" + +#include +#include + +#define MAX_LOG_SIZE 4096 + +static void default_log_callback(int level, const char* file, int line, const char* func, const char* message, void* userp) +{ + (void)file; + (void)line; + (void)func; + (void)userp; + + if (level >= COSIGNER_LOG_LEVEL_ERROR) + fprintf(stderr, "%s\n", message); + else + printf("%s\n", message); +} + +static cosigner_log_callback log_callback = default_log_callback; +static void* log_callback_user_data_pointer = NULL; + +void cosigner_log_init(cosigner_log_callback cb, void* userp) +{ + log_callback = cb; + log_callback_user_data_pointer = userp; +} + +void cosigner_log_msg(int level, const char* file, int line, const char* func, const char* message, ...) +{ + va_list args; + char buffer[MAX_LOG_SIZE] = { '\0' }; + + if (log_callback == NULL) + return; + + if (message != NULL) + { + va_start(args, message); + vsnprintf(buffer, MAX_LOG_SIZE, message, args); + va_end(args); + } + + log_callback(level, file, line, func, buffer, log_callback_user_data_pointer); +}