diff --git a/3rdparty/cuttdb/src/cdb_errno.c b/3rdparty/cuttdb/src/cdb_errno.c index 432d154ac4dba8d8a3879b16905ae69468c58094..0e9765acce186a2a0dc3c83260e6c10d884b613a 100644 --- a/3rdparty/cuttdb/src/cdb_errno.c +++ b/3rdparty/cuttdb/src/cdb_errno.c @@ -22,7 +22,7 @@ int cdb_errno(CDB *db) { - return (long)pthread_getspecific(*(pthread_key_t*)db->errkey); + return (size_t)pthread_getspecific(*(pthread_key_t*)db->errkey); } const char *cdb_errmsg(int ecode) @@ -71,7 +71,7 @@ void cdb_seterrcb(CDB *db, CDB_ERRCALLBACK errcb, void *arg) void cdb_seterrno(CDB *db, int ecode, const char *source, int line) { - pthread_setspecific(*(pthread_key_t*)db->errkey, (void*)(long)ecode); + pthread_setspecific(*(pthread_key_t*)db->errkey, (void*)(size_t)ecode); if (ecode != CDB_SUCCESS && db->errcb) { db->errcb(db->errcbarg, ecode, source, line); } diff --git a/CMakeLists.txt b/CMakeLists.txt index 166602366471d27e48e4f13187b94e9ee26852dc..eb274c7fb471e5c6bdb7bbda2eb021d4d2aac96d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 3.0) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "3.0-6") +set(CELLFRAME_SDK_NATIVE_VERSION "3.0-7") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") message("Cellframe modules: ${CELLFRAME_MODULES}") diff --git a/cmake/OS_Detection.cmake b/cmake/OS_Detection.cmake index df005742c04124f02e6a8ecb47b3b9218d828b79..a4d15a653c13b2ca287431446ce10a78a93c5679 100644 --- a/cmake/OS_Detection.cmake +++ b/cmake/OS_Detection.cmake @@ -45,6 +45,7 @@ message(STATUS "[*] Building for a ${ARCH_WIDTH}-bit system") if(UNIX) add_definitions ("-DDAP_OS_UNIX") if (APPLE) + EXECUTE_PROCESS( COMMAND whoami COMMAND tr -d '\n' OUTPUT_VARIABLE L_USER) EXECUTE_PROCESS( COMMAND echo -n /Users/${L_USER} OUTPUT_VARIABLE L_USERDIR_PATH) set (USERDIR_PATH "${L_USERDIR_PATH}") @@ -61,10 +62,12 @@ if(UNIX) OUTPUT_STRIP_TRAILING_WHITESPACE ) add_definitions("-DDAP_OS_MAC -DDAP_OS_MAC_ARCH=${MACOS_ARCH}") - endif() - if (${_CMAKE_OSX_SYSROOT_PATH} MATCHES "iOS") + elseif (${_CMAKE_OSX_SYSROOT_PATH} MATCHES "iOS") set(IOS ON) add_definitions("-DDAP_OS_IOS") + else() + set(MACOS ON) + add_definitions("-DDAP_OS_MAC -DDAP_OS_MAC_ARCH=${MACOS_ARCH}") endif() endif() diff --git a/dap-sdk/core/include/dap_common.h b/dap-sdk/core/include/dap_common.h index 769f9c254b53b4e4dfaa41035062c6f7c91f363b..164121dd11fe57bf04f86571482f2bfcc3217589 100755 --- a/dap-sdk/core/include/dap_common.h +++ b/dap-sdk/core/include/dap_common.h @@ -201,6 +201,18 @@ DAP_STATIC_INLINE void _dap_aligned_free( void *ptr ) #error "DAP_UINT64_FORMAT_* are undefined for your platform" #endif +#ifdef DAP_OS_WINDOWS +#ifdef _WIN64 +#define DAP_FORMAT_SOCKET "llu" +#else +#define DAP_FORMAT_SOCKET "lu" +#endif +#define DAP_FORMAT_HANDLE "p" +#else +#define DAP_FORMAT_SOCKET "d" +#define DAP_FORMAT_HANDLE "d" +#endif + #ifndef LOWORD #define LOWORD( l ) ((uint16_t) (((uintptr_t) (l)) & 0xFFFF)) #define HIWORD( l ) ((uint16_t) ((((uintptr_t) (l)) >> 16) & 0xFFFF)) @@ -427,11 +439,20 @@ void dap_log_set_max_item(unsigned int a_max); // get logs from list char *dap_log_get_item(time_t a_start_time, int a_limit); -void _log_it( const char * log_tag, enum dap_log_level, const char * format,... ); -#define log_it( _log_level, ...) _log_it( LOG_TAG, _log_level, ##__VA_ARGS__) -//void _vlog_it( const char * log_tag, uint32_t taglen, enum dap_log_level, const char * format, va_list ap ); +#if defined __GNUC__ || defined __clang__ +#ifdef __MINGW_PRINTF_FORMAT +#define DAP_PRINTF_ATTR(format_index, args_index) \ + __attribute__ ((format (gnu_printf, format_index, args_index))) +#else +#define DAP_PRINTF_ATTR(format_index, args_index) \ + __attribute__ ((format (printf, format_index, args_index))) +#endif +#else /* __GNUC__ */ +#define DAP_PRINTF_ATTR(format_index, args_index) +#endif /* __GNUC__ */ -//#define vlog_it( a_log_level, a_format, a_ap ) _vlog_it( LOG_TAG, sizeof(LOG_TAG)-1, a_log_level, a_format, a_ap ) +DAP_PRINTF_ATTR(3, 4) void _log_it( const char * log_tag, enum dap_log_level, const char * format, ... ); +#define log_it( _log_level, ...) _log_it( LOG_TAG, _log_level, ##__VA_ARGS__) const char * log_error(void); void dap_log_level_set(enum dap_log_level ll); diff --git a/dap-sdk/core/include/dap_fnmatch_loop.h b/dap-sdk/core/include/dap_fnmatch_loop.h index 550b5d80164380aea6aecbb092cd3dcbf60004c1..7d7c7f6643eb0d595d454dc89a8a95d382386c5b 100644 --- a/dap-sdk/core/include/dap_fnmatch_loop.h +++ b/dap-sdk/core/include/dap_fnmatch_loop.h @@ -1055,7 +1055,7 @@ EXT (int opt, const char *pattern, const char *string, const char *string_end, #define NEW_PATTERN \ struct patternlist *newp; \ size_t slen = (opt == '?' || opt == '@' \ - ? pattern_len : (p - startp + 1)); \ + ? pattern_len : (size_t)(p - startp + 1)); \ slen = sizeof (struct patternlist) + (slen * sizeof (char)); \ int malloced = ! __libc_use_alloca (alloca_used + slen); \ if (__builtin_expect (malloced, 0)) \ diff --git a/dap-sdk/core/include/dap_list.h b/dap-sdk/core/include/dap_list.h index ef5718ead9f2a6b2f555736872af64c277f63752..1bf990e7fe29c6a1670192ca8f32febaa770bf86 100755 --- a/dap-sdk/core/include/dap_list.h +++ b/dap-sdk/core/include/dap_list.h @@ -31,11 +31,11 @@ struct _dap_list dap_list_t* dap_list_alloc(void); void dap_list_free(dap_list_t *list); void dap_list_free1(dap_list_t *list); -void dap_list_free_full(dap_list_t *list, dap_callback_destroyed_t free_func); +void dap_list_free_full(dap_list_t *a_list, dap_callback_destroyed_t free_func); dap_list_t* dap_list_append(dap_list_t *list, void* data); dap_list_t* dap_list_prepend(dap_list_t *list, void* data); dap_list_t* dap_list_insert(dap_list_t *list, void* data, int position); -dap_list_t* dap_list_insert_sorted(dap_list_t *list, void* data, dap_callback_compare_t func); +dap_list_t* dap_list_insert_sorted(dap_list_t *list, void* data, dap_callback_compare_data_t func); dap_list_t* dap_list_insert_sorted_with_data(dap_list_t *list, void* data, dap_callback_compare_data_t func, void* user_data); dap_list_t* dap_list_insert_before(dap_list_t *list, dap_list_t *sibling, void* data); dap_list_t* dap_list_concat(dap_list_t *list1, dap_list_t *list2); @@ -58,7 +58,7 @@ dap_list_t* dap_list_last(dap_list_t *list); dap_list_t* dap_list_first(dap_list_t *list); unsigned int dap_list_length(dap_list_t *list); void dap_list_foreach(dap_list_t *list, dap_callback_t func, void* user_data); -dap_list_t* dap_list_sort(dap_list_t *list, dap_callback_compare_t compare_func); +dap_list_t* dap_list_sort(dap_list_t *list, dap_callback_compare_data_t compare_func); dap_list_t* dap_list_sort_with_data(dap_list_t *list, dap_callback_compare_data_t compare_func, void* user_data); void* dap_list_nth_data(dap_list_t *list, unsigned int n); diff --git a/dap-sdk/core/include/dap_string.h b/dap-sdk/core/include/dap_string.h index 65196c2a7e85ea622cf28927b001fceddf59993c..90405362972e41a7eb7ee415db9a0b22a953ca81 100755 --- a/dap-sdk/core/include/dap_string.h +++ b/dap-sdk/core/include/dap_string.h @@ -7,6 +7,7 @@ #include <stdio.h> #include <stdint.h> #include <sys/types.h> +#include "dap_common.h" typedef struct _dap_string dap_string_t; @@ -64,9 +65,9 @@ dap_string_t* dap_string_overwrite_len(dap_string_t *string, size_t pos, const c dap_string_t* dap_string_erase(dap_string_t *string, ssize_t pos, ssize_t len); void dap_string_vprintf(dap_string_t *string, const char *format, va_list args); -void dap_string_printf(dap_string_t *string, const char *format, ...); +DAP_PRINTF_ATTR(2, 3) void dap_string_printf(dap_string_t *string, const char *format, ...); void dap_string_append_vprintf(dap_string_t *string, const char *format, va_list args); -void dap_string_append_printf(dap_string_t *string, const char *format, ...); +DAP_PRINTF_ATTR(2, 3) void dap_string_append_printf(dap_string_t *string, const char *format, ...); /* -- optimize dap_strig_append_c --- */ #ifdef G_CAN_INLINE diff --git a/dap-sdk/core/src/dap_circular_buffer.c b/dap-sdk/core/src/dap_circular_buffer.c index 254571627ad81647e8f6a7d42c5d2699b9026173..8e62caf4d30dd9c59e004d699dacd0f819605dc3 100755 --- a/dap-sdk/core/src/dap_circular_buffer.c +++ b/dap-sdk/core/src/dap_circular_buffer.c @@ -340,7 +340,8 @@ void circular_buffer_print(circular_buffer_t cBuf, bool hex) dap_sprintf(str+i*2, "%c|",c); } - printf("CircularBuffer: %s <size %zu dataSize:%zu>\n",str,circular_buffer_get_capacity(cBuf),circular_buffer_get_data_size(cBuf)); + dap_printf("CircularBuffer: %s <size %zu dataSize:%zu>\n", + str,circular_buffer_get_capacity(cBuf),circular_buffer_get_data_size(cBuf)); free(str); } diff --git a/dap-sdk/core/src/dap_common.c b/dap-sdk/core/src/dap_common.c index ba91569fe2a3eda1583e5b60507af32fb6c5e5fd..2789fec964794a738da7f5df3c47f67aea44ddfb 100755 --- a/dap-sdk/core/src/dap_common.c +++ b/dap-sdk/core/src/dap_common.c @@ -217,11 +217,6 @@ void dap_set_log_tag_width(size_t a_width) { dap_snprintf(s_log_tag_fmt_str,sizeof (s_log_tag_fmt_str), "[%%%zds]\t",a_width); } -/** - * @brief dap_common_init initialise - * @param[in] a_log_file - * @return - */ /** * @brief this function is used for dap sdk modules initialization @@ -267,7 +262,7 @@ int wdap_common_init( const char *a_console_title, const wchar_t *a_log_filename if( s_log_file == NULL) s_log_file = _wfopen( a_log_filename , L"w" ); if ( s_log_file == NULL ) { - dap_fprintf( stderr, "Can't open log file %s to append\n", a_log_filename ); + dap_fprintf( stderr, "Can't open log file %ls to append\n", a_log_filename ); return -1; } //dap_stpcpy(s_log_file_path, a_log_filename); @@ -360,6 +355,7 @@ void _log_it(const char *a_log_tag, enum dap_log_level a_ll, const char *a_fmt, va_end( va ); char *dummy = (offset2 == 0) ? memcpy(&l_log_string->str[sizeof(l_log_string->str) - 6], "...\n\0", 5) : memcpy(&l_log_string->str[offset], "\n", 1); + UNUSED(dummy); pthread_mutex_lock(&s_log_mutex); DL_APPEND(s_log_buffer, l_log_string); ++s_log_count; @@ -749,12 +745,16 @@ size_t dap_hex2bin(uint8_t *a_out, const char *a_in, size_t a_len) // '0'-'9' = 0x30-0x39 // 'a'-'f' = 0x61-0x66 // 'A'-'F' = 0x41-0x46 - size_t ct = a_len; - if(!a_in || !a_out || (a_len & 1)) + int ct = a_len; + if (!a_in || !a_out) return 0; while(ct > 0) { - char ch1 = ((*a_in >= 'a') ? (*a_in++ - 'a' + 10) : ((*a_in >= 'A') ? (*a_in++ - 'A' + 10) : (*a_in++ - '0'))) << 4; - char ch2 = ((*a_in >= 'a') ? (*a_in++ - 'a' + 10) : ((*a_in >= 'A') ? (*a_in++ - 'A' + 10) : (*a_in++ - '0'))); // ((*in >= 'A') ? (*in++ - 'A' + 10) : (*in++ - '0')); + char ch1; + if (ct == (int)a_len && a_len & 1) + ch1 = 0; + else + ch1 = ((*a_in >= 'a') ? (*a_in++ - 'a' + 10) : ((*a_in >= 'A') ? (*a_in++ - 'A' + 10) : (*a_in++ - '0'))) << 4; + char ch2 = ((*a_in >= 'a') ? (*a_in++ - 'a' + 10) : ((*a_in >= 'A') ? (*a_in++ - 'A' + 10) : (*a_in++ - '0'))); *a_out++ =(uint8_t) ch1 + (uint8_t) ch2; ct -= 2; } diff --git a/dap-sdk/core/src/dap_config.c b/dap-sdk/core/src/dap_config.c index 37e59e489efc14d611b0b537be4fd9f70826d8a0..f848b34867036fd722f2ed411a47f52c998983cc 100755 --- a/dap-sdk/core/src/dap_config.c +++ b/dap-sdk/core/src/dap_config.c @@ -184,7 +184,7 @@ dap_config_t * dap_config_open(const char * a_name) l_param_name_size = j; if (l_param_name_size > (sizeof(l_param_name) -1) ){ l_param_name_size = (sizeof(l_param_name) - 1 ); - log_it(L_WARNING,"Too long param name in config, %u is more than %u maximum", + log_it(L_WARNING,"Too long param name in config, %zu is more than %zu maximum", j,sizeof(l_param_name) -1); } strncpy(l_param_name,l_line,j); @@ -203,7 +203,7 @@ dap_config_t * dap_config_open(const char * a_name) if (l_param_value_size ){ if (l_param_value_size > (sizeof(l_param_value) -1) ){ l_param_value_size = (sizeof(l_param_value) - 1 ); - log_it(L_WARNING,"Too long param value in config, %u is more than %u maximum", + log_it(L_WARNING,"Too long param value in config, %zu is more than %zu maximum", l_line_length - j,sizeof(l_param_value) -1); } strncpy(l_param_value,l_line +j, l_param_value_size); diff --git a/dap-sdk/core/src/dap_list.c b/dap-sdk/core/src/dap_list.c index 6308e74123bf56fc14a49664074eb068f0db1d12..9fa0d16b3a8a4eb076657c49fe74f2d897fa95fb 100755 --- a/dap-sdk/core/src/dap_list.c +++ b/dap-sdk/core/src/dap_list.c @@ -62,10 +62,14 @@ void dap_list_free1(dap_list_t *list) * Convenience method, which frees all the memory used by a DapList, * and calls @free_func on every element's data. */ -void dap_list_free_full(dap_list_t *list, dap_callback_destroyed_t free_func) +void dap_list_free_full(dap_list_t *a_list, dap_callback_destroyed_t a_free_func) { - dap_list_foreach(list, (dap_callback_t) free_func, NULL); - dap_list_free(list); + dap_list_t *l_list = a_list; + while (l_list) { + a_free_func(l_list->data); + l_list = l_list->next; + } + dap_list_free(a_list); } /** @@ -790,7 +794,7 @@ void dap_list_foreach(dap_list_t *list, dap_callback_t func, void* user_data) } } -static dap_list_t* dap_list_insert_sorted_real(dap_list_t *list, void* data, dap_callback_t func, void* user_data) +static dap_list_t* dap_list_insert_sorted_real(dap_list_t *list, void* data, dap_callback_compare_data_t func, void* user_data) { dap_list_t *tmp_list = list; dap_list_t *new_list; @@ -805,13 +809,13 @@ static dap_list_t* dap_list_insert_sorted_real(dap_list_t *list, void* data, dap return new_list; } - cmp = ((dap_callback_compare_data_t) func)(data, tmp_list->data, user_data); + cmp = func(data, tmp_list->data, user_data); while((tmp_list->next) && (cmp > 0)) { tmp_list = tmp_list->next; - cmp = ((dap_callback_compare_data_t) func)(data, tmp_list->data, user_data); + cmp = func(data, tmp_list->data, user_data); } new_list = dap_list_alloc(); @@ -857,9 +861,9 @@ static dap_list_t* dap_list_insert_sorted_real(dap_list_t *list, void* data, dap * * Returns: the (possibly changed) start of the DapList */ -dap_list_t *dap_list_insert_sorted(dap_list_t *list, void* data, dap_callback_compare_t func) +dap_list_t *dap_list_insert_sorted(dap_list_t *list, void* data, dap_callback_compare_data_t func) { - return dap_list_insert_sorted_real(list, data, (dap_callback_t) func, NULL); + return dap_list_insert_sorted_real(list, data, func, NULL); } /** @@ -884,10 +888,10 @@ dap_list_t *dap_list_insert_sorted(dap_list_t *list, void* data, dap_callback_co */ dap_list_t * dap_list_insert_sorted_with_data(dap_list_t *list, void* data, dap_callback_compare_data_t func, void* user_data) { - return dap_list_insert_sorted_real(list, data, (dap_callback_t) func, user_data); + return dap_list_insert_sorted_real(list, data, func, user_data); } -static dap_list_t *dap_list_sort_merge(dap_list_t *l1, dap_list_t *l2, dap_callback_t compare_func, void* user_data) +static dap_list_t *dap_list_sort_merge(dap_list_t *l1, dap_list_t *l2, dap_callback_compare_data_t compare_func, void* user_data) { dap_list_t list, *l, *lprev; int cmp; @@ -897,7 +901,7 @@ static dap_list_t *dap_list_sort_merge(dap_list_t *l1, dap_list_t *l2, dap_callb while(l1 && l2) { - cmp = ((dap_callback_compare_data_t) compare_func)(l1->data, l2->data, user_data); + cmp = compare_func(l1->data, l2->data, user_data); if(cmp <= 0) { @@ -919,7 +923,7 @@ static dap_list_t *dap_list_sort_merge(dap_list_t *l1, dap_list_t *l2, dap_callb return list.next; } -static dap_list_t *dap_list_sort_real(dap_list_t *list, dap_callback_t compare_func, void* user_data) +static dap_list_t *dap_list_sort_real(dap_list_t *list, dap_callback_compare_data_t compare_func, void* user_data) { dap_list_t *l1, *l2; @@ -973,9 +977,9 @@ static dap_list_t *dap_list_sort_real(dap_list_t *list, dap_callback_t compare_f * Returns: negative value if @a < @b; zero if @a = @b; positive * value if @a > @b */ -dap_list_t *dap_list_sort(dap_list_t *list, dap_callback_compare_t compare_func) +dap_list_t *dap_list_sort(dap_list_t *list, dap_callback_compare_data_t compare_func) { - return dap_list_sort_real(list, (dap_callback_t) compare_func, NULL); + return dap_list_sort_real(list, compare_func, NULL); } /** @@ -1005,5 +1009,5 @@ dap_list_t *dap_list_sort(dap_list_t *list, dap_callback_compare_t compare_func) */ dap_list_t *dap_list_sort_with_data(dap_list_t *list, dap_callback_compare_data_t compare_func, void* user_data) { - return dap_list_sort_real(list, (dap_callback_t) compare_func, user_data); + return dap_list_sort_real(list, compare_func, user_data); } diff --git a/dap-sdk/core/src/dap_strfuncs.c b/dap-sdk/core/src/dap_strfuncs.c index 636a7c12f8e4b448de9d5ad0cd236d6a77774395..c95ff68bb8aa653fa4004d0c1f9f86f1dd997a88 100755 --- a/dap-sdk/core/src/dap_strfuncs.c +++ b/dap-sdk/core/src/dap_strfuncs.c @@ -135,7 +135,7 @@ int128_t dap_strtoi128(const char *p, char **endp, int base) } } /** - * @brief dap_utoa128 + * @brief dap_utoa128 convert unsigned integer to ASCII * @param dest * @param v * @param base diff --git a/dap-sdk/core/src/dap_string.c b/dap-sdk/core/src/dap_string.c index be00ca8534fcf1862951dc0fc6e19acacbea1019..9016f7bfc0fcb0c332ae9aaa8c4cfd550ad25c17 100755 --- a/dap-sdk/core/src/dap_string.c +++ b/dap-sdk/core/src/dap_string.c @@ -39,7 +39,7 @@ static void dap_string_maybe_expand(dap_string_t *a_string, size_t a_len) strcpy(l_str, a_string->str); DAP_DELETE(a_string->str); a_string->str = l_str;*/ - a_string->str = DAP_REALLOC(a_string->str, a_string->allocated_len); + a_string->str = DAP_REALLOC(a_string->str, (uint32_t)a_string->allocated_len); } } diff --git a/dap-sdk/core/src/win32/dap_console_manager.c b/dap-sdk/core/src/win32/dap_console_manager.c index 80f8dbd4a4b651f728f94118f4979536c75a4536..b7f8e48cb9cd25a921ce3f1b7068f3fd9b29cfad 100644 --- a/dap-sdk/core/src/win32/dap_console_manager.c +++ b/dap-sdk/core/src/win32/dap_console_manager.c @@ -156,20 +156,20 @@ void SetupConsole( const char *title, const uint16_t *fontName, int fontx, int f // COORD conmax = GetLargestConsoleWindowSize( hConOut ); - PGetCurrentConsoleFontEx pGetCurrentConsoleFontEx = (PGetCurrentConsoleFontEx) + PGetCurrentConsoleFontEx pGetCurrentConsoleFontEx = (PGetCurrentConsoleFontEx)(void *) GetProcAddress( GetModuleHandleA("kernel32.dll"), "GetCurrentConsoleFontEx" ); - PSetCurrentConsoleFontEx pSetCurrentConsoleFontEx = (PSetCurrentConsoleFontEx) + PSetCurrentConsoleFontEx pSetCurrentConsoleFontEx = (PSetCurrentConsoleFontEx)(void *) GetProcAddress( GetModuleHandleA("kernel32.dll"), "SetCurrentConsoleFontEx" ); - PGetConsoleScreenBufferInfoEx pGetConsoleScreenBufferInfoEx = (PGetConsoleScreenBufferInfoEx) + PGetConsoleScreenBufferInfoEx pGetConsoleScreenBufferInfoEx = (PGetConsoleScreenBufferInfoEx)(void *) GetProcAddress( GetModuleHandleA("kernel32.dll"), "GetConsoleScreenBufferInfoEx" ); - PSetConsoleScreenBufferInfoEx pSetConsoleScreenBufferInfoEx = (PSetConsoleScreenBufferInfoEx) + PSetConsoleScreenBufferInfoEx pSetConsoleScreenBufferInfoEx = (PSetConsoleScreenBufferInfoEx)(void *) GetProcAddress( GetModuleHandleA("kernel32.dll"), "SetConsoleScreenBufferInfoEx" ); if ( pGetCurrentConsoleFontEx && pSetCurrentConsoleFontEx && pGetConsoleScreenBufferInfoEx && pSetConsoleScreenBufferInfoEx ) { CONSOLE_SCREEN_BUFFER_INFOEX conBufferInfo; - CONSOLE_FONT_INFOEX conFontInfo = {sizeof(CONSOLE_FONT_INFOEX)}; + CONSOLE_FONT_INFOEX conFontInfo = {}; conFontInfo.cbSize = sizeof( CONSOLE_FONT_INFOEX ); pGetCurrentConsoleFontEx( hConOut, TRUE, &conFontInfo ); @@ -198,7 +198,7 @@ void SetupConsole( const char *title, const uint16_t *fontName, int fontx, int f else { // printf("XP ?...\n" ); - CONSOLE_INFO ci = { sizeof(ci) }; + CONSOLE_INFO ci = { .Length = sizeof(ci) }; GetConsoleSizeInfo( &ci, hConOut ); diff --git a/dap-sdk/core/src/win32/dap_cpu_monitor.c b/dap-sdk/core/src/win32/dap_cpu_monitor.c index 1857e8f408945f2622e6a99bafe1a9b5db6915cb..68e80f290c8a1620344a5733dea4d431dfdf3b59 100644 --- a/dap-sdk/core/src/win32/dap_cpu_monitor.c +++ b/dap-sdk/core/src/win32/dap_cpu_monitor.c @@ -35,7 +35,7 @@ //static FILE * _proc_stat = NULL; static dap_cpu_stats_t _cpu_stats = {0}; -static dap_cpu_t _cpu_old_stats[MAX_CPU_COUNT] = {0}; +static dap_cpu_t _cpu_old_stats[MAX_CPU_COUNT] = {}; static dap_cpu_t _cpu_summary_old = {0}; typedef struct proc_stat_line @@ -103,12 +103,11 @@ dap_cpu_stats_t dap_cpu_get_stats() /*********************************************/ SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION pinfo[64]; - ULONG outsize; - uint32_t ntstatus_error; + ULONG outsize = 0; + uint32_t ntstatus_error = 0; /*ntstatus_error = NtQuerySystemInformation( SystemProcessorPerformanceInformation, &pinfo, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * 64, &outsize );*/ // ! ! ! Legacy method, must be replaced - ntstatus_error = 0; if ( ntstatus_error ) { log_it(L_ERROR, "NtQuerySystemInformation returned an error %u", ntstatus_error ); diff --git a/dap-sdk/core/src/win32/dap_process_manager.c b/dap-sdk/core/src/win32/dap_process_manager.c index 2051da95e27008ada9e2bc102db12ad971b7b24e..ad2bd86f44356ed398b4c0f25c93d6329fe5b7fd 100644 --- a/dap-sdk/core/src/win32/dap_process_manager.c +++ b/dap-sdk/core/src/win32/dap_process_manager.c @@ -22,6 +22,7 @@ //#include <winnt.h> #include <winternl.h> +#define __USE_MINGW_ANSI_STDIO 1 #include <stdio.h> #include <stdint.h> #include <string.h> @@ -75,7 +76,7 @@ bool save_process_pid_in_file( const char* file_path ) return false; } - fprintf( fpid, "%u", GetCurrentProcessId() ); + fprintf( fpid, "%lu", GetCurrentProcessId() ); fclose( fpid ); return true; @@ -97,7 +98,7 @@ pid_t get_pid_from_file( const char* file_path ) { pid_t f_pid = 0; - fscanf( fpid, "%u", &f_pid ); + fscanf( fpid, "%lld", &f_pid ); fclose( fpid ); return f_pid; diff --git a/dap-sdk/core/src/win32/registry.c b/dap-sdk/core/src/win32/registry.c index cead0908150a65972869f763a5ee7a0fac3eb206..72c8cae929e07362e823c22b44b3e0703de304d7 100644 --- a/dap-sdk/core/src/win32/registry.c +++ b/dap-sdk/core/src/win32/registry.c @@ -135,7 +135,7 @@ wchar_t* getUserSID(LPCWSTR homePath) { wchar_t* shGetUsrPath(){ static WCHAR path[MAX_PATH]; - memset(path, L'\0', MAX_PATH); + memset(path, L'\0', MAX_PATH * sizeof(WCHAR)); SHGetFolderPathW(NULL, CSIDL_PROFILE, NULL, 0, path); return path; } diff --git a/dap-sdk/crypto/include/dap_enc.h b/dap-sdk/crypto/include/dap_enc.h index 9d808d079b5b2567ac3ed2c500f8458c28504a18..a9ee77d1b697d8c3575189fae276671ca3d8f9b0 100755 --- a/dap-sdk/crypto/include/dap_enc.h +++ b/dap-sdk/crypto/include/dap_enc.h @@ -36,6 +36,7 @@ extern "C" { int dap_enc_init(void); void dap_enc_deinit(void); +bool dap_enc_debug_more(); // if include_base64 == true. Calc out size with base64 encoding size_t dap_enc_code_out_size(dap_enc_key_t* a_key, const size_t a_buf_in_size, dap_enc_data_type_t type); diff --git a/dap-sdk/crypto/include/dap_enc_dilithium.h b/dap-sdk/crypto/include/dap_enc_dilithium.h index ac0752a75bd70a98f33d38c06bc2c29590f91132..f79abef200251f939cacf876b13cc55c12fac7e8 100755 --- a/dap-sdk/crypto/include/dap_enc_dilithium.h +++ b/dap-sdk/crypto/include/dap_enc_dilithium.h @@ -29,7 +29,7 @@ size_t dap_enc_dilithium_calc_signature_unserialized_size(void); static inline size_t dap_enc_dilithium_calc_signagture_size(dilithium_signature_t* a_sign) { - return sizeof(size_t) + sizeof(dilithium_kind_t) + a_sign->sig_len + sizeof(unsigned long long); + return sizeof(uint64_t) * 3 + a_sign->sig_len; } uint8_t* dap_enc_dilithium_write_signature(dilithium_signature_t* a_sign, size_t *a_sign_out); diff --git a/dap-sdk/crypto/include/dap_hash.h b/dap-sdk/crypto/include/dap_hash.h index f11b1f1334c4bae0715d873d6fbe0f35d0e8627f..0f152542f8305978e755706e5a41bd7560ff4c8d 100755 --- a/dap-sdk/crypto/include/dap_hash.h +++ b/dap-sdk/crypto/include/dap_hash.h @@ -53,7 +53,6 @@ typedef dap_chain_hash_fast_t dap_hash_fast_t; extern "C" { #endif -//size_t dap_chain_hash_fast_to_str(dap_chain_hash_fast_t * a_hash, char * a_str, size_t a_str_max); int dap_chain_hash_fast_from_str( const char * a_hash_str, dap_hash_fast_t * a_hash); /** @@ -74,9 +73,7 @@ static inline bool dap_hash_fast( const void *a_data_in, size_t a_data_in_size, SHA3_256( (unsigned char *)a_hash_out, (const unsigned char *)a_data_in, a_data_in_size ); - //SHA3_256( (unsigned char *)a_hash_out, (const unsigned char *)a_data_in, a_data_in_size ); - - return true; + return true; } @@ -98,12 +95,7 @@ static inline bool dap_hash_fast_compare(dap_hash_fast_t *a_hash1, dap_hash_fast static inline bool dap_hash_fast_is_blank( dap_hash_fast_t *a_hash ) { - static dap_hash_fast_t l_blank_hash = { 0}; -// uint8_t *l_hast_bytes = (uint8_t*) a_hash; -// for(size_t i = 0; i < sizeof(dap_chain_hash_fast_t); i++) { -// if(l_hast_bytes[i]) -// return false; -// } + static dap_hash_fast_t l_blank_hash = {}; return dap_hash_fast_compare( a_hash, &l_blank_hash); } diff --git a/dap-sdk/crypto/src/dap_cert.c b/dap-sdk/crypto/src/dap_cert.c index 131b7415c5a152a088c75a78f4715d181bbb83d9..4b9d0e35a417f366e8e95f35f8b5a94a00eb0f40 100755 --- a/dap-sdk/crypto/src/dap_cert.c +++ b/dap-sdk/crypto/src/dap_cert.c @@ -415,7 +415,7 @@ dap_pkey_t * dap_cert_to_pkey(dap_cert_t * a_cert) */ int dap_cert_compare_with_sign (dap_cert_t * a_cert,const dap_sign_t * a_sign) { - dap_return_val_if_fail(a_cert && a_cert->enc_key && a_sign, -1); + dap_return_val_if_fail(a_cert && a_cert->enc_key && a_sign, -4); if ( dap_sign_type_from_key_type( a_cert->enc_key->type ).type == a_sign->header.type.type ){ int l_ret; size_t l_pub_key_size = 0; @@ -428,7 +428,7 @@ int dap_cert_compare_with_sign (dap_cert_t * a_cert,const dap_sign_t * a_sign) DAP_DELETE(l_pub_key); return l_ret; }else - return -1; // Wrong sign type + return -3; // Wrong sign type } @@ -453,13 +453,13 @@ size_t dap_cert_count_cert_sign(dap_cert_t * a_cert) */ void dap_cert_dump(dap_cert_t * a_cert) { - printf ("Certificate name: %s\n",a_cert->name); - printf ("Signature type: %s\n", dap_sign_type_to_str( dap_sign_type_from_key_type(a_cert->enc_key->type) ) ); - printf ("Private key size: %lu\n",a_cert->enc_key->priv_key_data_size); - printf ("Public key size: %lu\n", a_cert->enc_key->pub_key_data_size); + dap_printf ("Certificate name: %s\n",a_cert->name); + dap_printf ("Signature type: %s\n", dap_sign_type_to_str( dap_sign_type_from_key_type(a_cert->enc_key->type) ) ); + dap_printf ("Private key size: %zu\n",a_cert->enc_key->priv_key_data_size); + dap_printf ("Public key size: %zu\n", a_cert->enc_key->pub_key_data_size); size_t l_meta_items_cnt = dap_binary_tree_count(a_cert->metadata); - printf ("Metadata section count: %lu\n", l_meta_items_cnt); - printf ("Certificates signatures chain size: %lu\n",dap_cert_count_cert_sign (a_cert)); + dap_printf ("Metadata section count: %zu\n", l_meta_items_cnt); + dap_printf ("Certificates signatures chain size: %zu\n",dap_cert_count_cert_sign (a_cert)); if (l_meta_items_cnt) { printf ("Metadata sections\n"); dap_list_t *l_meta_list = dap_binary_tree_inorder_list(a_cert->metadata); diff --git a/dap-sdk/crypto/src/dap_cert_file.c b/dap-sdk/crypto/src/dap_cert_file.c index 4ade46227435ada96cc2c985b5f997e5f3785bc4..fdbfad91bf9058a818312529a8289da9d1361b07 100755 --- a/dap-sdk/crypto/src/dap_cert_file.c +++ b/dap-sdk/crypto/src/dap_cert_file.c @@ -54,7 +54,7 @@ int dap_cert_file_save(dap_cert_t * a_cert, const char * a_cert_file_path) if ( l_data ){ size_t l_retbytes; if ( (l_retbytes = fwrite(l_data,1,l_data_size,l_file)) != l_data_size ){ - log_it(L_ERROR, "Can't write %u bytes on disk (processed only %u)!", l_data_size,l_retbytes); + log_it(L_ERROR, "Can't write %u bytes on disk (processed only %zu)!", l_data_size,l_retbytes); return -3; } fclose(l_file); @@ -101,7 +101,6 @@ void s_balance_the_tree(dap_cert_file_aux_t *a_reorder, size_t a_left_idx, size_ * @param a_data * @param a_size */ - void dap_cert_deserialize_meta(dap_cert_t *a_cert, const uint8_t *a_data, size_t a_size) { dap_cert_metadata_t **l_meta_arr = NULL; @@ -175,7 +174,6 @@ void dap_cert_deserialize_meta(dap_cert_t *a_cert, const uint8_t *a_data, size_t * @param a_buflen_out * @return uint8_t* */ - uint8_t *dap_cert_serialize_meta(dap_cert_t *a_cert, size_t *a_buflen_out) { if (!a_cert) { @@ -193,7 +191,7 @@ uint8_t *dap_cert_serialize_meta(dap_cert_t *a_cert, size_t *a_buflen_out) size_t l_mem_shift = 0; while (l_meta_list_item) { dap_cert_metadata_t *l_meta_item = l_meta_list_item->data; - size_t l_meta_item_size = sizeof(dap_cert_metadata_t) - sizeof(const char *) + l_meta_item->length + strlen(l_meta_item->key) + 1; + size_t l_meta_item_size = sizeof(uint32_t) + 1 + l_meta_item->length + strlen(l_meta_item->key) + 1; if (l_buf) { l_buf = DAP_REALLOC(l_buf, l_mem_shift + l_meta_item_size); } else { @@ -247,7 +245,6 @@ uint8_t *dap_cert_serialize_meta(dap_cert_t *a_cert, size_t *a_buflen_out) * @param a_cert_size_out * @return uint8_t* */ - uint8_t* dap_cert_mem_save(dap_cert_t * a_cert, uint32_t *a_cert_size_out) { dap_cert_file_hdr_t l_hdr={0}; @@ -264,6 +261,7 @@ uint8_t* dap_cert_mem_save(dap_cert_t * a_cert, uint32_t *a_cert_size_out) uint8_t *l_priv_key_data = a_cert->enc_key->priv_key_data ? dap_enc_key_serealize_priv_key(l_key, &l_priv_key_data_size) : NULL; + uint8_t *l_metadata = dap_cert_serialize_meta(a_cert, &l_metadata_size); l_hdr.sign = dap_cert_FILE_HDR_SIGN; @@ -334,7 +332,6 @@ lb_exit: * @param a_cert_file_path: path to certificate, for example "{PREFIX}/var/lib/ca/node-addr.dcert" * @return dap_cert_t */ - dap_cert_t* dap_cert_file_load(const char * a_cert_file_path) { dap_cert_t * l_ret = NULL; @@ -346,7 +343,7 @@ dap_cert_t* dap_cert_file_load(const char * a_cert_file_path) rewind(l_file); uint8_t * l_data = DAP_NEW_SIZE(uint8_t,l_file_size); if ( fread(l_data,1,l_file_size,l_file ) != l_file_size ){ - log_it(L_ERROR, "Can't read %u bytes from the disk!", l_file_size); + log_it(L_ERROR, "Can't read %"DAP_UINT64_FORMAT_U" bytes from the disk!", l_file_size); DAP_DELETE (l_data); goto lb_exit; }else{ @@ -368,7 +365,6 @@ lb_exit: * @param a_data_size - size of certificate * @return dap_cert_t* */ - dap_cert_t* dap_cert_mem_load(const void * a_data, size_t a_data_size) { dap_cert_t * l_ret = NULL; @@ -382,6 +378,14 @@ dap_cert_t* dap_cert_mem_load(const void * a_data, size_t a_data_size) goto l_exit; } if (l_hdr.version >= 1 ){ + if (dap_enc_debug_more()) { + log_it(L_DEBUG,"sizeof(l_hdr)=%"DAP_UINT64_FORMAT_U" " + "l_hdr.data_pvt_size=%"DAP_UINT64_FORMAT_U" " + "l_hdr.data_size=%"DAP_UINT64_FORMAT_U" " + "l_hdr.metadata_size=%"DAP_UINT64_FORMAT_U" " + "a_data_size=%"DAP_UINT64_FORMAT_U" ", + sizeof(l_hdr), l_hdr.data_pvt_size, l_hdr.data_size, l_hdr.metadata_size, a_data_size); + } if ( (sizeof(l_hdr) + l_hdr.data_size+l_hdr.data_pvt_size +l_hdr.metadata_size) > a_data_size ){ log_it(L_ERROR,"Corrupted cert data, data sections size is smaller than exists on the disk! (%"DAP_UINT64_FORMAT_U" expected, %"DAP_UINT64_FORMAT_U" on disk)", sizeof(l_hdr)+l_hdr.data_pvt_size+l_hdr.data_size+l_hdr.metadata_size, a_data_size); @@ -405,12 +409,10 @@ dap_cert_t* dap_cert_mem_load(const void * a_data, size_t a_data_size) l_ret->enc_key->last_used_timestamp = l_hdr.ts_last_used; if ( l_hdr.data_size > 0 ){ - dap_enc_key_deserealize_pub_key(l_ret->enc_key, l_data + l_data_offset, l_hdr.data_size); l_data_offset += l_hdr.data_size; } if ( l_hdr.data_pvt_size > 0 ){ - dap_enc_key_deserealize_priv_key(l_ret->enc_key, l_data + l_data_offset, l_hdr.data_pvt_size); l_data_offset += l_hdr.data_pvt_size; } diff --git a/dap-sdk/crypto/src/dap_enc.c b/dap-sdk/crypto/src/dap_enc.c index 507d62b52553d8e6e0eaab3ff8147b3bf351037d..6c0250cc539d691023f721b0b7188ec62817e96b 100755 --- a/dap-sdk/crypto/src/dap_enc.c +++ b/dap-sdk/crypto/src/dap_enc.c @@ -31,6 +31,7 @@ #include "dap_enc_base64.h" #include "dap_enc_key.h" #include "dap_common.h" +#include "dap_config.h" #define LOG_TAG "dap_enc" @@ -40,10 +41,13 @@ * @return int */ +static bool s_debug_more = false; + int dap_enc_init() { srand(time(NULL)); dap_enc_key_init(); + s_debug_more = g_config ? dap_config_get_item_bool_default(g_config, "crypto", "debug_more", false) : false; return 0; } @@ -55,6 +59,11 @@ void dap_enc_deinit() } +bool dap_enc_debug_more() +{ + return s_debug_more; +} + /** * @brief dap_enc_code_out_size * @param a_key diff --git a/dap-sdk/crypto/src/dap_enc_bf.c b/dap-sdk/crypto/src/dap_enc_bf.c index 86681c164960bb5b61ab5ac38e5bc2ec8a84fab3..2a5b78d8fb6861cf6ce31f602a207e9f7b1f6fe8 100644 --- a/dap-sdk/crypto/src/dap_enc_bf.c +++ b/dap-sdk/crypto/src/dap_enc_bf.c @@ -116,7 +116,7 @@ size_t dap_enc_bf_cbc_decrypt_fast(struct dap_enc_key *a_key, const void * a_in, int bf_cbc_padding_length = *(uint8_t*)(a_out + a_in_size - BLOWFISH_BLOCK_SIZE - 1); size_t a_out_size = *(uint32_t*)(a_out + a_in_size - BLOWFISH_BLOCK_SIZE - 1 - bf_cbc_padding_length - 4); if (a_out_size > a_in_size + BLOWFISH_BLOCK_SIZE) { - log_it(L_WARNING, "blowfish_cbc decryption out size %d too big", a_out_size); + log_it(L_WARNING, "blowfish_cbc decryption out size %zu too big", a_out_size); return a_in_size + BLOWFISH_BLOCK_SIZE; } return a_out_size; @@ -129,7 +129,7 @@ size_t dap_enc_bf_cbc_encrypt_fast(struct dap_enc_key * a_key, const void * a_in //generate iv and put it in *a_out first bytes size_t a_out_size = (a_in_size + 4 + 1 + BLOWFISH_BLOCK_SIZE-1)/BLOWFISH_BLOCK_SIZE*BLOWFISH_BLOCK_SIZE + BLOWFISH_BLOCK_SIZE; if(a_out_size > buf_out_size) { - log_it(L_ERROR, "blowfish_cbc fast_encryption too small buf_out_size, %d < %d", buf_out_size, a_out_size); + log_it(L_ERROR, "blowfish_cbc fast_encryption too small buf_out_size, %zu < %zu", buf_out_size, a_out_size); return 0; } diff --git a/dap-sdk/crypto/src/dap_enc_bliss.c b/dap-sdk/crypto/src/dap_enc_bliss.c index e75d0f8d8d46d6947e779c473b8b07b8cd8f218c..29e103aba92cbcab45bf2da7c8061a89d2959e81 100755 --- a/dap-sdk/crypto/src/dap_enc_bliss.c +++ b/dap-sdk/crypto/src/dap_enc_bliss.c @@ -22,8 +22,8 @@ void dap_enc_sig_bliss_key_new(struct dap_enc_key *key) { key->type = DAP_ENC_KEY_TYPE_SIG_BLISS; key->enc = NULL; - key->gen_bob_shared_key = (dap_enc_gen_bob_shared_key) dap_enc_sig_bliss_get_sign; - key->gen_alice_shared_key = (dap_enc_gen_alice_shared_key) dap_enc_sig_bliss_verify_sign; + //key->gen_bob_shared_key = (dap_enc_gen_bob_shared_key) dap_enc_sig_bliss_get_sign; + //key->gen_alice_shared_key = (dap_enc_gen_alice_shared_key) dap_enc_sig_bliss_verify_sign; } /** diff --git a/dap-sdk/crypto/src/dap_enc_dilithium.c b/dap-sdk/crypto/src/dap_enc_dilithium.c index aa9821f1bca46cad28006baa628f3100087e5e30..a7538443a1b754852cf34ae8bc23867bd93d206c 100755 --- a/dap-sdk/crypto/src/dap_enc_dilithium.c +++ b/dap-sdk/crypto/src/dap_enc_dilithium.c @@ -134,13 +134,14 @@ uint8_t* dap_enc_dilithium_write_signature(dilithium_signature_t* a_sign, size_t memcpy(l_buf, &l_buflen, sizeof(uint64_t)); l_shift_mem += sizeof(uint64_t); - memcpy(l_buf + l_shift_mem, &a_sign->kind, sizeof(dilithium_kind_t)); - l_shift_mem += sizeof(dilithium_kind_t); - memcpy(l_buf + l_shift_mem, &a_sign->sig_len, sizeof(unsigned long long)); + uint64_t l_kind = a_sign->kind; + memcpy(l_buf + l_shift_mem, &l_kind, sizeof(uint64_t)); + l_shift_mem += sizeof(uint64_t); + memcpy(l_buf + l_shift_mem, &a_sign->sig_len, sizeof(uint64_t)); l_shift_mem += sizeof(uint64_t); memcpy(l_buf + l_shift_mem, a_sign->sig_data, a_sign->sig_len ); - l_shift_mem += a_sign->sig_len ; - + l_shift_mem += a_sign->sig_len; + assert(l_shift_mem == l_buflen); if(a_sign_out) *a_sign_out = l_buflen; return l_buf; @@ -153,21 +154,29 @@ dilithium_signature_t* dap_enc_dilithium_read_signature(uint8_t *a_buf, size_t a log_it(L_ERROR,"::read_signature() NULL buffer on input"); return NULL; } - if(a_buflen < (sizeof(uint64_t) + sizeof(uint64_t) + sizeof (uint64_t) )){ + if(a_buflen < sizeof(uint64_t) * 3){ log_it(L_ERROR,"::read_signature() Buflen %zd is smaller than first three fields(%zd)", a_buflen, - sizeof(uint64_t) + sizeof(dilithium_kind_t) +sizeof (uint64_t) ); + sizeof(uint64_t) * 3); return NULL; } uint64_t l_shift_mem = 0; uint64_t kind; - uint64_t l_buflen_internal = 0; - memcpy(&l_buflen_internal, a_buf, sizeof(uint64_t)); - l_shift_mem += sizeof(uint64_t); - memcpy(&kind, a_buf + l_shift_mem, sizeof(uint64_t)); - l_shift_mem += sizeof (dilithium_kind_t); - if(l_buflen_internal != (uint64_t) a_buflen) - return NULL ; + uint64_t l_buflen = 0; + memcpy(&l_buflen, a_buf, sizeof(uint64_t)); + if (l_buflen != a_buflen) { + if (l_buflen << 32 >> 32 != a_buflen) { + log_it(L_ERROR,"::read_public_key() Buflen field inside buffer is %"DAP_UINT64_FORMAT_U" when expected to be %"DAP_UINT64_FORMAT_U, + l_buflen, (uint64_t)a_buflen); + return NULL; + }else { + memcpy(&kind, a_buf + sizeof(uint32_t), sizeof(uint32_t)); + l_shift_mem = 2 * sizeof(uint32_t); // + sizeof(uint32_t) for old2 variant, oh + } + } else { + memcpy(&kind, a_buf + sizeof(uint64_t), sizeof(uint64_t)); + l_shift_mem = 2 * sizeof(uint64_t); + } dilithium_param_t p; if(!dilithium_params_init(&p, kind)) return NULL ; @@ -202,7 +211,7 @@ dilithium_signature_t* dap_enc_dilithium_read_signature(uint8_t *a_buf, size_t a return NULL; } - l_sign->sig_data = DAP_NEW_SIZE(unsigned char, l_sign->sig_len); + l_sign->sig_data = DAP_NEW_SIZE(byte_t, l_sign->sig_len); if (!l_sign->sig_data){ log_it(L_ERROR,"::read_signature() Can't allocate sig_data %"DAP_UINT64_FORMAT_U" size", l_sign->sig_len); DAP_DELETE(l_sign); @@ -313,15 +322,16 @@ dilithium_signature_t* dap_enc_dilithium_read_signature_old2(uint8_t *a_buf, siz /* Serialize a private key. */ uint8_t* dap_enc_dilithium_write_private_key(const dilithium_private_key_t* a_private_key, size_t *a_buflen_out) { - dilithium_param_t p;// = malloc(sizeof(dilithium_param_t)); + dilithium_param_t p; if(!dilithium_params_init(&p, a_private_key->kind)) return NULL; - uint64_t l_buflen = sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_SECRETKEYBYTES; //CRYPTO_PUBLICKEYBYTES; + uint64_t l_buflen = sizeof(uint64_t) + sizeof(uint32_t) + p.CRYPTO_SECRETKEYBYTES; byte_t *l_buf = DAP_NEW_Z_SIZE(byte_t, l_buflen); memcpy(l_buf, &l_buflen, sizeof(uint64_t)); - memcpy(l_buf + sizeof(uint64_t), &a_private_key->kind, sizeof(dilithium_kind_t)); - memcpy(l_buf + sizeof(uint64_t) + sizeof(dilithium_kind_t), a_private_key->data, p.CRYPTO_SECRETKEYBYTES); + uint32_t l_kind = a_private_key->kind; + memcpy(l_buf + sizeof(uint64_t), &l_kind, sizeof(uint32_t)); + memcpy(l_buf + sizeof(uint64_t) + sizeof(uint32_t), a_private_key->data, p.CRYPTO_SECRETKEYBYTES); if(a_buflen_out) *a_buflen_out = l_buflen; return l_buf; @@ -334,12 +344,12 @@ uint8_t* dap_enc_dilithium_write_public_key(const dilithium_public_key_t* a_publ if(!dilithium_params_init(&p, a_public_key->kind)) return NULL; - uint64_t l_buflen = sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_PUBLICKEYBYTES; + uint64_t l_buflen = sizeof(uint64_t) + sizeof(uint32_t) + p.CRYPTO_PUBLICKEYBYTES; uint8_t *l_buf = DAP_NEW_Z_SIZE(byte_t, l_buflen); memcpy(l_buf, &l_buflen, sizeof(uint64_t)); - - memcpy(l_buf + sizeof(uint64_t), &a_public_key->kind, sizeof(dilithium_kind_t)); - memcpy(l_buf + sizeof(uint64_t) + sizeof(dilithium_kind_t), a_public_key->data, p.CRYPTO_PUBLICKEYBYTES); + uint32_t l_kind = a_public_key->kind; + memcpy(l_buf + sizeof(uint64_t), &l_kind, sizeof(uint32_t)); + memcpy(l_buf + sizeof(uint64_t) + sizeof(uint32_t), a_public_key->data, p.CRYPTO_PUBLICKEYBYTES); if(a_buflen_out) *a_buflen_out = l_buflen; return l_buf; @@ -353,11 +363,11 @@ dilithium_private_key_t* dap_enc_dilithium_read_private_key(const uint8_t *a_buf } // Dirty hack to recognize old variant - if (a_buflen +8 == (sizeof(uint64_t) + sizeof(dilithium_kind_t))){ + if (a_buflen +8 == (sizeof(uint64_t) + sizeof(uint32_t))){ return dap_enc_dilithium_read_private_key_old(a_buf,a_buflen); } - if(a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t))){ + if(a_buflen < (sizeof(uint64_t) + sizeof(uint32_t))){ log_it(L_ERROR,"::read_private_key() Buflen %zd is smaller than first two fields(%zd)", a_buflen,sizeof(uint64_t) + sizeof(dilithium_kind_t) ); return NULL; } @@ -365,24 +375,24 @@ dilithium_private_key_t* dap_enc_dilithium_read_private_key(const uint8_t *a_buf dilithium_kind_t kind; uint64_t l_buflen = 0; memcpy(&l_buflen, a_buf, sizeof(uint64_t)); - memcpy(&kind, a_buf + sizeof(uint64_t), sizeof(dilithium_kind_t)); if(l_buflen != (uint64_t) a_buflen) return NULL; + memcpy(&kind, a_buf + sizeof(uint64_t), sizeof(uint32_t)); dilithium_param_t p; if(!dilithium_params_init(&p, kind)) return NULL; - if(a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_SECRETKEYBYTES ) ){ + if(a_buflen < (sizeof(uint64_t) + sizeof(uint32_t) + p.CRYPTO_SECRETKEYBYTES ) ){ log_it(L_ERROR,"::read_private_key() Buflen %zd is smaller than all fields together(%zd)", a_buflen, - sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_SECRETKEYBYTES ); + sizeof(uint64_t) + sizeof(uint32_t) + p.CRYPTO_SECRETKEYBYTES ); return NULL; } dilithium_private_key_t* l_private_key = DAP_NEW(dilithium_private_key_t); l_private_key->kind = kind; - l_private_key->data = DAP_NEW_SIZE(unsigned char, p.CRYPTO_SECRETKEYBYTES); - memcpy(l_private_key->data, a_buf + sizeof(uint64_t) + sizeof(dilithium_kind_t), p.CRYPTO_SECRETKEYBYTES); + l_private_key->data = DAP_NEW_SIZE(byte_t, p.CRYPTO_SECRETKEYBYTES); + memcpy(l_private_key->data, a_buf + sizeof(uint64_t) + sizeof(uint32_t), p.CRYPTO_SECRETKEYBYTES); return l_private_key; } @@ -428,43 +438,43 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key(const uint8_t *a_buf, log_it(L_ERROR,"::read_public_key() NULL buffer on input"); return NULL; } - if( a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t))){ - log_it(L_ERROR,"::read_public_key() Buflen %zd is smaller than first two fields(%zd)", a_buflen,sizeof(uint64_t) + sizeof(dilithium_kind_t) ); + if( a_buflen < (sizeof(uint64_t) + sizeof(uint32_t))){ + log_it(L_ERROR,"::read_public_key() Buflen %zd is smaller than first two fields(%zd)", a_buflen,sizeof(uint64_t) + sizeof(uint32_t) ); return NULL; } - dilithium_kind_t kind = 0; + uint32_t kind = 0; uint64_t l_buflen = 0; memcpy(&l_buflen, a_buf, sizeof(uint64_t)); - memcpy(&kind, a_buf + sizeof(uint64_t), sizeof(dilithium_kind_t)); - - if(l_buflen != (uint64_t) a_buflen){ - if (l_buflen <<32 >>32 != (uint64_t) a_buflen ){ - log_it(L_ERROR,"::read_public_key() Buflen field inside buffer is %"DAP_UINT64_FORMAT_U" when expected to be %" DAP_UINT64_FORMAT_U, - l_buflen,(uint64_t) a_buflen); + if (l_buflen != a_buflen) { + if (l_buflen << 32 >> 32 != a_buflen) { + log_it(L_ERROR,"::read_public_key() Buflen field inside buffer is %"DAP_UINT64_FORMAT_U" when expected to be %"DAP_UINT64_FORMAT_U, + l_buflen, (uint64_t)a_buflen); return NULL; - }else - l_buflen = l_buflen<<32 >>32; + }else { + memcpy(&kind, a_buf + sizeof(uint32_t), sizeof(uint32_t)); + } + } else { + memcpy(&kind, a_buf + sizeof(uint64_t), sizeof(uint32_t)); } - dilithium_param_t p; - + dilithium_param_t p; if(!dilithium_params_init(&p, kind)){ log_it(L_ERROR,"::read_public_key() Can't find params for signature kind %d", kind); return NULL; } // Dirty hack to recognize old variant - if (a_buflen +8 == (sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_PUBLICKEYBYTES )){ + if (a_buflen +8 == (sizeof(uint64_t) + sizeof(uint32_t) + p.CRYPTO_PUBLICKEYBYTES )){ return dap_enc_dilithium_read_public_key_old(a_buf,a_buflen); } // Dirty hack to recognize old variant 2 - if (a_buflen +4 == (sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_PUBLICKEYBYTES )){ + if (a_buflen +4 == (sizeof(uint64_t) + sizeof(uint32_t) + p.CRYPTO_PUBLICKEYBYTES )){ return dap_enc_dilithium_read_public_key_old2(a_buf,a_buflen); } - if(a_buflen < (sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_PUBLICKEYBYTES ) ){ + if(a_buflen < (sizeof(uint64_t) + sizeof(uint32_t) + p.CRYPTO_PUBLICKEYBYTES ) ){ log_it(L_ERROR,"::read_public_key() Buflen %zd is smaller than all fields together(%zd)", a_buflen, - sizeof(uint64_t) + sizeof(dilithium_kind_t) + p.CRYPTO_PUBLICKEYBYTES ); + sizeof(uint64_t) + sizeof(uint32_t) + p.CRYPTO_PUBLICKEYBYTES ); return NULL; } @@ -482,7 +492,7 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key(const uint8_t *a_buf, return NULL; } - memcpy(l_public_key->data, a_buf + sizeof(uint64_t) + sizeof(dilithium_kind_t), p.CRYPTO_PUBLICKEYBYTES); + memcpy(l_public_key->data, a_buf + sizeof(uint64_t) + sizeof(uint32_t), p.CRYPTO_PUBLICKEYBYTES); return l_public_key; } @@ -561,7 +571,7 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key_old2(const uint8_t *a_ return NULL; dilithium_param_t p; if(!dilithium_params_init(&p,(dilithium_kind_t) kind)){ - log_it(L_ERROR,"::read_public_key_old2() Can't find params for signature kind %d", kind); + log_it(L_ERROR,"::read_public_key_old2() Can't find params for signature kind %zu", kind); return NULL; } diff --git a/dap-sdk/crypto/src/dap_enc_iaes.c b/dap-sdk/crypto/src/dap_enc_iaes.c index 29ef751860de7e58f12962727451d8b7b8d6981f..e9652a63a610c4664e020c4e3d236db34064f6c4 100755 --- a/dap-sdk/crypto/src/dap_enc_iaes.c +++ b/dap-sdk/crypto/src/dap_enc_iaes.c @@ -126,7 +126,7 @@ size_t dap_enc_iaes256_cbc_decrypt_fast(struct dap_enc_key * a_key, const void * size_t l_padding_size = ((uint8_t *)data)[a_in_size - 1]; if(l_padding_size > a_in_size){ - log_it(L_WARNING, "%s: padding size is %u while whole message is just %u", __PRETTY_FUNCTION__, l_padding_size, a_in_size); + log_it(L_WARNING, "%s: padding size is %zu while whole message is just %zu", __PRETTY_FUNCTION__, l_padding_size, a_in_size); return 0; }else{ return a_in_size - l_padding_size; diff --git a/dap-sdk/crypto/src/dap_enc_key.c b/dap-sdk/crypto/src/dap_enc_key.c index 8d4c458ae07f8f42cae459bfb52610cc448de940..9cbca73323abdd9fbf4f5d981c0eab6729770805 100755 --- a/dap-sdk/crypto/src/dap_enc_key.c +++ b/dap-sdk/crypto/src/dap_enc_key.c @@ -727,7 +727,7 @@ dap_enc_key_t* dap_enc_key_dup(dap_enc_key_t * a_key) dap_enc_key_t* dap_enc_key_deserealize(const void *buf, size_t buf_size) { if(buf_size != sizeof (dap_enc_key_serealize_t)) { - log_it(L_ERROR, "Key can't be deserealize. buf_size(%d) != sizeof (dap_enc_key_serealize_t)(%d)",buf_size,sizeof (dap_enc_key_serealize_t)); + log_it(L_ERROR, "Key can't be deserealize. buf_size(%zu) != sizeof (dap_enc_key_serealize_t)(%zu)",buf_size,sizeof (dap_enc_key_serealize_t)); return NULL; } const dap_enc_key_serealize_t *in_key = (const dap_enc_key_serealize_t *)buf; @@ -760,7 +760,7 @@ dap_enc_key_t* dap_enc_key_deserealize(const void *buf, size_t buf_size) dap_enc_key_t *dap_enc_key_new(dap_enc_key_type_t a_key_type) { dap_enc_key_t * ret = NULL; - if(a_key_type < c_callbacks_size ){ + if ((size_t)a_key_type < c_callbacks_size) { ret = DAP_NEW_Z(dap_enc_key_t); if(s_callbacks[a_key_type].new_callback){ s_callbacks[a_key_type].new_callback(ret); @@ -786,7 +786,7 @@ dap_enc_key_t *dap_enc_key_new_generate(dap_enc_key_type_t a_key_type, const voi size_t seed_size, size_t key_size) { dap_enc_key_t * ret = NULL; - if(a_key_type< c_callbacks_size ) { + if ((size_t)a_key_type < c_callbacks_size) { ret = dap_enc_key_new(a_key_type); if(s_callbacks[a_key_type].new_generate_callback) { s_callbacks[a_key_type].new_generate_callback( ret, kex_buf, kex_size, seed, seed_size, key_size); diff --git a/dap-sdk/crypto/src/dap_enc_ringct20.c b/dap-sdk/crypto/src/dap_enc_ringct20.c index 047b7c967960569ed9287a077fb3df07d6dceea0..a0815efcd34d460975fa08c269f8739aace1ac6e 100644 --- a/dap-sdk/crypto/src/dap_enc_ringct20.c +++ b/dap-sdk/crypto/src/dap_enc_ringct20.c @@ -347,8 +347,7 @@ int ringct20_crypto_sign_open_with_pbkList(const unsigned char * msg, const unsi if(sig->sig_len < sizeof(DAP_RINGCT20_SIGN_SECURITY) + sizeof(wLenSig)) return -1; DAP_RINGCT20_SIGN_SECURITY sec_kind = *(DAP_RINGCT20_SIGN_SECURITY*)sig->sig_data; - wLenSig = *(typeof (&wLenSig))(sig->sig_data + sizeof(DAP_RINGCT20_SIGN_SECURITY)); - + wLenSig = *(int *)(sig->sig_data + sizeof(DAP_RINGCT20_SIGN_SECURITY)); if(wpbkList != 0 && wLenSig != wpbkList) { return -1; diff --git a/dap-sdk/crypto/src/dap_enc_salsa2012.c b/dap-sdk/crypto/src/dap_enc_salsa2012.c index 1e0ed1973bdafb3ecc6c2268445a9ce8e41a9709..23c101faa037fb6a72c867143bfea3ec2daae20d 100644 --- a/dap-sdk/crypto/src/dap_enc_salsa2012.c +++ b/dap-sdk/crypto/src/dap_enc_salsa2012.c @@ -61,6 +61,7 @@ void dap_enc_salsa2012_key_delete(struct dap_enc_key *a_key) //a_key->priv_key_data_size = 0; } +//------SALSA2012----------- /** * @brief dap_enc_salsa2012_key_new * diff --git a/dap-sdk/crypto/src/dap_hash.c b/dap-sdk/crypto/src/dap_hash.c index 9360ef298b036f326fbf3f721118a7ffc905ec11..a826d81f6f468bd7d6301d41314484a47283b942 100755 --- a/dap-sdk/crypto/src/dap_hash.c +++ b/dap-sdk/crypto/src/dap_hash.c @@ -43,13 +43,15 @@ int dap_chain_hash_fast_from_str( const char * a_hash_str, dap_chain_hash_fast_t size_t l_hash_str_len = strlen( a_hash_str); if ( l_hash_str_len + 1 == c_hash_str_size ){ for(size_t l_offset = 2; l_offset < l_hash_str_len; l_offset += 2) { - if(sscanf(a_hash_str + l_offset, "%02hhx", a_hash->raw + l_offset / 2 - 1) != 1) { - if(sscanf(a_hash_str + l_offset, "%02hhX", a_hash->raw + l_offset / 2 - 1) != 1) { - log_it(L_ERROR, "dap_chain_str_to_hash_fast parse error: offset=%u, hash_str_len=%u, str=\"%2s\"", + char l_byte; + if(dap_sscanf(a_hash_str + l_offset, "%02hhx", &l_byte) != 1) { + if(dap_sscanf(a_hash_str + l_offset, "%02hhx", &l_byte) != 1) { + log_it(L_ERROR, "dap_chain_str_to_hash_fast parse error: offset=%zu, hash_str_len=%zu, str=\"%2s\"", l_offset, l_hash_str_len, a_hash_str + l_offset); return -10 * ((int) l_offset); // Wrong char } } + *(a_hash->raw + l_offset / 2 - 1) = l_byte; } return 0; }else // Wromg string len diff --git a/dap-sdk/crypto/src/dap_sign.c b/dap-sdk/crypto/src/dap_sign.c index 5d798691e5e1bbf9dfd7e7f71c30a1f0b7ad4f22..ff77a020c336b6e09d0f9ed8a82885483de67e4c 100755 --- a/dap-sdk/crypto/src/dap_sign.c +++ b/dap-sdk/crypto/src/dap_sign.c @@ -276,7 +276,7 @@ uint8_t* dap_sign_get_sign(dap_sign_t *a_sign, size_t *a_sign_out) if(!a_sign) return NULL; if(a_sign_out) - *a_sign_out = a_sign->header.sign_size; + *a_sign_out = a_sign->header.sign_size; return a_sign->pkey_n_sign + a_sign->header.sign_pkey_size; } @@ -321,8 +321,6 @@ bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_max_key_size) return false; if (a_sign->header.sign_size > a_max_key_size) return false; - if (a_sign->header.sign_pkey_size > a_sign->header.sign_size) - return false; return true; } diff --git a/dap-sdk/crypto/src/sig_dilithium/dilithium_sign.c b/dap-sdk/crypto/src/sig_dilithium/dilithium_sign.c index cd98896c8fad89bb00096bbb1302d0a1106cf6b0..37211cedaad86e92a3378f0208f897fa30b64eea 100755 --- a/dap-sdk/crypto/src/sig_dilithium/dilithium_sign.c +++ b/dap-sdk/crypto/src/sig_dilithium/dilithium_sign.c @@ -314,7 +314,7 @@ int dilithium_crypto_sign( dilithium_signature_t *sig, const unsigned char *m, u return 0; } - +#include "dap_hash.h" /*************************************************/ int dilithium_crypto_sign_open( unsigned char *m, unsigned long long mlen, dilithium_signature_t *sig, const dilithium_public_key_t * public_key) { diff --git a/dap-sdk/crypto/test/crypto/CMakeLists.txt b/dap-sdk/crypto/test/crypto/CMakeLists.txt index 78bda0e36f8304a3c8e84ef4416dc217ba8f2121..cc132aa8dd3e4a68b24946930966c1bd3aa5de94 100755 --- a/dap-sdk/crypto/test/crypto/CMakeLists.txt +++ b/dap-sdk/crypto/test/crypto/CMakeLists.txt @@ -1,6 +1,27 @@ cmake_minimum_required(VERSION 3.0) project(crypto-test) +# init CellFrame SDK +add_definitions("-DDAP_VERSION=\"${CPACK_PACKAGE_VERSION_MAJOR}-${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}\"") +set(SUBMODULES_NO_BUILD ON) +include (cellframe-sdk/cmake/OS_Detection.cmake) +set(DAPSDK_MODULES "core crypto network-core network-client network-server") + +if( DARWIN) + add_subdirectory(cellframe-sdk/3rdparty/json-c-darwin) + add_subdirectory(cellframe-sdk/3rdparty/libmagic-darwin) + include_directories(cellframe-sdk/3rdparty/json-c-darwin) +endif() +if (ANDROID) + add_subdirectory(cellframe-sdk/3rdparty/libmagic) + add_subdirectory(cellframe-sdk/3rdparty/json-c) + include_directories(cellframe-sdk/cellframe-sdk/3rdparty/) +endif() + +#add_subdirectory(cellframe-sdk/dap-sdk) +#enable_testing() +add_subdirectory(test) + if ( NOT ( TARGET dap_core ) ) #add_subdirectory(libdap) @@ -14,7 +35,7 @@ file(GLOB SRC *.h *.c) add_executable(${PROJECT_NAME} ${SRC}) -target_link_libraries(${PROJECT_NAME} dap_test dap_core dap_crypto -lm) +target_link_libraries(${PROJECT_NAME} dap_test dap_core dap_crypto m) add_test( NAME crypto-test diff --git a/dap-sdk/crypto/test/crypto/cellframe-sdk b/dap-sdk/crypto/test/crypto/cellframe-sdk new file mode 120000 index 0000000000000000000000000000000000000000..11a54ed360106c9f6a2dbbdab67c7c5bd84ae617 --- /dev/null +++ b/dap-sdk/crypto/test/crypto/cellframe-sdk @@ -0,0 +1 @@ +../../../../ \ No newline at end of file diff --git a/dap-sdk/crypto/test/crypto/dap_enc_dilithium_test.c b/dap-sdk/crypto/test/crypto/dap_enc_dilithium_test.c index 1e39e1ece3d8aa7746ad43145448c58e015091b8..24dab379ad66203f45610a85688fcd7c8a4ffefc 100755 --- a/dap-sdk/crypto/test/crypto/dap_enc_dilithium_test.c +++ b/dap-sdk/crypto/test/crypto/dap_enc_dilithium_test.c @@ -1,7 +1,7 @@ #include "rand/dap_rand.h" #include "dap_enc_dilithium_test.h" #include "dap_enc_dilithium.h" -#include "../sig_dilithium/dilithium_params.h" +#include "dap_sign.h" static void test_signing_verifying(void) { @@ -33,6 +33,29 @@ static void test_signing_verifying(void) dap_enc_key_delete(key); } +static void test_signing_verifying_serial(void) +{ + size_t seed_size = sizeof(uint8_t); + uint8_t seed[seed_size]; + + randombytes(seed, seed_size); + + dap_enc_key_t *key = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_SIG_DILITHIUM, NULL, 0, seed, seed_size, 0); + + size_t source_size = 1 + random_uint32_t(20); + uint8_t source[source_size]; + randombytes(source, source_size); + + dap_sign_t *sign = dap_sign_create(key, source, source_size, 0); + dap_assert_PIF(sign > 0, "Signing message and serialize"); + + int verify = dap_sign_verify(sign, source, source_size); + dap_assert_PIF(verify == 1, "Deserialize and verifying signature"); + + free(sign); + dap_enc_key_delete(key); +} + static void init_test_case() { srand((uint32_t) time(NULL)); @@ -51,6 +74,8 @@ void dap_enc_dilithium_tests_run() benchmark_mgs_time("Signing and verifying message 1 time", benchmark_test_time(test_signing_verifying, 1)); + benchmark_mgs_time("Signing and verifying message with serialization 1 time", benchmark_test_time(test_signing_verifying_serial, 1)); + cleanup_test_case(); } diff --git a/dap-sdk/crypto/test/crypto/dap_enc_sign_multi_test.c b/dap-sdk/crypto/test/crypto/dap_enc_sign_multi_test.c index ffb2c87b5c6d7d3088639b2cc2443721ceb230c9..373b8fa164fab234ef39ebc9c632662f66f50d9c 100755 --- a/dap-sdk/crypto/test/crypto/dap_enc_sign_multi_test.c +++ b/dap-sdk/crypto/test/crypto/dap_enc_sign_multi_test.c @@ -8,7 +8,7 @@ static void test_signing_verifying(void) { - size_t seed_size = sizeof(uint8_t); + size_t seed_size = 10; uint8_t seed[seed_size]; randombytes(seed, seed_size); diff --git a/dap-sdk/crypto/test/crypto/dap_enc_test.c b/dap-sdk/crypto/test/crypto/dap_enc_test.c index 38fa4499dbceaddad9668e5dc47efba8de57aac2..12e46f001591dbd6f92ece43288f513c7cc38da8 100755 --- a/dap-sdk/crypto/test/crypto/dap_enc_test.c +++ b/dap-sdk/crypto/test/crypto/dap_enc_test.c @@ -10,7 +10,8 @@ #include "dap_enc_tesla.h" #include "dap_enc_dilithium.h" #include "dap_enc.h" -#include "dap_test.h" + +int get_cur_time_msec(); #define TEST_SER_FILE_NAME "keystorage.txt" void test_encypt_decrypt(int count_steps, const dap_enc_key_type_t key_type, const int cipher_key_size) diff --git a/dap-sdk/crypto/test/crypto/main.c b/dap-sdk/crypto/test/crypto/main.c index 0312dab8dbadd91332f9f601115937a6d81a7ee1..98e8b69284a10e1bcc93b18e3435c523675be70c 100755 --- a/dap-sdk/crypto/test/crypto/main.c +++ b/dap-sdk/crypto/test/crypto/main.c @@ -21,7 +21,6 @@ int main(void) dap_log_level_set(L_CRITICAL); const int test_numbers = 100; // dap_enc_ringct20_tests_run(test_numbers);//return 0; - dap_enc_multi_sign_tests_run(); dap_enc_newhope_tests_run(test_numbers); test_encypt_decrypt (test_numbers, DAP_ENC_KEY_TYPE_SALSA2012, 32); test_encypt_decrypt_fast (test_numbers, DAP_ENC_KEY_TYPE_SALSA2012, 32); @@ -52,5 +51,5 @@ int main(void) dap_enc_base58_tests_run(); dap_enc_defeo_tests_run(); dap_enc_tesla_tests_run(); - + dap_enc_multi_sign_tests_run(); } diff --git a/dap-sdk/crypto/test/crypto/test b/dap-sdk/crypto/test/crypto/test new file mode 120000 index 0000000000000000000000000000000000000000..f6dbabb9ec640ed34e1caec901c0d8ba6d4ca778 --- /dev/null +++ b/dap-sdk/crypto/test/crypto/test @@ -0,0 +1 @@ +../../../../../test/libdap-test \ No newline at end of file diff --git a/dap-sdk/net/client/dap_client_http.c b/dap-sdk/net/client/dap_client_http.c index fc58b1836335fe1f11f3697d1eaee835d2d3c3f2..7d30903f6abc65f641b265a69423c8664909b8db 100644 --- a/dap-sdk/net/client/dap_client_http.c +++ b/dap-sdk/net/client/dap_client_http.c @@ -24,10 +24,10 @@ #include <errno.h> #include <fcntl.h> +#include "dap_net.h" #include "dap_common.h" #include "dap_strfuncs.h" #include "dap_string.h" -#include "dap_net.h" #include "dap_events_socket.h" #include "dap_timerfd.h" #include "dap_stream_ch_proc.h" @@ -85,8 +85,10 @@ typedef struct dap_http_client_internal { #define PVT(a) (a ? (dap_client_http_pvt_t *) (a)->_inheritor : NULL) -static void s_http_connected(dap_events_socket_t * a_esocket); // Connected callback +static void s_http_connected(dap_events_socket_t * a_esocket); // Connected +#ifndef DAP_NET_CLIENT_NO_SSL static void s_http_ssl_connected(dap_events_socket_t * a_esocket); // connected SSL callback +#endif static void s_client_http_delete(dap_client_http_pvt_t * a_http_pvt); static void s_http_read(dap_events_socket_t * a_es, void * arg); static void s_http_error(dap_events_socket_t * a_es, int a_arg); @@ -197,7 +199,7 @@ static bool s_timer_timeout_after_connected_check(void * a_arg) l_http_pvt->were_callbacks_called = true; } l_http_pvt->is_closed_by_timeout = true; - log_it(L_INFO, "Close %s sock %u type %d by timeout", + log_it(L_INFO, "Close %s sock %"DAP_FORMAT_SOCKET" type %d by timeout", l_es->remote_addr_str ? l_es->remote_addr_str : "", l_es->socket, l_es->type); dap_events_socket_remove_and_delete_unsafe(l_es, true); } @@ -233,12 +235,12 @@ static bool s_timer_timeout_check(void * a_arg) l_http_pvt->were_callbacks_called = true; } l_http_pvt->is_closed_by_timeout = true; - log_it(L_INFO, "Close %s sock %u type %d by timeout", + log_it(L_INFO, "Close %s sock %"DAP_FORMAT_SOCKET" type %d by timeout", l_es->remote_addr_str ? l_es->remote_addr_str : "", l_es->socket, l_es->type); dap_events_socket_remove_and_delete_unsafe(l_es, true); }else if(s_debug_more) - log_it(L_DEBUG,"Socket %d is connected, close check timer", l_es->socket); + log_it(L_DEBUG,"Socket %"DAP_FORMAT_SOCKET" is connected, close check timer", l_es->socket); }else if(s_debug_more) log_it(L_DEBUG,"Esocket %"DAP_UINT64_FORMAT_U" is finished, close check timer", *l_es_uuid); @@ -254,6 +256,7 @@ static bool s_timer_timeout_check(void * a_arg) */ static void s_http_read(dap_events_socket_t * a_es, void * arg) { + UNUSED(arg); dap_client_http_pvt_t * l_http_pvt = PVT(a_es); if(!l_http_pvt) { log_it(L_ERROR, "s_http_read: l_client_http_internal is NULL!"); @@ -267,7 +270,7 @@ static void s_http_read(dap_events_socket_t * a_es, void * arg) // if buffer is overfull then read once more if(l_http_pvt->response_size >= DAP_CLIENT_HTTP_RESPONSE_SIZE_MAX) { - log_it(L_ERROR, "s_http_read response_size(%d) overfull!!!", l_http_pvt->response_size); + log_it(L_ERROR, "s_http_read response_size(%zu) overfull!!!", l_http_pvt->response_size); } // search http header @@ -342,9 +345,9 @@ static void s_http_error(dap_events_socket_t * a_es, int a_errno) strncpy(l_errbuf,"Unknown Error", sizeof (l_errbuf)-1); if (a_es->flags & DAP_SOCK_CONNECTING){ - log_it(L_WARNING, "Socket %d connecting error: %s (code %d)" , a_es->socket, l_errbuf, a_errno); + log_it(L_WARNING, "Socket %"DAP_FORMAT_SOCKET" connecting error: %s (code %d)" , a_es->socket, l_errbuf, a_errno); }else - log_it(L_WARNING, "Socket %d error: %s (code %d)", a_es->socket, l_errbuf, a_errno); + log_it(L_WARNING, "Socket %"DAP_FORMAT_SOCKET" error: %s (code %d)", a_es->socket, l_errbuf, a_errno); dap_client_http_pvt_t * l_client_http_internal = PVT(a_es); @@ -384,13 +387,13 @@ static void s_es_delete(dap_events_socket_t * a_es, void * a_arg) log_it(L_INFO, "Remote server replied without no content legth but we have the response %zd bytes size", l_response_size); - l_client_http_internal->error_callback(-10 , l_client_http_internal->obj); + //l_client_http_internal->error_callback(-10 , l_client_http_internal->obj); -/* if(l_client_http_internal->response_callback) + if(l_client_http_internal->response_callback) l_client_http_internal->response_callback( l_client_http_internal->response + l_client_http_internal->header_length, l_response_size, - l_client_http_internal->obj);*/ + l_client_http_internal->obj); l_client_http_internal->were_callbacks_called = true; }else if (l_client_http_internal->response_size){ log_it(L_INFO, "Remote server disconnected with reply. Body is empty, only headers are in"); @@ -520,7 +523,7 @@ void* dap_client_http_request_custom(dap_worker_t * a_worker, const char *a_upli dap_events_socket_t *l_ev_socket = dap_events_socket_wrap_no_add(dap_events_get_default(), l_socket, &l_s_callbacks); - log_it(L_DEBUG,"Created client request socket %d", l_socket); + log_it(L_DEBUG,"Created client request socket %"DAP_FORMAT_SOCKET, l_socket); // create private struct dap_client_http_pvt_t *l_http_pvt = DAP_NEW_Z(dap_client_http_pvt_t); l_ev_socket->_inheritor = l_http_pvt; @@ -605,7 +608,7 @@ void* dap_client_http_request_custom(dap_worker_t * a_worker, const char *a_upli } return l_http_pvt; } else { - log_it(L_ERROR, "Socket %d connecting error: %d", l_ev_socket->socket, l_err2); + log_it(L_ERROR, "Socket %zu connecting error: %d", l_ev_socket->socket, l_err2); s_client_http_delete( l_http_pvt); l_ev_socket->_inheritor = NULL; dap_events_socket_delete_unsafe( l_ev_socket, true); @@ -642,6 +645,7 @@ void* dap_client_http_request_custom(dap_worker_t * a_worker, const char *a_upli return NULL; } #endif + return NULL; } #ifndef DAP_NET_CLIENT_NO_SSL @@ -678,10 +682,9 @@ static void s_http_connected(dap_events_socket_t * a_esocket) assert(a_esocket); dap_client_http_pvt_t * l_http_pvt = PVT(a_esocket); assert(l_http_pvt); - dap_worker_t *l_worker = l_http_pvt->worker; - assert(l_worker); + assert(l_http_pvt->worker); - log_it(L_INFO, "Remote address connected (%s:%u) with sock_id %d", l_http_pvt->uplink_addr, l_http_pvt->uplink_port, a_esocket->socket); + log_it(L_INFO, "Remote address connected (%s:%u) with sock_id %"DAP_FORMAT_SOCKET, l_http_pvt->uplink_addr, l_http_pvt->uplink_port, a_esocket->socket); // add to dap_worker //dap_client_pvt_t * l_client_pvt = (dap_client_pvt_t*) a_obj; //dap_events_new(); @@ -713,7 +716,7 @@ static void s_http_connected(dap_events_socket_t * a_esocket) : 0; // Set request size as Content-Length header - l_offset += dap_snprintf(l_request_headers + l_offset, l_offset2 -= l_offset, "Content-Length: %lu\r\n", l_http_pvt->request_size); + l_offset += dap_snprintf(l_request_headers + l_offset, l_offset2 -= l_offset, "Content-Length: %zu\r\n", l_http_pvt->request_size); } // adding string for GET request diff --git a/dap-sdk/net/client/dap_client_pvt.c b/dap-sdk/net/client/dap_client_pvt.c index 17a66b83ba1da020471036134801ca1fd72463a2..1c722b920415e1274260b59c5b5190f384bf0069 100644 --- a/dap-sdk/net/client/dap_client_pvt.c +++ b/dap-sdk/net/client/dap_client_pvt.c @@ -170,7 +170,7 @@ void dap_client_pvt_delete(dap_client_pvt_t * a_client_pvt) if (!dap_client_pvt_find(a_client_pvt->uuid)) { if(s_debug_more) - log_it(L_DEBUG, "dap_client_pvt 0x%x already deleted", a_client_pvt); + log_it(L_DEBUG, "dap_client_pvt 0x%p already deleted", a_client_pvt); return; } if(a_client_pvt->delete_callback) @@ -181,7 +181,7 @@ void dap_client_pvt_delete(dap_client_pvt_t * a_client_pvt) // delete from list dap_client_pvt_hh_del_unsafe(a_client_pvt); if(s_debug_more) - log_it(L_INFO, "dap_client_pvt_delete 0x%x", a_client_pvt); + log_it(L_INFO, "dap_client_pvt_delete 0x%p", a_client_pvt); if(a_client_pvt->uplink_addr) DAP_DELETE(a_client_pvt->uplink_addr); @@ -210,7 +210,7 @@ void dap_client_pvt_delete(dap_client_pvt_t * a_client_pvt) */ static void s_stream_connected(dap_client_pvt_t * a_client_pvt) { - log_it(L_INFO, "Remote address connected for streaming on (%s:%u) with sock_id %d (assign on worker #%u)", a_client_pvt->uplink_addr, + log_it(L_INFO, "Remote address connected for streaming on (%s:%u) with sock_id %"DAP_FORMAT_SOCKET" (assign on worker #%u)", a_client_pvt->uplink_addr, a_client_pvt->uplink_port, a_client_pvt->stream_socket, a_client_pvt->stream_worker->worker->id); a_client_pvt->stage_status = STAGE_STATUS_DONE; s_stage_status_after(a_client_pvt); @@ -218,7 +218,7 @@ static void s_stream_connected(dap_client_pvt_t * a_client_pvt) assert(a_client_pvt->stream_es); *l_es_uuid_ptr = a_client_pvt->stream_es->uuid; if( dap_timerfd_start_on_worker(a_client_pvt->stream_es->worker, s_client_timeout_read_after_connect_seconds * 1000, s_stream_timer_timeout_after_connected_check ,l_es_uuid_ptr) == NULL ){ - log_it(L_ERROR,"Can't run timer for stream after connect check for esocket uuid %"DAP_UINT64_FORMAT_U" "); + log_it(L_ERROR,"Can't run timer for stream after connect check for esocket uuid %"DAP_UINT64_FORMAT_U, *l_es_uuid_ptr); DAP_DEL_Z(l_es_uuid_ptr); } } @@ -246,7 +246,7 @@ static bool s_stream_timer_timeout_check(void * a_arg) if(l_es->callbacks.error_callback) { l_es->callbacks.error_callback(l_es,ETIMEDOUT); } - log_it(L_INFO, "Close %s sock %u type %d by timeout", + log_it(L_INFO, "Close %s sock %"DAP_FORMAT_SOCKET" type %d by timeout", l_es->remote_addr_str ? l_es->remote_addr_str : "", l_es->socket, l_es->type); dap_client_delete_unsafe(l_client_pvt->client); } else { @@ -255,7 +255,7 @@ static bool s_stream_timer_timeout_check(void * a_arg) } }else if(s_debug_more) - log_it(L_DEBUG,"Socket %d is connected, close check timer", l_es->socket); + log_it(L_DEBUG,"Socket %"DAP_FORMAT_SOCKET" is connected, close check timer", l_es->socket); }else if(s_debug_more) log_it(L_DEBUG,"Esocket %"DAP_UINT64_FORMAT_U" is finished, close check timer", *l_es_uuid_ptr); @@ -289,12 +289,12 @@ static bool s_stream_timer_timeout_after_connected_check(void * a_arg) if(l_es->callbacks.error_callback) { l_es->callbacks.error_callback(l_es,ETIMEDOUT); } - log_it(L_INFO, "Close streaming socket %s by timeout", + log_it(L_INFO, "Close streaming socket %s (%"DAP_FORMAT_SOCKET") by timeout", l_es->remote_addr_str ? l_es->remote_addr_str : "", l_es->socket); dap_client_delete_unsafe(l_client_pvt->client); }else if(s_debug_more) - log_it(L_DEBUG,"Streaming socket %d is connected, close check timer", l_es->socket); + log_it(L_DEBUG,"Streaming socket %"DAP_FORMAT_SOCKET" is connected, close check timer", l_es->socket); } else { log_it(L_ERROR,"Activity timeout for unexistent client"); dap_events_socket_remove_and_delete_unsafe(l_es,true); @@ -396,7 +396,7 @@ static bool s_stage_status_after(dap_client_pvt_t * a_client_pvt) // DAP_ENC_DATA_TYPE_B64_URLSAFE not need because send it by POST request size_t l_data_str_enc_size = dap_enc_base64_encode(l_data, l_key_size + l_sign_size, l_data_str, DAP_ENC_DATA_TYPE_B64); if(s_debug_more) - log_it(L_DEBUG, "ENC request size %u", l_data_str_enc_size); + log_it(L_DEBUG, "ENC request size %zu", l_data_str_enc_size); char l_enc_init_url[1024] = { '\0' }; dap_snprintf(l_enc_init_url, sizeof(l_enc_init_url), DAP_UPLINK_PATH_ENC_INIT @@ -416,7 +416,7 @@ static bool s_stage_status_after(dap_client_pvt_t * a_client_pvt) char *l_request = dap_strdup_printf("%d", DAP_CLIENT_PROTOCOL_VERSION); size_t l_request_size = dap_strlen(l_request); if(s_debug_more) - log_it(L_DEBUG, "STREAM_CTL request size %u", strlen(l_request)); + log_it(L_DEBUG, "STREAM_CTL request size %zu", strlen(l_request)); char *l_suburl; @@ -462,10 +462,8 @@ static bool s_stage_status_after(dap_client_pvt_t * a_client_pvt) #ifdef DAP_OS_WINDOWS u_long l_socket_flags = 1; if (ioctlsocket(a_client_pvt->stream_socket, (long)FIONBIO, &l_socket_flags) == SOCKET_ERROR) { - log_it(L_ERROR, "Can't set socket %d to nonblocking mode, error %d", a_client_pvt->stream_socket, WSAGetLastError()); + log_it(L_ERROR, "Can't set socket %zu to nonblocking mode, error %d", a_client_pvt->stream_socket, WSAGetLastError()); } - int buffsize = 0x40000; - int optsize = sizeof( int ); #else // Get socket flags int l_socket_flags = fcntl(a_client_pvt->stream_socket, F_GETFL); @@ -538,8 +536,8 @@ static bool s_stage_status_after(dap_client_pvt_t * a_client_pvt) strerror_r(l_err,l_errbuf,sizeof (l_errbuf)); else strncpy(l_errbuf,"Unknown Error",sizeof(l_errbuf)-1); - log_it(L_ERROR, "Remote address can't connect (%s:%u) with sock_id %d: \"%s\" (code %d)", a_client_pvt->uplink_addr, - a_client_pvt->uplink_port, l_errbuf, l_err); + log_it(L_ERROR, "Remote address can't connect (%s:%hu) with sock_id %"DAP_FORMAT_SOCKET": \"%s\" (code %d)", a_client_pvt->uplink_addr, + a_client_pvt->uplink_port, a_client_pvt->stream_es->socket, l_errbuf, l_err); #ifdef DAP_OS_WINDOWS closesocket(a_client_pvt->stream_socket); #else @@ -1026,7 +1024,7 @@ static void s_enc_init_response(dap_client_t * a_client, void * a_response, size dap_client_get_stage_str(a_client), dap_client_get_stage_status_str(a_client)); } } else { - log_it(L_ERROR, "ENC: Wrong response (size %u data '%s')", a_response_size, (char* ) a_response); + log_it(L_ERROR, "ENC: Wrong response (size %zu data '%s')", a_response_size, (char* ) a_response); l_client_pvt->last_error = ERROR_ENC_NO_KEY; l_client_pvt->stage_status = STAGE_STATUS_ERROR; s_stage_status_after(l_client_pvt); @@ -1035,12 +1033,12 @@ static void s_enc_init_response(dap_client_t * a_client, void * a_response, size DAP_DELETE(l_session_id_b64); DAP_DELETE(l_bob_message_b64); } else if(a_response_size > 1) { - log_it(L_ERROR, "ENC: Wrong response (size %u data '%s')", a_response_size, (char* ) a_response); + log_it(L_ERROR, "ENC: Wrong response (size %zu data '%s')", a_response_size, (char* ) a_response); l_client_pvt->last_error = ERROR_ENC_NO_KEY; l_client_pvt->stage_status = STAGE_STATUS_ERROR; s_stage_status_after(l_client_pvt); } else { - log_it(L_ERROR, "ENC: Wrong response (size %u)", a_response_size); + log_it(L_ERROR, "ENC: Wrong response (size %zu)", a_response_size); l_client_pvt->last_error = ERROR_ENC_NO_KEY; l_client_pvt->stage_status = STAGE_STATUS_ERROR; s_stage_status_after(l_client_pvt); @@ -1077,7 +1075,7 @@ static void s_stream_ctl_response(dap_client_t * a_client, void * a_data, size_t dap_client_pvt_t *l_client_pvt = dap_client_pvt_find(a_client->pvt_uuid); if (!l_client_pvt) return; if(s_debug_more) - log_it(L_DEBUG, "STREAM_CTL response %u bytes length recieved", a_data_size); + log_it(L_DEBUG, "STREAM_CTL response %zu bytes length recieved", a_data_size); char * l_response_str = DAP_NEW_Z_SIZE(char, a_data_size + 1); memcpy(l_response_str, a_data, a_data_size); @@ -1124,7 +1122,8 @@ static void s_stream_ctl_response(dap_client_t * a_client, void * a_data, size_t if(l_client_pvt->stream_key) dap_enc_key_delete(l_client_pvt->stream_key); - strncpy(l_client_pvt->stream_id, l_stream_id, sizeof(l_client_pvt->stream_id) - 1); + strncpy(l_client_pvt->stream_id, (char *)l_stream_id, sizeof(l_client_pvt->stream_id) -1 ); + l_client_pvt->stream_id[sizeof(l_client_pvt->stream_id) - 1] = '\0'; l_client_pvt->stream_key = dap_enc_key_new_generate(l_enc_type, l_stream_key, strlen(l_stream_key), NULL, 0, 32); @@ -1187,7 +1186,7 @@ static void s_stream_response(dap_client_t * a_client, void * a_data, size_t a_d dap_client_pvt_t * l_client_pvt = DAP_CLIENT_PVT(a_client); assert(l_client_pvt); if(s_debug_more) - log_it(L_DEBUG, "STREAM response %u bytes length recieved", a_data_size); + log_it(L_DEBUG, "STREAM response %zu bytes length recieved", a_data_size); // char * l_response_str = DAP_NEW_Z_SIZE(char, a_data_size + 1); // memcpy(l_response_str, a_data, a_data_size); @@ -1248,7 +1247,7 @@ static void s_stream_es_callback_delete(dap_events_socket_t *a_es, void *arg) } if(s_debug_more) - log_it(L_DEBUG, "Delete stream socket for client_pvt=0x%x", l_client_pvt); + log_it(L_DEBUG, "Delete stream socket for client_pvt=0x%p", l_client_pvt); dap_stream_delete(l_client_pvt->stream); if (l_client_pvt->stream_es) { @@ -1281,7 +1280,7 @@ static void s_stream_es_callback_read(dap_events_socket_t * a_es, void * arg) if(l_pos_endl) { if(*(l_pos_endl + 1) == '\n') { dap_events_socket_shrink_buf_in(a_es, l_pos_endl - (char*)a_es->buf_in); - log_it(L_DEBUG, "Header passed, go to streaming (%lu bytes already are in input buffer", + log_it(L_DEBUG, "Header passed, go to streaming (%zu bytes already are in input buffer", a_es->buf_in_size); l_client_pvt->stage = STAGE_STREAM_STREAMING; diff --git a/dap-sdk/net/client/dap_client_pvt_hh.c b/dap-sdk/net/client/dap_client_pvt_hh.c index a469913d0fc854a6cc1aa5ee12a8d49c55bcb6bc..22c0e6869f88fd78f0544a938c755f485cbd0261 100644 --- a/dap-sdk/net/client/dap_client_pvt_hh.c +++ b/dap-sdk/net/client/dap_client_pvt_hh.c @@ -24,8 +24,8 @@ #include <pthread.h> #include <uthash.h> -#include "dap_common.h" #include "dap_client_pvt.h" +#include "dap_common.h" typedef struct dap_client_pvt_hh { uint64_t client_pvt_uuid; diff --git a/dap-sdk/net/client/include/dap_client.h b/dap-sdk/net/client/include/dap_client.h index 1c6920b1b689a1234ff30a7e7a40791298a03fec..8457e838b7cfd55a0c0ca6eabdce765d5d20e815 100644 --- a/dap-sdk/net/client/include/dap_client.h +++ b/dap-sdk/net/client/include/dap_client.h @@ -23,9 +23,9 @@ */ #pragma once +#include "dap_events.h" #include <stdint.h> #include "dap_enc_key.h" -#include "dap_events.h" #include "dap_stream.h" #include "dap_stream_ch.h" #include "dap_cert.h" diff --git a/dap-sdk/net/core/dap_events.c b/dap-sdk/net/core/dap_events.c index a415e2c6b59c6a63dd2c066474bb649aa7d5feb8..accb805fec84b4394ead6b5ee0aafeedf0b2ac5b 100644 --- a/dap-sdk/net/core/dap_events.c +++ b/dap-sdk/net/core/dap_events.c @@ -250,6 +250,7 @@ void dap_events_deinit( ) /** * @brief server_new Creates new empty instance of server_t + * Additionally checking s_events_default and create thread (pthread_key_create) * @return New instance */ dap_events_t * dap_events_new( ) @@ -401,7 +402,7 @@ int dap_events_wait( dap_events_t *a_events ) /** * @brief dap_events_stop - * @param a_events + * @param */ void dap_events_stop_all( ) { diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c index dc53aa3411991fc6d205ab035abe6b8214a3a2b8..619ebc3432f8083a306b9b30307c0a528a7a4775 100644 --- a/dap-sdk/net/core/dap_events_socket.c +++ b/dap-sdk/net/core/dap_events_socket.c @@ -149,6 +149,12 @@ void dap_events_socket_deinit( ) #ifdef DAP_OS_WINDOWS void __stdcall mq_receive_cb(HRESULT hr, QUEUEHANDLE qh, DWORD timeout , DWORD action, MQMSGPROPS *pmsgprops, LPOVERLAPPED pov, HANDLE cursor) { + UNUSED(hr); + UNUSED(qh); + UNUSED(timeout); + UNUSED(action); + UNUSED(pmsgprops); + UNUSED(cursor); switch (hr) { case MQ_OK: SetEvent(pov->hEvent); @@ -263,7 +269,11 @@ void dap_events_socket_reassign_between_workers_mt(dap_worker_t * a_worker_old, l_msg->esocket_uuid = a_es->uuid; l_msg->worker_new = a_worker_new; if( dap_events_socket_queue_ptr_send(a_worker_old->queue_es_reassign, l_msg) != 0 ){ +#ifdef DAP_OS_WINDOWS + log_it(L_ERROR,"Haven't sent reassign message with esocket %"DAP_UINT64_FORMAT_U, a_es ? a_es->socket : (SOCKET)-1); +#else log_it(L_ERROR,"Haven't sent reassign message with esocket %d", a_es?a_es->socket:-1); +#endif DAP_DELETE(l_msg); } } @@ -278,6 +288,9 @@ void dap_events_socket_reassign_between_workers_mt(dap_worker_t * a_worker_old, dap_events_socket_t * s_create_type_pipe(dap_worker_t * a_w, dap_events_socket_callback_t a_callback, uint32_t a_flags) { #ifdef DAP_OS_WINDOWS + UNUSED(a_w); + UNUSED(a_callback); + UNUSED(a_flags); return NULL; #else UNUSED(a_flags); @@ -397,7 +410,7 @@ dap_events_socket_t * dap_events_socket_create(dap_events_desc_type_t a_type, da } l_es->type = a_type ; if(s_debug_reactor) - log_it(L_DEBUG,"Created socket %d type %d", l_sock,l_es->type); + log_it(L_DEBUG,"Created socket %"DAP_FORMAT_SOCKET" type %d", l_sock,l_es->type); return l_es; } @@ -520,13 +533,13 @@ dap_events_socket_t * dap_events_socket_queue_ptr_create_input(dap_events_socket Sleep(300); hr = MQOpenQueue(l_direct_name, MQ_SEND_ACCESS, MQ_DENY_NONE, &(l_es->mqh)); if (hr != MQ_OK) { - log_it(L_ERROR, "Can't open message queue for queue type, error: 0x%x", hr); + log_it(L_ERROR, "Can't open message queue for queue type, error: %ld", hr); return NULL; } } hr = MQOpenQueue(l_direct_name, MQ_RECEIVE_ACCESS, MQ_DENY_NONE, &(l_es->mqh_recv)); if (hr != MQ_OK) { - log_it(L_ERROR, "Can't open message queue for queue type, error: 0x%x", hr); + log_it(L_ERROR, "Can't open message queue for queue type, error: %ld", hr); return NULL; } #elif defined (DAP_EVENTS_CAPS_KQUEUE) @@ -733,7 +746,7 @@ dap_events_socket_t * s_create_type_queue_ptr(dap_worker_t * a_w, dap_events_soc DWORD l_buflen = sizeof(l_format_name); HRESULT hr = MQCreateQueue(NULL, &l_qps, l_format_name, &l_buflen); if ((hr != MQ_OK) && (hr != MQ_ERROR_QUEUE_EXISTS) && (hr != MQ_INFORMATION_PROPERTY)) { - log_it(L_ERROR, "Can't create message queue for queue type, error: 0x%x", hr); + log_it(L_ERROR, "Can't create message queue for queue type, error: %ld", hr); DAP_DELETE(l_es); return NULL; } @@ -745,7 +758,7 @@ dap_events_socket_t * s_create_type_queue_ptr(dap_worker_t * a_w, dap_events_soc Sleep(300); hr = MQOpenQueue(l_direct_name, MQ_SEND_ACCESS, MQ_DENY_NONE, &(l_es->mqh)); if (hr != MQ_OK) { - log_it(L_ERROR, "Can't open message queue for queue type, error: 0x%x", hr); + log_it(L_ERROR, "Can't open message queue for queue type, error: %ld", hr); DAP_DELETE(l_es); MQDeleteQueue(l_format_name); return NULL; @@ -753,7 +766,7 @@ dap_events_socket_t * s_create_type_queue_ptr(dap_worker_t * a_w, dap_events_soc } hr = MQOpenQueue(l_direct_name, MQ_RECEIVE_ACCESS, MQ_DENY_NONE, &(l_es->mqh_recv)); if (hr != MQ_OK) { - log_it(L_ERROR, "Can't open message queue for queue type, error: 0x%x", hr); + log_it(L_ERROR, "Can't open message queue for queue type, error: %ld", hr); DAP_DELETE(l_es); MQCloseQueue(l_es->mqh); MQDeleteQueue(l_format_name); @@ -761,7 +774,7 @@ dap_events_socket_t * s_create_type_queue_ptr(dap_worker_t * a_w, dap_events_soc } hr = MQPurgeQueue(l_es->mqh_recv); if (hr != MQ_OK) { - log_it(L_DEBUG, "Message queue %d NOT purged, possible data corruption, err %d", l_es->mq_num, hr); + log_it(L_DEBUG, "Message queue %u NOT purged, possible data corruption, err %ld", l_es->mq_num, hr); } #elif defined (DAP_EVENTS_CAPS_KQUEUE) // We don't create descriptor for kqueue at all @@ -805,7 +818,7 @@ dap_events_socket_t * dap_events_socket_create_type_queue_ptr_unsafe(dap_worker_ #ifdef DAP_OS_WINDOWS errno = WSAGetLastError(); #endif - log_it(L_ERROR, "Can't add esocket %d to polling, err %d", l_es->socket, errno); + log_it(L_ERROR, "Can't add esocket %"DAP_FORMAT_SOCKET" to polling, err %d", l_es->socket, errno); } } return l_es; @@ -862,13 +875,13 @@ int dap_events_socket_queue_proc_input_unsafe(dap_events_socket_t * a_esocket) HRESULT hr = MQReceiveMessage(a_esocket->mqh_recv, 1000, MQ_ACTION_RECEIVE, &l_mps, NULL, NULL, NULL, MQ_NO_TRANSACTION); if (hr != MQ_OK) { - log_it(L_ERROR, "An error 0x%x occured receiving a message from queue", hr); + log_it(L_ERROR, "An error %ld occured receiving a message from queue", hr); return -1; } if (l_mpvar[1].ulVal % sizeof(void*)) { - log_it(L_ERROR, "Queue message size incorrect: %d", l_mpvar[1].ulVal); + log_it(L_ERROR, "Queue message size incorrect: %lu", l_mpvar[1].ulVal); if (l_mpvar[1].ulVal < sizeof(void*)) { - log_it(L_ERROR, "Queue socket %d received invalid data", a_esocket->socket); + log_it(L_ERROR, "Queue socket %zu received invalid data", a_esocket->socket); return -1; } } @@ -890,7 +903,7 @@ int dap_events_socket_queue_proc_input_unsafe(dap_events_socket_t * a_esocket) #ifdef DAP_OS_WINDOWS int l_read = dap_recvfrom(a_esocket->socket, a_esocket->buf_in, a_esocket->buf_in_size_max); if (l_read == SOCKET_ERROR) { - log_it(L_ERROR, "Queue socket %d received invalid data, error %d", a_esocket->socket, WSAGetLastError()); + log_it(L_ERROR, "Queue socket %zu received invalid data, error %d", a_esocket->socket, WSAGetLastError()); return -1; } #elif defined (DAP_EVENTS_CAPS_KQUEUE) @@ -905,7 +918,7 @@ int dap_events_socket_queue_proc_input_unsafe(dap_events_socket_t * a_esocket) #endif } }else{ - log_it(L_ERROR, "Queue socket %d accepted data but callback is NULL ", a_esocket->socket); + log_it(L_ERROR, "Queue socket %"DAP_FORMAT_SOCKET" accepted data but callback is NULL ", a_esocket->socket); return -1; } return 0; @@ -1077,7 +1090,7 @@ void dap_events_socket_event_proc_input_unsafe(dap_events_socket_t *a_esocket) #error "No Queue fetch mechanism implemented on your platform" #endif } else - log_it(L_ERROR, "Event socket %d accepted data but callback is NULL ", a_esocket->socket); + log_it(L_ERROR, "Event socket %"DAP_FORMAT_SOCKET" accepted data but callback is NULL ", a_esocket->socket); } @@ -1091,7 +1104,7 @@ typedef struct dap_events_socket_buf_item * Waits on the socket * return 0: timeout, 1: may send data, -1 error */ -static int wait_send_socket(int a_sockfd, long timeout_ms) +static int wait_send_socket(SOCKET a_sockfd, long timeout_ms) { struct timeval l_tv; fd_set l_outfd, l_errfd; @@ -1118,7 +1131,7 @@ static int wait_send_socket(int a_sockfd, long timeout_ms) if(l_res == -1) { if(errno == EINTR) continue; - log_it(L_DEBUG, "socket %d waiting errno=%d", errno); + log_it(L_DEBUG, "socket %"DAP_FORMAT_SOCKET" waiting errno=%d", a_sockfd, errno); return l_res; } break; @@ -1162,6 +1175,7 @@ static void *dap_events_socket_buf_thread(void *arg) DAP_DELETE(l_item); pthread_exit(0); + return NULL; } static void add_ptr_to_buf(dap_events_socket_t * a_es, void* a_arg) @@ -1290,7 +1304,7 @@ int dap_events_socket_queue_ptr_send( dap_events_socket_t * a_es, void* a_arg) HRESULT hr = MQSendMessage(a_es->mqh, &l_mps, MQ_NO_TRANSACTION); if (hr != MQ_OK) { - log_it(L_ERROR, "An error occured on sending message to queue, errno: 0x%x", hr); + log_it(L_ERROR, "An error occured on sending message to queue, errno: %ld", hr); return hr; } @@ -1354,7 +1368,8 @@ int dap_events_socket_queue_ptr_send( dap_events_socket_t * a_es, void* a_arg) return 0; }else { char l_errbuf[128]; - log_it(L_ERROR, "Can't send ptr to queue:\"%s\" code %d", strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)), l_errno); + strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); + log_it(L_ERROR, "Can't send ptr to queue:\"%s\" code %d", l_errbuf, l_errno); return l_errno; } } @@ -1515,12 +1530,12 @@ void dap_events_socket_worker_poll_update_unsafe(dap_events_socket_t * a_esocket char l_errbuf[128]; l_errbuf[0]=0; strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); - log_it(L_ERROR,"Can't update client socket state in the epoll_fd %d: \"%s\" (%d)", + log_it(L_ERROR,"Can't update client socket state in the epoll_fd %"DAP_FORMAT_HANDLE": \"%s\" (%d)", a_esocket->worker->epoll_fd, l_errbuf, l_errno); } } #elif defined (DAP_EVENTS_CAPS_POLL) - if( a_esocket->worker){ + if( a_esocket->worker && a_esocket->is_initalized){ if (a_esocket->poll_index < a_esocket->worker->poll_count ){ struct pollfd * l_poll = &a_esocket->worker->poll[a_esocket->poll_index]; l_poll->events = a_esocket->poll_base_flags | POLLERR ; @@ -1530,7 +1545,7 @@ void dap_events_socket_worker_poll_update_unsafe(dap_events_socket_t * a_esocket if( a_esocket->flags & DAP_SOCK_READY_TO_WRITE || a_esocket->flags &DAP_SOCK_CONNECTING ) l_poll->events |= POLLOUT; }else{ - log_it(L_ERROR, "Wrong poll index when remove from worker (unsafe): %u when total count %u", a_esocket->poll_index, + log_it(L_ERROR, "Wrong poll index when remove from worker (unsafe): %u when total count %zu", a_esocket->poll_index, a_esocket->worker->poll_count); } } @@ -1709,7 +1724,7 @@ void dap_events_socket_set_writable_unsafe( dap_events_socket_t *a_esocket, bool }else log_it(L_WARNING,"Trying to set readable/writable event, queue or timer thats you shouldnt do"); #else - if( a_esocket->worker ) + if( a_esocket->worker) dap_events_socket_worker_poll_update_unsafe(a_esocket); else if( a_esocket->proc_thread) dap_proc_thread_esocket_update_poll_flags(a_esocket->proc_thread,a_esocket ); @@ -1832,7 +1847,7 @@ void dap_events_socket_delete_unsafe( dap_events_socket_t * a_esocket , bool a_p void dap_events_socket_remove_from_worker_unsafe( dap_events_socket_t *a_es, dap_worker_t * a_worker) { if (!a_es->worker) { - log_it(L_INFO, "No worker assigned to esocket %d", a_es->socket); + log_it(L_INFO, "No worker assigned to esocket %"DAP_FORMAT_SOCKET, a_es->socket); return; } @@ -1847,7 +1862,7 @@ void dap_events_socket_remove_from_worker_unsafe( dap_events_socket_t *a_es, dap int l_errno = errno; char l_errbuf[128]; strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); - log_it( L_ERROR,"Can't remove event socket's handler from the epoll_fd %d \"%s\" (%d)", + log_it( L_ERROR,"Can't remove event socket's handler from the epoll_fd %"DAP_FORMAT_HANDLE" \"%s\" (%d)", a_worker->epoll_fd, l_errbuf, l_errno); } //else // log_it( L_DEBUG,"Removed epoll's event from dap_worker #%u", a_worker->id ); @@ -1896,7 +1911,7 @@ void dap_events_socket_remove_from_worker_unsafe( dap_events_socket_t *a_es, dap a_worker->poll[a_es->poll_index].fd = -1; a_worker->poll_compress = true; }else{ - log_it(L_ERROR, "Wrong poll index when remove from worker (unsafe): %u when total count %u", a_es->poll_index, a_worker->poll_count); + log_it(L_ERROR, "Wrong poll index when remove from worker (unsafe): %u when total count %zu", a_es->poll_index, a_worker->poll_count); } #else #error "Unimplemented new esocket on worker callback for current platform" @@ -2108,7 +2123,7 @@ size_t dap_events_socket_write_unsafe(dap_events_socket_t *a_es, const void * a_ { if (a_es->buf_out_size + a_data_size > a_es->buf_out_size_max) { if (a_es->buf_out_size_max + a_data_size > DAP_EVENTS_SOCKET_BUF_LIMIT) { - log_it(L_ERROR, "Write esocket buffer overflow size=%u/max=%u", a_es->buf_out_size_max, DAP_EVENTS_SOCKET_BUF_LIMIT); + log_it(L_ERROR, "Write esocket buffer overflow size=%zu/max=%zu", a_es->buf_out_size_max, (size_t)DAP_EVENTS_SOCKET_BUF_LIMIT); return 0; } else { size_t l_new_size = a_es->buf_out_size_max * 2; @@ -2196,37 +2211,3 @@ void dap_events_socket_shrink_buf_in(dap_events_socket_t * cl, size_t shrink_siz } } - -#ifdef DAP_OS_WINDOWS -inline int dap_recvfrom(SOCKET s, void* buf_in, size_t buf_size) { - struct sockaddr_in l_dummy; - socklen_t l_size = sizeof(l_dummy); - int ret; - if (buf_in) { - memset(buf_in, 0, buf_size); - ret = recvfrom(s, (char*)buf_in, (long)buf_size, 0, (struct sockaddr *)&l_dummy, &l_size); - } else { - char l_tempbuf[sizeof(void*)]; - ret = recvfrom(s, l_tempbuf, sizeof(l_tempbuf), 0, (struct sockaddr *)&l_dummy, &l_size); - } - return ret; -} - -inline int dap_sendto(SOCKET s, u_short port, void* buf_out, size_t buf_out_size) { - int l_addr_len; - struct sockaddr_in l_addr; - l_addr.sin_family = AF_INET; - IN_ADDR _in_addr = { { .S_addr = htonl(INADDR_LOOPBACK) } }; - l_addr.sin_addr = _in_addr; - l_addr.sin_port = port; - l_addr_len = sizeof(struct sockaddr_in); - int ret; - if (buf_out) { - ret = sendto(s, (char*)buf_out, (long)buf_out_size, MSG_DONTWAIT | MSG_NOSIGNAL, (struct sockaddr *)&l_addr, l_addr_len); - } else { - char l_bytes[sizeof(void*)] = { 0 }; - ret = sendto(s, l_bytes, sizeof(l_bytes), MSG_DONTWAIT | MSG_NOSIGNAL, (struct sockaddr *)&l_addr, l_addr_len); - } - return ret; -} -#endif diff --git a/dap-sdk/net/core/dap_proc_thread.c b/dap-sdk/net/core/dap_proc_thread.c index 4aabf439387d2e8d7e827d2cfeece5ac19fbf7ac..a46612b599fe3373de8460b817a9c2cf73efb9b9 100644 --- a/dap-sdk/net/core/dap_proc_thread.c +++ b/dap-sdk/net/core/dap_proc_thread.c @@ -225,7 +225,7 @@ int dap_proc_thread_assign_esocket_unsafe(dap_proc_thread_t * a_thread, dap_even #elif defined (DAP_EVENTS_CAPS_POLL) if ( a_thread->poll_count == a_thread->poll_count_max ){ // realloc a_thread->poll_count_max *= 2; - log_it(L_WARNING, "Too many descriptors (%u), resizing array twice to %u", a_thread->poll_count, a_thread->poll_count_max); + log_it(L_WARNING, "Too many descriptors (%zu), resizing array twice to %zu", a_thread->poll_count, a_thread->poll_count_max); a_thread->poll =DAP_REALLOC(a_thread->poll, a_thread->poll_count_max * sizeof(*a_thread->poll)); a_thread->esockets =DAP_REALLOC(a_thread->esockets, a_thread->poll_count_max * sizeof(*a_thread->esockets)); } @@ -289,7 +289,7 @@ int dap_proc_thread_esocket_update_poll_flags(dap_proc_thread_t * a_thread, dap_ #elif defined (DAP_EVENTS_CAPS_POLL) if ( a_thread->poll_count == a_thread->poll_count_max ){ // realloc a_thread->poll_count_max *= 2; - log_it(L_WARNING, "Too many descriptors (%u), resizing array twice to %u", a_thread->poll_count, a_thread->poll_count_max); + log_it(L_WARNING, "Too many descriptors (%zu), resizing array twice to %zu", a_thread->poll_count, a_thread->poll_count_max); a_thread->poll =DAP_REALLOC(a_thread->poll, a_thread->poll_count_max * sizeof(*a_thread->poll)); a_thread->esockets =DAP_REALLOC(a_thread->esockets, a_thread->poll_count_max * sizeof(*a_thread->esockets)); } @@ -385,7 +385,7 @@ static void * s_proc_thread_function(void * a_arg) l_shed_params.sched_priority = 0; #if defined(DAP_OS_WINDOWS) if (!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST)) - log_it(L_ERROR, "Couldn't set thread priority, err: %d", GetLastError()); + log_it(L_ERROR, "Couldn't set thread priority, err: %lu", GetLastError()); #elif defined (DAP_OS_LINUX) pthread_setschedparam(pthread_self(),SCHED_BATCH ,&l_shed_params); #elif defined (DAP_OS_BSD) @@ -436,7 +436,7 @@ static void * s_proc_thread_function(void * a_arg) #ifdef DAP_OS_WINDOWS errno = WSAGetLastError(); #endif - log_it(L_CRITICAL, "Can't add proc queue %d on epoll ctl, error", l_thread->proc_queue->esocket->socket, errno); + log_it(L_CRITICAL, "Can't add proc queue %zu on epoll ctl, error %d", l_thread->proc_queue->esocket->socket, errno); return NULL; } @@ -627,7 +627,7 @@ static void * s_proc_thread_function(void * a_arg) l_flag_msg = false; #elif defined ( DAP_EVENTS_CAPS_POLL) if(n>=l_thread->poll_count){ - log_it(L_WARNING,"selected_sockets(%d) is bigger then poll count (%u)", l_selected_sockets, l_thread->poll_count); + log_it(L_WARNING,"selected_sockets(%d) is bigger then poll count (%zu)", l_selected_sockets, l_thread->poll_count); break; } short l_cur_events = l_thread->poll[n].revents ; @@ -687,7 +687,7 @@ static void * s_proc_thread_function(void * a_arg) #endif assert(l_cur); if(s_debug_reactor) - log_it(L_DEBUG, "Proc thread #%u esocket %p fd=%d type=%d flags=0x%0X (%s:%s:%s:%s:%s:%s:%s:%s)", l_thread->cpu_id, l_cur, l_cur->socket, + log_it(L_DEBUG, "Proc thread #%u esocket %p fd=%"DAP_FORMAT_SOCKET" type=%d flags=0x%0X (%s:%s:%s:%s:%s:%s:%s:%s)", l_thread->cpu_id, l_cur, l_cur->socket, l_cur->type, l_cur_events, l_flag_read?"read":"", l_flag_write?"write":"", l_flag_error?"error":"", l_flag_hup?"hup":"", l_flag_rdhup?"rdhup":"", l_flag_msg?"msg":"", l_flag_nval?"nval":"", l_flag_pri?"pri":""); @@ -703,7 +703,7 @@ static void * s_proc_thread_function(void * a_arg) #endif char l_errbuf[128]; strerror_r(l_errno, l_errbuf,sizeof (l_errbuf)); - log_it(L_ERROR,"Some error on proc thread #%u with %d socket: %s(%d)",l_thread->cpu_id, l_cur->socket, l_errbuf, l_errno); + log_it(L_ERROR,"Some error on proc thread #%u with %"DAP_FORMAT_SOCKET" socket: %s(%d)",l_thread->cpu_id, l_cur->socket, l_errbuf, l_errno); if(l_cur->callbacks.error_callback) l_cur->callbacks.error_callback(l_cur, errno); } @@ -757,7 +757,7 @@ static void * s_proc_thread_function(void * a_arg) HRESULT hr = MQSendMessage(l_cur->mqh, &l_mps, MQ_NO_TRANSACTION); if (hr != MQ_OK) { - log_it(L_ERROR, "An error occured on sending message to queue, errno: 0x%x", hr); + log_it(L_ERROR, "An error occured on sending message to queue, errno: %ld", hr); break; } else { if(dap_sendto(l_cur->socket, l_cur->port, NULL, 0) == SOCKET_ERROR) { diff --git a/dap-sdk/net/core/dap_server.c b/dap-sdk/net/core/dap_server.c index ebf72beff2540e09a7f731e58488ad2a2e6e6b95..bdbccb4a76f3768e801786fdf9fde5d8bce1986e 100644 --- a/dap-sdk/net/core/dap_server.c +++ b/dap-sdk/net/core/dap_server.c @@ -76,7 +76,7 @@ static dap_events_socket_t * s_es_server_create(dap_events_t * a_events, int a_sock, dap_events_socket_callbacks_t * a_callbacks, dap_server_t * a_server); static int s_server_run(dap_server_t * a_server, dap_events_socket_callbacks_t *a_callbacks ); -static void s_es_server_accept(dap_events_socket_t *a_es, int a_remote_socket, struct sockaddr* a_remote_addr); +static void s_es_server_accept(dap_events_socket_t *a_es, SOCKET a_remote_socket, struct sockaddr* a_remote_addr); static void s_es_server_error(dap_events_socket_t *a_es, int a_arg); static void s_es_server_new(dap_events_socket_t *a_es, void * a_arg); /** @@ -208,7 +208,7 @@ dap_server_t* dap_server_new(dap_events_t *a_events, const char * a_addr, uint16 return NULL; } - log_it(L_NOTICE,"Listen socket %d created...", l_server->socket_listener); + log_it(L_NOTICE,"Listen socket %"DAP_FORMAT_SOCKET" created...", l_server->socket_listener); int reuse=1; if (setsockopt(l_server->socket_listener, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) < 0) @@ -372,7 +372,7 @@ static void s_es_server_error(dap_events_socket_t *a_es, int a_arg) * @param a_remote_socket * @param a_remote_addr */ -static void s_es_server_accept(dap_events_socket_t *a_es, int a_remote_socket, struct sockaddr *a_remote_addr) +static void s_es_server_accept(dap_events_socket_t *a_es, SOCKET a_remote_socket, struct sockaddr *a_remote_addr) { socklen_t a_remote_addr_size = sizeof(*a_remote_addr); a_es->buf_in_size = 0; // It should be 1 so we reset it to 0 @@ -382,7 +382,7 @@ static void s_es_server_accept(dap_events_socket_t *a_es, int a_remote_socket, s dap_events_socket_t * l_es_new = NULL; log_it(L_DEBUG, "Listening socket (binded on %s:%u) got new incomming connection",l_server->address,l_server->port); - log_it(L_DEBUG, "Accepted new connection (sock %d from %d)", a_remote_socket, a_es->socket); + log_it(L_DEBUG, "Accepted new connection (sock %"DAP_FORMAT_SOCKET" from %"DAP_FORMAT_SOCKET")", a_remote_socket, a_es->socket); l_es_new = s_es_server_create(a_es->events,a_remote_socket,&l_server->client_callbacks,l_server); //l_es_new->is_dont_reset_write_flag = true; // By default all income connection has this flag getnameinfo(a_remote_addr,a_remote_addr_size, l_es_new->hostaddr diff --git a/dap-sdk/net/core/dap_timerfd.c b/dap-sdk/net/core/dap_timerfd.c index f0f2d6150197c0a3f5fd2243519a7c50ffcf7e9e..9b6ff27f9b9b649e6ed4916de6fe73cbab6dffb8 100644 --- a/dap-sdk/net/core/dap_timerfd.c +++ b/dap-sdk/net/core/dap_timerfd.c @@ -56,7 +56,7 @@ int dap_timerfd_init() #ifdef DAP_OS_WINDOWS hTimerQueue = CreateTimerQueue(); if (!hTimerQueue) { - log_it(L_CRITICAL, "Timer queue failed, err %d", GetLastError()); + log_it(L_CRITICAL, "Timer queue failed, err %lu", GetLastError()); return -4; } #endif @@ -238,7 +238,7 @@ dap_timerfd_t* dap_timerfd_create(uint64_t a_timeout_ms, dap_timerfd_callback_t } */ if (!CreateTimerQueueTimer(&l_timerfd->th, hTimerQueue, (WAITORTIMERCALLBACK)TimerRoutine, l_timerfd, (unsigned long)a_timeout_ms, 0, 0)) { - log_it(L_CRITICAL, "Timer not set, error %d", GetLastError()); + log_it(L_CRITICAL, "Timer not set, error %lu", GetLastError()); DAP_DELETE(l_timerfd); return NULL; } diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c index d5bc300af0f09945762aae7b3728b1cd64c8a902..8b604d91d43a127a5f5df55c272962a6a90f731f 100644 --- a/dap-sdk/net/core/dap_worker.c +++ b/dap-sdk/net/core/dap_worker.c @@ -93,7 +93,7 @@ int dap_worker_init( size_t a_conn_timeout ) l_fdlimit.rlim_cur = l_fdlimit.rlim_max; if (setrlimit(RLIMIT_NOFILE, &l_fdlimit)) return -2; - log_it(L_INFO, "Set maximum opened descriptors from %d to %d", l_oldlimit, l_fdlimit.rlim_cur); + log_it(L_INFO, "Set maximum opened descriptors from %lu to %lu", l_oldlimit, l_fdlimit.rlim_cur); #endif return 0; } @@ -120,14 +120,14 @@ void *dap_worker_thread(void *arg) l_shed_params.sched_priority = 0; #ifdef DAP_OS_WINDOWS if (!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL)) - log_it(L_ERROR, "Couldn'r set thread priority, err: %d", GetLastError()); + log_it(L_ERROR, "Couldn'r set thread priority, err: %lu", GetLastError()); #else pthread_setschedparam(pthread_self(),SCHED_FIFO ,&l_shed_params); #endif #ifdef DAP_EVENTS_CAPS_EPOLL struct epoll_event l_epoll_events[ DAP_EVENTS_SOCKET_MAX]= {{0}}; - log_it(L_INFO, "Worker #%d started with epoll fd %d and assigned to dedicated CPU unit", l_worker->id, l_worker->epoll_fd); + log_it(L_INFO, "Worker #%d started with epoll fd %"DAP_FORMAT_HANDLE" and assigned to dedicated CPU unit", l_worker->id, l_worker->epoll_fd); #elif defined(DAP_EVENTS_CAPS_KQUEUE) l_worker->kqueue_fd = kqueue(); if (l_worker->kqueue_fd == -1 ){ @@ -285,7 +285,7 @@ void *dap_worker_thread(void *arg) continue; } if(s_debug_reactor) { - log_it(L_DEBUG, "--Worker #%u esocket %p uuid 0x%016llx type %d fd=%d flags=0x%0X (%s:%s:%s:%s:%s:%s:%s:%s)--", + log_it(L_DEBUG, "--Worker #%u esocket %p uuid 0x%016"DAP_UINT64_FORMAT_x" type %d fd=%"DAP_FORMAT_SOCKET" flags=0x%0X (%s:%s:%s:%s:%s:%s:%s:%s)--", l_worker->id, l_cur, l_cur->uuid, l_cur->type, l_cur->socket, l_cur_flags, l_flag_read?"read":"", l_flag_write?"write":"", l_flag_error?"error":"", l_flag_hup?"hup":"", l_flag_rdhup?"rdhup":"", l_flag_msg?"msg":"", l_flag_nval?"nval":"", @@ -299,35 +299,33 @@ void *dap_worker_thread(void *arg) switch (l_cur->type ){ case DESCRIPTOR_TYPE_SOCKET_UDP: case DESCRIPTOR_TYPE_SOCKET_CLIENT: { - int l_err = getsockopt(l_cur->socket, SOL_SOCKET, SO_ERROR, (void *)&l_sock_err, (socklen_t *)&l_sock_err_size); + getsockopt(l_cur->socket, SOL_SOCKET, SO_ERROR, (void *)&l_sock_err, (socklen_t *)&l_sock_err_size); #ifndef DAP_OS_WINDOWS if (l_sock_err) { log_it(L_DEBUG, "Socket %d error %d", l_cur->socket, l_sock_err); #else - //if (l_err == SOCKET_ERROR) { - log_it(L_DEBUG, "Socket %d will be shutdown (EPOLLHUP), error %d", l_cur->socket, WSAGetLastError()); + log_it(L_DEBUG, "Socket %"DAP_FORMAT_SOCKET" will be shutdown (EPOLLHUP), error %d", l_cur->socket, WSAGetLastError()); #endif - dap_events_socket_set_readable_unsafe(l_cur, false); - dap_events_socket_set_writable_unsafe(l_cur, false); - l_cur->buf_out_size = 0; - l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE; - l_flag_error = l_flag_write = false; - l_cur->callbacks.error_callback(l_cur, l_sock_err); // Call callback to process error event + dap_events_socket_set_readable_unsafe(l_cur, false); + dap_events_socket_set_writable_unsafe(l_cur, false); + l_cur->buf_out_size = 0; + l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE; + l_flag_error = l_flag_write = false; + l_cur->callbacks.error_callback(l_cur, l_sock_err); // Call callback to process error event #ifndef DAP_OS_WINDOWS log_it(L_INFO, "Socket shutdown (EPOLLHUP): %s", strerror(l_sock_err)); } #endif - //} break; } default: if(s_debug_reactor) - log_it(L_INFO,"RDHUP event on esocket %p (%d) type %d", l_cur, l_cur->socket, l_cur->type ); + log_it(L_INFO,"RDHUP event on esocket %p (%"DAP_FORMAT_SOCKET") type %d", l_cur, l_cur->socket, l_cur->type ); } } if(l_flag_nval ){ - log_it(L_WARNING, "NVAL flag armed for socket %p (%d)", l_cur, l_cur->socket); + log_it(L_WARNING, "NVAL flag armed for socket %p (%"DAP_FORMAT_SOCKET")", l_cur, l_cur->socket); l_cur->buf_out_size = 0; l_cur->buf_in_size = 0; l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE; @@ -376,7 +374,7 @@ void *dap_worker_thread(void *arg) //log_it(L_DEBUG, "Comes connection with type %d", l_cur->type); if(l_cur->buf_in_size_max && l_cur->buf_in_size >= l_cur->buf_in_size_max ) { - log_it(L_WARNING, "Buffer is full when there is smth to read. Its dropped! esocket %p (%d)", l_cur, l_cur->socket); + log_it(L_WARNING, "Buffer is full when there is smth to read. Its dropped! esocket %p (%"DAP_FORMAT_SOCKET")", l_cur, l_cur->socket); l_cur->buf_in_size = 0; } @@ -438,23 +436,24 @@ void *dap_worker_thread(void *arg) if ( l_cur->callbacks.accept_callback){ struct sockaddr l_remote_addr; socklen_t l_remote_addr_size= sizeof (l_remote_addr); - int l_remote_socket= accept(l_cur->socket ,&l_remote_addr,&l_remote_addr_size); + SOCKET l_remote_socket = accept(l_cur->socket ,&l_remote_addr,&l_remote_addr_size); #ifdef DAP_OS_WINDOWS /*u_long l_mode = 1; ioctlsocket((SOCKET)l_remote_socket, (long)FIONBIO, &l_mode); */ // no need, since l_cur->socket is already NBIO - - int l_errno = WSAGetLastError(); - if (l_errno == WSAEWOULDBLOCK) - continue; - else { - log_it(L_WARNING,"Can't accept on socket %d, WSA errno: %d",l_cur->socket, l_errno); - break; + if (l_remote_socket == INVALID_SOCKET) { + int l_errno = WSAGetLastError(); + if (l_errno == WSAEWOULDBLOCK) + continue; + else { + log_it(L_WARNING,"Can't accept on socket %"DAP_FORMAT_SOCKET", WSA errno: %d", l_cur->socket, l_errno); + break; + } } #else fcntl( l_remote_socket, F_SETFL, O_NONBLOCK); int l_errno = errno; - if ( l_remote_socket == -1 ){ + if ( l_remote_socket == INVALID_SOCKET ){ if( l_errno == EAGAIN || l_errno == EWOULDBLOCK){// Everything is good, we'll receive ACCEPT on next poll continue; }else{ @@ -480,7 +479,7 @@ void *dap_worker_thread(void *arg) if (l_cur->callbacks.timer_callback) l_cur->callbacks.timer_callback(l_cur); else - log_it(L_ERROR, "Socket %d with timer callback fired, but callback is NULL ", l_cur->socket); + log_it(L_ERROR, "Socket %"DAP_FORMAT_SOCKET" with timer callback fired, but callback is NULL ", l_cur->socket); } break; case DESCRIPTOR_TYPE_QUEUE: @@ -513,7 +512,7 @@ void *dap_worker_thread(void *arg) continue; } }else{ - log_it(L_WARNING, "We have incomming %u data but no read callback on socket %d, removing from read set", + log_it(L_WARNING, "We have incomming %d data but no read callback on socket %"DAP_FORMAT_SOCKET", removing from read set", l_bytes_read, l_cur->socket); dap_events_socket_set_readable_unsafe(l_cur,false); } @@ -521,7 +520,7 @@ void *dap_worker_thread(void *arg) else if(l_bytes_read < 0) { #ifdef DAP_OS_WINDOWS if (l_cur->type != DESCRIPTOR_TYPE_SOCKET_CLIENT_SSL && l_errno != WSAEWOULDBLOCK) { - log_it(L_ERROR, "Can't recv on socket %d, WSA error: %d", l_cur->socket, l_errno); + log_it(L_ERROR, "Can't recv on socket %zu, WSA error: %d", l_cur->socket, l_errno); #else if (l_cur->type != DESCRIPTOR_TYPE_SOCKET_CLIENT_SSL && l_errno != EAGAIN && l_errno != EWOULDBLOCK) { // If we have non-blocking socket @@ -564,7 +563,7 @@ void *dap_worker_thread(void *arg) default:{} } if(s_debug_reactor) - log_it(L_INFO,"RDHUP event on esocket %p (%d) type %d", l_cur, l_cur->socket, l_cur->type ); + log_it(L_INFO,"RDHUP event on esocket %p (%"DAP_FORMAT_SOCKET") type %d", l_cur, l_cur->socket, l_cur->type ); } // If its outgoing connection @@ -621,7 +620,7 @@ void *dap_worker_thread(void *arg) if( ( l_flag_write&&(l_cur->flags & DAP_SOCK_READY_TO_WRITE) ) || ( (l_cur->flags & DAP_SOCK_READY_TO_WRITE) && !(l_cur->flags & DAP_SOCK_SIGNAL_CLOSE) ) ) { if(s_debug_reactor) - log_it(L_DEBUG, "Main loop output: %u bytes to send", l_cur->buf_out_size); + log_it(L_DEBUG, "Main loop output: %zu bytes to send", l_cur->buf_out_size); if(l_cur->callbacks.write_callback) l_cur->callbacks.write_callback(l_cur, NULL); // Call callback to process write event @@ -709,7 +708,7 @@ void *dap_worker_thread(void *arg) if (hr != MQ_OK) { l_errno = hr; - log_it(L_ERROR, "An error occured on sending message to queue, errno: 0x%x", hr); + log_it(L_ERROR, "An error occured on sending message to queue, errno: %ld", hr); break; } else { l_errno = WSAGetLastError(); @@ -757,14 +756,14 @@ void *dap_worker_thread(void *arg) l_errno = errno; break; default: - log_it(L_WARNING, "Socket %d is not SOCKET, PIPE or FILE but has WRITE state on. Switching it off"); + log_it(L_WARNING, "Socket %"DAP_FORMAT_SOCKET" is not SOCKET, PIPE or FILE but has WRITE state on. Switching it off", l_cur->socket); dap_events_socket_set_writable_unsafe(l_cur,false); } if(l_bytes_sent < 0) { #ifdef DAP_OS_WINDOWS if (l_cur->type != DESCRIPTOR_TYPE_SOCKET_CLIENT_SSL && l_errno != WSAEWOULDBLOCK) { - log_it(L_ERROR, "Can't send to socket %d, WSA error: %d", l_cur->socket, l_errno); + log_it(L_ERROR, "Can't send to socket %zu, WSA error: %d", l_cur->socket, l_errno); #else if (l_cur->type != DESCRIPTOR_TYPE_SOCKET_CLIENT_SSL && l_errno != EAGAIN && l_errno != EWOULDBLOCK) { // If we have non-blocking socket @@ -806,7 +805,7 @@ void *dap_worker_thread(void *arg) { if (l_cur->buf_out_size == 0) { if(s_debug_reactor) - log_it(L_INFO, "Process signal to close %s sock %d (ptr 0x%p uuid 0x%016llx) type %d [thread %u]", + log_it(L_INFO, "Process signal to close %s sock %"DAP_FORMAT_SOCKET" (ptr 0x%p uuid 0x%016"DAP_UINT64_FORMAT_x") type %d [thread %u]", l_cur->remote_addr_str ? l_cur->remote_addr_str : "", l_cur->socket, l_cur, l_cur->uuid, l_cur->type, l_tn); @@ -843,7 +842,7 @@ void *dap_worker_thread(void *arg) #endif } else if (l_cur->buf_out_size ) { if(s_debug_reactor) - log_it(L_INFO, "Got signal to close %s sock %u [thread %u] type %d but buffer is not empty(%zd)", + log_it(L_INFO, "Got signal to close %s sock %"DAP_FORMAT_SOCKET" [thread %u] type %d but buffer is not empty(%zu)", l_cur->remote_addr_str ? l_cur->remote_addr_str : "", l_cur->socket, l_cur->type, l_tn, l_cur->buf_out_size); } @@ -901,7 +900,7 @@ static void s_queue_add_es_callback( dap_events_socket_t * a_es, void * a_arg) } if(s_debug_reactor) - log_it(L_NOTICE, "Received event socket %p (ident %d type %d) to add on worker", l_es_new, l_es_new->socket, l_es_new->type); + log_it(L_NOTICE, "Received event socket %p (ident %"DAP_FORMAT_SOCKET" type %d) to add on worker", l_es_new, l_es_new->socket, l_es_new->type); switch( l_es_new->type){ case DESCRIPTOR_TYPE_SOCKET_UDP: break; @@ -916,7 +915,7 @@ static void s_queue_add_es_callback( dap_events_socket_t * a_es, void * a_arg) l_es_new->type != DESCRIPTOR_TYPE_TIMER ) #else - if(l_es_new->socket!=0 && l_es_new->socket != -1) + if(l_es_new->socket!=0 && l_es_new->socket != INVALID_SOCKET) #endif if(dap_worker_esocket_find_uuid( l_worker, l_es_new->uuid)){ @@ -955,7 +954,7 @@ static void s_queue_add_es_callback( dap_events_socket_t * a_es, void * a_arg) }else{ // Add in worker l_es_new->me = l_es_new; - if (l_es_new->socket!=0 && l_es_new->socket != -1){ + if (l_es_new->socket!=0 && l_es_new->socket != INVALID_SOCKET){ pthread_rwlock_wrlock(&l_worker->esocket_rwlock); HASH_ADD(hh_worker, l_worker->esockets, uuid, sizeof(l_es_new->uuid), l_es_new ); l_worker->event_sockets_count++; @@ -982,7 +981,7 @@ static void s_queue_delete_es_callback( dap_events_socket_t * a_es, void * a_arg //l_es->flags |= DAP_SOCK_SIGNAL_CLOSE; // Send signal to socket to kill dap_events_socket_remove_and_delete_unsafe(l_es,false); }else - log_it(L_INFO, "While we were sending the delete() message, esocket %"DAP_UINT64_FORMAT_U" has been disconnected ", l_es_uuid_ptr); + log_it(L_INFO, "While we were sending the delete() message, esocket %"DAP_UINT64_FORMAT_U" has been disconnected ", *l_es_uuid_ptr); DAP_DELETE(l_es_uuid_ptr); } @@ -1054,7 +1053,7 @@ static void s_queue_es_io_callback( dap_events_socket_t * a_es, void * a_arg) // Check if it was removed from the list dap_events_socket_t *l_msg_es = dap_worker_esocket_find_uuid(l_worker, l_msg->esocket_uuid); if ( l_msg_es == NULL){ - log_it(L_INFO, "We got i/o message for esocket %"DAP_UINT64_FORMAT_U" thats now not in list. Lost %u data", l_msg->esocket_uuid, l_msg->data_size); + log_it(L_INFO, "We got i/o message for esocket %"DAP_UINT64_FORMAT_U" thats now not in list. Lost %zu data", l_msg->esocket_uuid, l_msg->data_size); DAP_DELETE(l_msg); return; } @@ -1079,9 +1078,8 @@ static void s_queue_es_io_callback( dap_events_socket_t * a_es, void * a_arg) dap_events_socket_set_writable_unsafe(l_msg_es, true); if (l_msg->flags_unset & DAP_SOCK_READY_TO_WRITE) dap_events_socket_set_writable_unsafe(l_msg_es, false); - if (l_msg->data_size && l_msg->data) + if (l_msg->data_size && l_msg->data) { dap_events_socket_write_unsafe(l_msg_es, l_msg->data,l_msg->data_size); - if (l_msg->data) { DAP_DELETE(l_msg->data); } DAP_DELETE(l_msg); @@ -1103,10 +1101,11 @@ static bool s_socket_all_check_activity( void * a_arg) pthread_rwlock_rdlock(&l_worker->esocket_rwlock); HASH_ITER(hh_worker, l_worker->esockets, l_es, tmp ) { pthread_rwlock_unlock(&l_worker->esocket_rwlock); - if ( l_es->type == DESCRIPTOR_TYPE_SOCKET_CLIENT || l_es->type == DESCRIPTOR_TYPE_SOCKET_UDP ){ + if (l_es->type == DESCRIPTOR_TYPE_SOCKET_CLIENT){ if ( !(l_es->flags & DAP_SOCK_SIGNAL_CLOSE) && ( l_curtime >= (l_es->last_time_active + s_connection_timeout) ) && !l_es->no_close ) { - log_it( L_INFO, "Socket %u timeout (diff %u ), closing...", l_es->socket, l_curtime - (time_t)l_es->last_time_active - s_connection_timeout ); + log_it( L_INFO, "Socket %"DAP_FORMAT_SOCKET" timeout (diff %"DAP_UINT64_FORMAT_U" ), closing...", + l_es->socket, l_curtime - (time_t)l_es->last_time_active - s_connection_timeout ); if (l_es->callbacks.error_callback) { l_es->callbacks.error_callback(l_es, ETIMEDOUT); } @@ -1134,7 +1133,7 @@ void dap_worker_add_events_socket(dap_events_socket_t * a_events_socket, dap_wor #else*/ if(s_debug_reactor) - log_it(L_DEBUG,"Worker add esocket %d", a_events_socket->socket); + log_it(L_DEBUG,"Worker add esocket %"DAP_FORMAT_SOCKET, a_events_socket->socket); int l_ret = dap_events_socket_queue_ptr_send( a_worker->queue_es_new, a_events_socket ); if(l_ret != 0 ){ char l_errbuf[128]; @@ -1169,7 +1168,7 @@ void dap_worker_add_events_socket_inter(dap_events_socket_t * a_es_input, dap_ev int dap_worker_add_events_socket_unsafe( dap_events_socket_t * a_esocket, dap_worker_t * a_worker ) { if(s_debug_reactor){ - log_it(L_DEBUG,"Add event socket %p (socket %d )", a_esocket, a_esocket->socket); + log_it(L_DEBUG,"Add event socket %p (socket %"DAP_FORMAT_SOCKET")", a_esocket, a_esocket->socket); } #ifdef DAP_EVENTS_CAPS_EPOLL // Init events for EPOLL @@ -1183,7 +1182,7 @@ int dap_worker_add_events_socket_unsafe( dap_events_socket_t * a_esocket, dap_wo #elif defined (DAP_EVENTS_CAPS_POLL) if ( a_worker->poll_count == a_worker->poll_count_max ){ // realloc a_worker->poll_count_max *= 2; - log_it(L_WARNING, "Too many descriptors (%u), resizing array twice to %u", a_worker->poll_count, a_worker->poll_count_max); + log_it(L_WARNING, "Too many descriptors (%zu), resizing array twice to %zu", a_worker->poll_count, a_worker->poll_count_max); a_worker->poll =DAP_REALLOC(a_worker->poll, a_worker->poll_count_max * sizeof(*a_worker->poll)); a_worker->poll_esocket =DAP_REALLOC(a_worker->poll_esocket, a_worker->poll_count_max * sizeof(*a_worker->poll_esocket)); } diff --git a/dap-sdk/net/core/include/dap_events_socket.h b/dap-sdk/net/core/include/dap_events_socket.h index 326813f29e3160f752c97c5fb60a3a9ac2b7fbfb..af6733c2beefa4b9a93051977974fa3c24b5f8e8 100644 --- a/dap-sdk/net/core/include/dap_events_socket.h +++ b/dap-sdk/net/core/include/dap_events_socket.h @@ -21,6 +21,18 @@ along with any DAP SDK based project. If not, see <http://www.gnu.org/licenses/>. */ #pragma once +#ifndef DAP_OS_WINDOWS +#include "unistd.h" +typedef int SOCKET; +#define closesocket close +#define INVALID_SOCKET -1 // for win32 = (SOCKET)(~0) +#define SOCKET_ERROR -1 // for win32 = (-1) +#else +#include <ws2tcpip.h> +#include <mq.h> +#define INVALID_SOCKET (SOCKET)(~0) +#endif + #include <pthread.h> #include "uthash.h" @@ -29,14 +41,6 @@ #define DAP_EVENTS_SOCKET_MAX 8194 -#ifndef _WIN32 -#include "unistd.h" -typedef int SOCKET; -#define closesocket close -#define INVALID_SOCKET -1 // for win32 = (SOCKET)(~0) -#define SOCKET_ERROR -1 // for win32 = (-1) -#endif - // Caps for different platforms #if defined (DAP_OS_ANDROID) #define DAP_EVENTS_CAPS_POLL @@ -76,10 +80,12 @@ typedef int SOCKET; #define DAP_EVENTS_CAPS_EVENT_WEVENT //#define DAP_EVENTS_CAPS_PIPE_POSIX #define DAP_EVENTS_CAPS_MSMQ - #define INET_ADDRSTRLEN 16 - #define INET6_ADDRSTRLEN 46 -#include <mq.h> -#include <ws2tcpip.h> + #ifndef INET_ADDRSTRLEN + #define INET_ADDRSTRLEN 16 + #endif + #ifndef INET6_ADDRSTRLEN + #define INET6_ADDRSTRLEN 46 + #endif #define MSG_DONTWAIT 0 #define MSG_NOSIGNAL 0 #endif @@ -117,7 +123,7 @@ typedef void (*dap_events_socket_callback_event_t) (dap_events_socket_t *, uint6 typedef void (*dap_events_socket_callback_pipe_t) (dap_events_socket_t *,const void * , size_t); // Callback for specific client operations typedef void (*dap_events_socket_callback_queue_ptr_t) (dap_events_socket_t *, void *); // Callback for specific client operations typedef void (*dap_events_socket_callback_timer_t) (dap_events_socket_t * ); // Callback for specific client operations -typedef void (*dap_events_socket_callback_accept_t) (dap_events_socket_t * , int, struct sockaddr* ); // Callback for accept of new connection +typedef void (*dap_events_socket_callback_accept_t) (dap_events_socket_t * , SOCKET, struct sockaddr* ); // Callback for accept of new connection typedef void (*dap_events_socket_callback_connected_t) (dap_events_socket_t * ); // Callback for connected client connection typedef void (*dap_events_socket_worker_callback_t) (dap_events_socket_t *,dap_worker_t * ); // Callback for specific client operations @@ -142,9 +148,9 @@ typedef struct dap_events_socket_callbacks { } dap_events_socket_callbacks_t; -#define DAP_EVENTS_SOCKET_BUF 100000 +#define DAP_EVENTS_SOCKET_BUF 100000 #define DAP_EVENTS_SOCKET_BUF_LIMIT 500000 -#define DAP_QUEUE_MAX_MSGS 8 +#define DAP_QUEUE_MAX_MSGS 8 typedef enum { DESCRIPTOR_TYPE_SOCKET_CLIENT = 0, @@ -176,11 +182,7 @@ typedef uint64_t dap_events_socket_uuid_t; typedef struct dap_events_socket { union { -#ifdef DAP_OS_WINDOWS SOCKET socket; -#else - int socket; -#endif int fd; #if defined(DAP_EVENTS_CAPS_QUEUE_MQUEUE) mqd_t mqd; @@ -378,8 +380,37 @@ void dap_events_socket_remove_from_worker_unsafe( dap_events_socket_t *a_es, dap void dap_events_socket_shrink_buf_in(dap_events_socket_t * cl, size_t shrink_size); #ifdef DAP_OS_WINDOWS -extern inline int dap_recvfrom(SOCKET s, void* buf_in, size_t buf_size); -extern inline int dap_sendto(SOCKET s, u_short port, void* buf_in, size_t buf_size); +DAP_STATIC_INLINE int dap_recvfrom(SOCKET s, void* buf_in, size_t buf_size) { + struct sockaddr_in l_dummy; + socklen_t l_size = sizeof(l_dummy); + int ret; + if (buf_in) { + memset(buf_in, 0, buf_size); + ret = recvfrom(s, (char*)buf_in, (long)buf_size, 0, (struct sockaddr *)&l_dummy, &l_size); + } else { + char l_tempbuf[sizeof(void*)]; + ret = recvfrom(s, l_tempbuf, sizeof(l_tempbuf), 0, (struct sockaddr *)&l_dummy, &l_size); + } + return ret; +} + +DAP_STATIC_INLINE int dap_sendto(SOCKET s, u_short port, void* buf_out, size_t buf_out_size) { + int l_addr_len; + struct sockaddr_in l_addr; + l_addr.sin_family = AF_INET; + IN_ADDR _in_addr = { { .S_addr = htonl(INADDR_LOOPBACK) } }; + l_addr.sin_addr = _in_addr; + l_addr.sin_port = port; + l_addr_len = sizeof(struct sockaddr_in); + int ret; + if (buf_out) { + ret = sendto(s, (char*)buf_out, (long)buf_out_size, MSG_DONTWAIT | MSG_NOSIGNAL, (struct sockaddr *)&l_addr, l_addr_len); + } else { + char l_bytes[sizeof(void*)] = { 0 }; + ret = sendto(s, l_bytes, sizeof(l_bytes), MSG_DONTWAIT | MSG_NOSIGNAL, (struct sockaddr *)&l_addr, l_addr_len); + } + return ret; +} #endif diff --git a/dap-sdk/net/core/include/dap_net.h b/dap-sdk/net/core/include/dap_net.h index 92ce284136b8f309577f2a1f41445776f77c4949..2c79b8971f9405cd2f3b42f843c8c297ba0fc10a 100644 --- a/dap-sdk/net/core/include/dap_net.h +++ b/dap-sdk/net/core/include/dap_net.h @@ -22,7 +22,6 @@ */ #pragma once -#include "dap_common.h" #ifdef WIN32 // for Windows #include <winsock2.h> @@ -43,4 +42,6 @@ #endif +#include "dap_common.h" + int dap_net_resolve_host(const char *a_host, int ai_family, struct sockaddr *a_addr_out); diff --git a/dap-sdk/net/core/include/dap_server.h b/dap-sdk/net/core/include/dap_server.h index 94c7d503bc0f074c9b4b47c217138f55db674c2b..362e7f2390fe6a090e0a28c82d341909d21b9368 100644 --- a/dap-sdk/net/core/include/dap_server.h +++ b/dap-sdk/net/core/include/dap_server.h @@ -24,6 +24,13 @@ #pragma once +#include <pthread.h> +#include "uthash.h" +#include "utlist.h" + +#include "dap_list.h" +#include "dap_cpu_monitor.h" +#include "dap_events_socket.h" #include "dap_common.h" #ifdef DAP_OS_UNIX @@ -49,13 +56,6 @@ #error "No poll headers for your platform" #endif -#include <pthread.h> -#include "uthash.h" -#include "utlist.h" - -#include "dap_list.h" -#include "dap_cpu_monitor.h" -#include "dap_events_socket.h" typedef enum dap_server_type {SERVER_TCP, SERVER_UDP,SERVER_LOCAL} dap_server_type_t; diff --git a/dap-sdk/net/core/include/dap_timerfd.h b/dap-sdk/net/core/include/dap_timerfd.h index 6ce1acbf488ee81588b0e6e88c6a72a1baf8d0c8..6247112a517a89215e8225426f457c7970c69ba1 100644 --- a/dap-sdk/net/core/include/dap_timerfd.h +++ b/dap-sdk/net/core/include/dap_timerfd.h @@ -38,8 +38,8 @@ #define _MSEC -10000 #endif -#include "dap_common.h" #include "dap_events_socket.h" +#include "dap_common.h" #include "dap_proc_thread.h" typedef bool (*dap_timerfd_callback_t)(void* ); // Callback for timer. If return true, diff --git a/dap-sdk/net/core/include/dap_worker.h b/dap-sdk/net/core/include/dap_worker.h index c466599314f23cbcc2a40bffd10e51c88de06277..37503dba9ea17ef95fd2efb3716c0ddc7354fac7 100644 --- a/dap-sdk/net/core/include/dap_worker.h +++ b/dap-sdk/net/core/include/dap_worker.h @@ -22,11 +22,10 @@ */ #pragma once - +#include "dap_events_socket.h" #include <pthread.h> - #include "dap_common.h" -#include "dap_events_socket.h" + typedef struct dap_proc_queue dap_proc_queue_t; diff --git a/dap-sdk/net/server/enc_server/dap_enc_http.c b/dap-sdk/net/server/enc_server/dap_enc_http.c index 6d296da4e9a38ce834eded413025ca90bf15afed..69f6104fcc792915a79973c003aa9a865207b4c0 100644 --- a/dap-sdk/net/server/enc_server/dap_enc_http.c +++ b/dap-sdk/net/server/enc_server/dap_enc_http.c @@ -22,9 +22,7 @@ #include <string.h> #include <stdint.h> -#include "dap_common.h" - -#ifdef _WIN32 +#ifdef DAP_OS_WINDOWS #include <winsock2.h> #include <windows.h> #include <mswsock.h> @@ -33,10 +31,8 @@ #include <time.h> #endif -#include <pthread.h> - - #include "dap_common.h" +#include <pthread.h> #include "dap_sign.h" #include "include/dap_http.h" @@ -104,7 +100,7 @@ void enc_http_proc(struct dap_http_simple *cl_st, void * arg) dap_enc_key_type_t l_enc_block_type = DAP_ENC_KEY_TYPE_IAES; size_t l_pkey_exchange_size=MSRLN_PKA_BYTES; size_t l_block_key_size=32; - sscanf(cl_st->http_client->in_query_string, "enc_type=%d,pkey_exchange_type=%d,pkey_exchange_size=%zd,block_key_size=%zd", + dap_sscanf(cl_st->http_client->in_query_string, "enc_type=%d,pkey_exchange_type=%d,pkey_exchange_size=%zu,block_key_size=%zu", &l_enc_block_type,&l_pkey_exchange_type,&l_pkey_exchange_size,&l_block_key_size); log_it(L_DEBUG, "Stream encryption: %s\t public key exchange: %s",dap_enc_get_type_name(l_enc_block_type), @@ -119,7 +115,7 @@ void enc_http_proc(struct dap_http_simple *cl_st, void * arg) } else if (l_decode_len > l_pkey_exchange_size+ sizeof (dap_sign_hdr_t)) { dap_sign_t *l_sign = (dap_sign_t *)&alice_msg[l_pkey_exchange_size]; if (l_sign->header.sign_size == 0 || l_sign->header.sign_size > (l_decode_len - l_pkey_exchange_size) ){ - log_it(L_WARNING,"Wrong signature size %zd (decoded length %zd)",l_sign->header.sign_size, l_decode_len); + log_it(L_WARNING,"Wrong signature size %u (decoded length %zu)",l_sign->header.sign_size, l_decode_len); *return_code = Http_Status_BadRequest; return; } @@ -201,7 +197,8 @@ enc_http_delegate_t *enc_http_request_decode(struct dap_http_simple *a_http_simp dg->http=a_http_simple->http_client; // dg->isOk=true; - strncpy(dg->action,a_http_simple->http_client->action,sizeof(dg->action)-1); + strncpy(dg->action,(char *)a_http_simple->http_client->action,sizeof(dg->action) - 1); + dg->action[sizeof(dg->action) - 1] = '\0'; if(a_http_simple->http_client->in_cookie[0]) dg->cookie=strdup(a_http_simple->http_client->in_cookie); diff --git a/dap-sdk/net/server/http_server/dap_http_simple.c b/dap-sdk/net/server/http_server/dap_http_simple.c index 8712e0df4e368392d3bfad6285712ed027e1bab5..3379fc976cae695b831691deef861c5e732e7e9c 100644 --- a/dap-sdk/net/server/http_server/dap_http_simple.c +++ b/dap-sdk/net/server/http_server/dap_http_simple.c @@ -358,11 +358,11 @@ static void s_http_client_headers_read( dap_http_client_t *a_http_client, void * DAP_HTTP_SIMPLE(a_http_client)->request = DAP_NEW_Z_SIZE(void, DAP_HTTP_SIMPLE(a_http_client)->request_size_max); if(!DAP_HTTP_SIMPLE(a_http_client)->request){ DAP_HTTP_SIMPLE(a_http_client)->request_size_max = 0; - log_it(L_ERROR, "Too big content-length %u in request", a_http_client->in_content_length); + log_it(L_ERROR, "Too big content-length %zu in request", a_http_client->in_content_length); } } else - log_it(L_ERROR, "Not defined content-length %u in request", a_http_client->in_content_length); + log_it(L_ERROR, "Not defined content-length %zu in request", a_http_client->in_content_length); } else { log_it( L_DEBUG, "No data section, execution proc callback" ); dap_events_socket_remove_from_worker_unsafe(l_http_simple->esocket ,l_http_simple->worker); @@ -394,7 +394,7 @@ static void s_http_client_data_write( dap_http_client_t * a_http_client, void *a a_http_client->out_content_length - l_http_simple->reply_sent ); if ( l_http_simple->reply_sent >= a_http_client->out_content_length ) { - log_it(L_INFO, "All the reply (%u) is sent out", a_http_client->out_content_length ); + log_it(L_INFO, "All the reply (%zu) is sent out", a_http_client->out_content_length ); //cl_ht->client->signal_close=cl_ht->keep_alive; a_http_client->esocket->flags |= DAP_SOCK_SIGNAL_CLOSE; //dap_client_ready_to_write(cl_ht->client,false); @@ -423,7 +423,7 @@ void s_http_client_data_read( dap_http_client_t *a_http_client, void * a_arg ) if( bytes_to_read ) { // Oops! The client sent more data than write in the CONTENT_LENGTH header if(l_http_simple->request_size + bytes_to_read > l_http_simple->request_size_max){ - log_it(L_WARNING, "Oops! Client sent more data length=%u than in content-length=%u in request", l_http_simple->request_size + bytes_to_read, a_http_client->in_content_length); + log_it(L_WARNING, "Oops! Client sent more data length=%zu than in content-length=%zu in request", l_http_simple->request_size + bytes_to_read, a_http_client->in_content_length); l_http_simple->request_size_max = l_http_simple->request_size + bytes_to_read + 1; // increase input buffer l_http_simple->request = DAP_REALLOC(l_http_simple->request, l_http_simple->request_size_max); diff --git a/dap-sdk/net/server/http_server/http_client/dap_http_client.c b/dap-sdk/net/server/http_server/http_client/dap_http_client.c index 9ddf256b080cc3567c8bab71eca0fc5669e4035e..2a5597c09d8f2628d2c7ffc6b231126f8e64a822 100644 --- a/dap-sdk/net/server/http_server/http_client/dap_http_client.c +++ b/dap-sdk/net/server/http_server/http_client/dap_http_client.c @@ -257,7 +257,7 @@ static bool s_request_line_parse( dap_http_client_t *a_http_client, char *a_buf, memcpy( a_http_client->url_path, a_buf + l_pos_kw_begin, c_size ); a_http_client->url_path[c_size] = 0; - log_it( L_WARNING, "Input: url '%s' pos=%lu pos_kw_begin=%lu", a_http_client->url_path, (uint32_t)l_pos, (uint32_t)l_pos_kw_begin ); + log_it( L_WARNING, "Input: url '%s' pos=%u pos_kw_begin=%u", a_http_client->url_path, (uint32_t)l_pos, (uint32_t)l_pos_kw_begin ); l_parse_state = PS_TYPE; l_pos_kw_begin = l_pos + 1; break; @@ -292,7 +292,7 @@ static bool s_request_line_parse( dap_http_client_t *a_http_client, char *a_buf, memcpy( a_http_client->in_content_type, a_buf + l_pos_kw_begin, l_c_size ); a_http_client->in_content_type[l_c_size] = 0; - log_it( L_WARNING, "Input: type '%s' pos=%lu pos_kw_begin=%lu", a_http_client->in_content_type, (uint32_t)l_pos, (uint32_t)l_pos_kw_begin ); + log_it( L_WARNING, "Input: type '%s' pos=%u pos_kw_begin=%u", a_http_client->in_content_type, (uint32_t)l_pos, (uint32_t)l_pos_kw_begin ); } return a_http_client->url_path[0] && a_http_client->action[0]; @@ -325,12 +325,13 @@ static inline void s_report_error_and_restart( dap_events_socket_t *a_esocket, d */ void dap_http_client_read( dap_events_socket_t *a_esocket, void *a_arg ) { + UNUSED(a_arg); dap_http_client_t *l_http_client = DAP_HTTP_CLIENT( a_esocket ); // log_it( L_DEBUG, "dap_http_client_read..." ); do{ if(s_debug_http) - log_it( L_DEBUG, "HTTP client in state read %d taked bytes in input %lu", l_http_client->state_read, a_esocket->buf_in_size ); + log_it( L_DEBUG, "HTTP client in state read %d taked bytes in input %"DAP_UINT64_FORMAT_U, l_http_client->state_read, a_esocket->buf_in_size ); switch( l_http_client->state_read ) { case DAP_HTTP_CLIENT_STATE_START: { // Beginning of the session. We try to detect char l_buf_line[4096]; @@ -418,7 +419,7 @@ void dap_http_client_read( dap_events_socket_t *a_esocket, void *a_arg ) strncpy(l_http_client->reply_reason_phrase,l_http_cache->response_phrase,sizeof (l_http_client->reply_reason_phrase)-1); if(s_debug_http) - log_it(L_DEBUG,"%d Out: prepare cached headers", l_http_client->esocket->socket); + log_it(L_DEBUG,"%"DAP_FORMAT_SOCKET" Out: prepare cached headers", l_http_client->esocket->socket); }else if (l_http_cache){ pthread_rwlock_unlock(&l_http_client->proc->cache_rwlock); @@ -564,7 +565,7 @@ void dap_http_client_write( dap_events_socket_t * a_esocket, void *a_arg ) case DAP_HTTP_CLIENT_STATE_HEADERS: { dap_http_header_t *hdr = l_http_client->out_headers; if ( hdr == NULL ) { - log_it(L_DEBUG, "Output: headers are over (reply status code %u content_lentgh %u)", + log_it(L_DEBUG, "Output: headers are over (reply status code %hu content_lentgh %zu)", l_http_client->reply_status_code, l_http_client->out_content_length); dap_events_socket_write_f_unsafe(a_esocket, "\r\n"); dap_events_socket_set_writable_unsafe(a_esocket, true); @@ -610,7 +611,7 @@ void dap_http_client_write( dap_events_socket_t * a_esocket, void *a_arg ) if(l_sent){ if ( l_http_client->out_cache_position + l_sent >= l_http_client->proc->cache->body_size ){ // All is sent if(s_debug_http) - log_it(L_DEBUG,"Out %d: All cached data over, signal to close connection", l_http_client->esocket->socket); + log_it(L_DEBUG,"Out %"DAP_FORMAT_SOCKET" All cached data over, signal to close connection", l_http_client->esocket->socket); l_http_client->esocket->flags |= DAP_SOCK_SIGNAL_CLOSE; l_http_client->state_write = DAP_HTTP_CLIENT_STATE_NONE; dap_events_socket_set_writable_unsafe( a_esocket, false ); @@ -637,7 +638,7 @@ void dap_http_client_out_header_generate(dap_http_client_t *a_http_client) if ( a_http_client->reply_status_code == 200 ) { if (s_debug_http) - log_it(L_DEBUG, "Out headers generate for sock %d", a_http_client->esocket->socket); + log_it(L_DEBUG, "Out headers generate for sock %"DAP_FORMAT_SOCKET, a_http_client->esocket->socket); if ( a_http_client->out_last_modified ) { dap_time_to_str_rfc822( buf, sizeof(buf), a_http_client->out_last_modified ); dap_http_header_add( &a_http_client->out_headers, "Last-Modified", buf ); @@ -647,13 +648,13 @@ void dap_http_client_out_header_generate(dap_http_client_t *a_http_client) log_it(L_DEBUG,"output: Content-Type = '%s'",a_http_client->out_content_type); } if ( a_http_client->out_content_length ) { - dap_snprintf(buf,sizeof(buf),"%"DAP_UINT64_FORMAT_U"",a_http_client->out_content_length); + dap_snprintf(buf,sizeof(buf),"%zu",a_http_client->out_content_length); dap_http_header_add(&a_http_client->out_headers,"Content-Length",buf); - log_it(L_DEBUG,"output: Content-Length = %"DAP_UINT64_FORMAT_U"",a_http_client->out_content_length); + log_it(L_DEBUG,"output: Content-Length = %zu",a_http_client->out_content_length); } }else if (s_debug_http) - log_it(L_WARNING, "Out headers: nothing generate for sock %d, http code %d", a_http_client->esocket->socket, + log_it(L_WARNING, "Out headers: nothing generate for sock %"DAP_FORMAT_SOCKET", http code %d", a_http_client->esocket->socket, a_http_client->reply_status_code); if ( a_http_client->out_connection_close || !a_http_client->keep_alive ) diff --git a/dap-sdk/net/server/http_server/http_client/dap_http_header.c b/dap-sdk/net/server/http_server/http_client/dap_http_header.c index 59ee805194a538230452d0c60754e4afe3c77b06..4e5bb1c44e544e6dd7950c3470db9c027a6d9dba 100644 --- a/dap-sdk/net/server/http_server/http_client/dap_http_header.c +++ b/dap-sdk/net/server/http_server/http_client/dap_http_header.c @@ -110,7 +110,8 @@ int dap_http_header_parse(struct dap_http_client * cl_ht, const char * str) // cl_ht->keep_alive=true; // } }else if(strcmp(name,"Content-Type")==0){ - strncpy( cl_ht->in_content_type, value, sizeof(cl_ht->in_content_type) ); + strncpy( cl_ht->in_content_type, (char *)value, sizeof(cl_ht->in_content_type) ); + cl_ht->in_content_type[sizeof(cl_ht->in_content_type) - 1] = '\0'; }else if(strcmp(name,"Content-Length")==0){ cl_ht->in_content_length = atoi( value ); }else if(strcmp(name,"Cookie")==0){ diff --git a/dap-sdk/net/server/json_rpc/include/dap_json_rpc_request.h b/dap-sdk/net/server/json_rpc/include/dap_json_rpc_request.h index 9182f64c757982166eaf5e6c6557a1a281aa5e4c..346d07335112f6ab605b538f409902c9028355c3 100644 --- a/dap-sdk/net/server/json_rpc/include/dap_json_rpc_request.h +++ b/dap-sdk/net/server/json_rpc/include/dap_json_rpc_request.h @@ -23,10 +23,10 @@ */ #pragma once +#include "dap_json_rpc_response_handler.h" #include "dap_common.h" #include "dap_json_rpc_params.h" #include "json-c/json.h" -#include "dap_json_rpc_response_handler.h" #include "dap_string.h" #include "dap_client_http.h" diff --git a/dap-sdk/net/server/json_rpc/include/dap_json_rpc_request_handler.h b/dap-sdk/net/server/json_rpc/include/dap_json_rpc_request_handler.h index 64f9adc60e9ef37180c78894436ddd8235df4c50..e0f5c75b64b8096630bd9ff1fd86429da28e3b3c 100644 --- a/dap-sdk/net/server/json_rpc/include/dap_json_rpc_request_handler.h +++ b/dap-sdk/net/server/json_rpc/include/dap_json_rpc_request_handler.h @@ -24,9 +24,9 @@ #pragma once +#include "dap_json_rpc_request.h" #include "dap_common.h" #include "dap_strfuncs.h" -#include "dap_json_rpc_request.h" #include "dap_json_rpc_params.h" #include "dap_http_simple.h" #include "dap_json_rpc_errors.h" diff --git a/dap-sdk/net/server/json_rpc/src/dap_json_rpc_notification.c b/dap-sdk/net/server/json_rpc/src/dap_json_rpc_notification.c index 8c4e973bab1d1e57ab1c9b94c61f4b834b556b65..25f5ae82dd130fe542577c2b0b4412bcacdbc47b 100644 --- a/dap-sdk/net/server/json_rpc/src/dap_json_rpc_notification.c +++ b/dap-sdk/net/server/json_rpc/src/dap_json_rpc_notification.c @@ -39,6 +39,6 @@ void dap_json_rpc_notification_handler(const char *a_name_method, dap_json_rpc_p l_handler->func(a_params); log_it(L_DEBUG, "Call method handling notfication: %s", a_name_method); } else { - log_it(L_NOTICE, "Not found method %s. This method handler notification"); + log_it(L_NOTICE, "Not found method %s. This method handler notification", a_name_method); } } diff --git a/dap-sdk/net/server/json_rpc/src/dap_json_rpc_request.c b/dap-sdk/net/server/json_rpc/src/dap_json_rpc_request.c index c51d43241386be8e1eb5b856e1259d78af5ca871..757d52e0e137fc37a35ed58fe4304092d642e18c 100644 --- a/dap-sdk/net/server/json_rpc/src/dap_json_rpc_request.c +++ b/dap-sdk/net/server/json_rpc/src/dap_json_rpc_request.c @@ -43,13 +43,13 @@ dap_json_rpc_request_t *dap_json_rpc_request_from_json(const char *a_data) if (json_object_object_get_ex(l_jobj, "method", &l_jobj_method)){ l_request->method = dap_strdup(json_object_get_string(l_jobj_method)); }else{ - log_it(L_ERROR, "Error parse JSON string, Can't searching method for request with id: %lu", l_request->id); + log_it(L_ERROR, "Error parse JSON string, Can't searching method for request with id: %"DAP_UINT64_FORMAT_U, l_request->id); l_err_parse_request = true; } if (json_object_object_get_ex(l_jobj, "params", &l_jobj_params) && !l_err_parse_request){ l_request->params = dap_json_rpc_params_create_from_array_list(l_jobj_params); }else{ - log_it(L_ERROR, "Error parse JSON string, Can't searching array params for request with id: %lu", l_request->id); + log_it(L_ERROR, "Error parse JSON string, Can't searching array params for request with id: %"DAP_UINT64_FORMAT_U, l_request->id); l_err_parse_request = true; } } else { diff --git a/dap-sdk/net/server/json_rpc/src/dap_json_rpc_response_handler.c b/dap-sdk/net/server/json_rpc/src/dap_json_rpc_response_handler.c index 4419221d31e689ce06d101e563f764d3bf8f1138..1ebfa56e69d9cc5417eae64866854bad0b95e49a 100644 --- a/dap-sdk/net/server/json_rpc/src/dap_json_rpc_response_handler.c +++ b/dap-sdk/net/server/json_rpc/src/dap_json_rpc_response_handler.c @@ -14,7 +14,7 @@ int dap_json_rpc_response_registration_with_id(uint64_t a_id, dap_json_rpc_respo l_handler->id = a_id; l_handler->func = func; HASH_ADD_INT(s_response_handlers, id, l_handler); - log_it(L_NOTICE, "Registrayion handler response with id: %d", a_id); + log_it(L_NOTICE, "Registrayion handler response with id: %"DAP_UINT64_FORMAT_U, a_id); return 0; } return 1; @@ -32,7 +32,7 @@ void dap_json_rpc_response_unregistration(uint64_t a_id) if (l_handler != NULL){ HASH_DEL(s_response_handlers, l_handler); DAP_FREE(l_handler); - log_it(L_NOTICE, "Unregistrayion handler response with id: %d", a_id); + log_it(L_NOTICE, "Unregistrayion handler response with id: %"DAP_UINT64_FORMAT_U, a_id); } } @@ -41,11 +41,11 @@ void dap_json_rpc_response_handler(dap_json_rpc_response_t *a_response) dap_json_rpc_response_handler_t *l_handler = NULL; HASH_FIND_INT(s_response_handlers, (void*)a_response->id, l_handler); if (l_handler != NULL){ - log_it(L_NOTICE, "Calling handler response id: %d", a_response->id); + log_it(L_NOTICE, "Calling handler response id: %"DAP_UINT64_FORMAT_U, a_response->id); l_handler->func(a_response); dap_json_rpc_response_unregistration(a_response->id); } else { - log_it(L_NOTICE, "Can't calling handler response id: %d. This handler not found", a_response->id); + log_it(L_NOTICE, "Can't calling handler response id: %"DAP_UINT64_FORMAT_U". This handler not found", a_response->id); } } diff --git a/dap-sdk/net/server/notify_server/src/dap_notify_srv.c b/dap-sdk/net/server/notify_server/src/dap_notify_srv.c index 9fe66946375814cdd4aee809644e5ab84c86ac85..1ecfcf72e4a24d1f4fbb15a75a9f8cd050d8ada7 100644 --- a/dap-sdk/net/server/notify_server/src/dap_notify_srv.c +++ b/dap-sdk/net/server/notify_server/src/dap_notify_srv.c @@ -24,12 +24,11 @@ #include <stdlib.h> #include <stdarg.h> #include <unistd.h> - +#include "dap_events_socket.h" #include "dap_common.h" #include "dap_config.h" #include "dap_list.h" #include "dap_strfuncs.h" -#include "dap_events_socket.h" #include "dap_server.h" #include "dap_events.h" #include "dap_notify_srv.h" @@ -191,7 +190,7 @@ static void s_notify_server_callback_new(dap_events_socket_t * a_es, void * a_ar HASH_FIND(hh,s_notify_server_clients, &a_es->uuid, sizeof (a_es->uuid), l_hh_new); if (l_hh_new){ uint64_t *l_uuid_u64 =(uint64_t*) &a_es->uuid; - log_it(L_WARNING,"Trying to add notify client with uuid 0x%016"DAP_UINT64_FORMAT_X"%016"DAP_UINT64_FORMAT_X" but already present this UUID in list, updating only esocket pointer if so",l_uuid_u64 ); + log_it(L_WARNING,"Trying to add notify client with uuid 0x%016"DAP_UINT64_FORMAT_X" but already present this UUID in list, updating only esocket pointer if so", *l_uuid_u64); l_hh_new->esocket = a_es; l_hh_new->worker_id = a_es->worker->id; }else { @@ -219,7 +218,7 @@ static void s_notify_server_callback_delete(dap_events_socket_t * a_es, void * a HASH_DELETE(hh,s_notify_server_clients, l_hh_new); }else{ uint64_t *l_uuid_u64 =(uint64_t*) &a_es->uuid; - log_it(L_WARNING,"Trying to remove notify client with uuid 0x%016"DAP_UINT64_FORMAT_X"%016"DAP_UINT64_FORMAT_X" but can't find such client in table",l_uuid_u64 ); + log_it(L_WARNING,"Trying to remove notify client with uuid 0x%016"DAP_UINT64_FORMAT_X" but can't find such client in table", *l_uuid_u64); } pthread_rwlock_unlock(&s_notify_server_clients_mutex); } diff --git a/dap-sdk/net/stream/ch/dap_stream_ch.c b/dap-sdk/net/stream/ch/dap_stream_ch.c index 9c890990f599afc66e6d5be882f0d4504dc098d9..09dc69f310cfff08c65b070afff7f39ac7a8af1c 100644 --- a/dap-sdk/net/stream/ch/dap_stream_ch.c +++ b/dap-sdk/net/stream/ch/dap_stream_ch.c @@ -150,7 +150,7 @@ void dap_stream_ch_delete(dap_stream_ch_t *a_ch) dap_stream_ch_t * dap_stream_ch_find_by_uuid_unsafe(dap_stream_worker_t * a_worker, dap_stream_ch_uuid_t a_ch_uuid) { if( a_worker == NULL ){ - log_it(L_WARNING,"Attempt to search for uuid 0x%016llu in NULL worker", a_ch_uuid); + log_it(L_WARNING,"Attempt to search for uuid 0x%016"DAP_UINT64_FORMAT_U" in NULL worker", a_ch_uuid); return NULL; } else if ( a_worker->channels){ dap_stream_ch_t * l_ch = NULL; diff --git a/dap-sdk/net/stream/ch/dap_stream_ch_pkt.c b/dap-sdk/net/stream/ch/dap_stream_ch_pkt.c index 474f6bbf355a6a6bdee88788cac5626e182a0d34..3d06f1326d47ab69e91b528c88e7eac27774cee0 100644 --- a/dap-sdk/net/stream/ch/dap_stream_ch_pkt.c +++ b/dap-sdk/net/stream/ch/dap_stream_ch_pkt.c @@ -75,6 +75,8 @@ void dap_stream_ch_pkt_deinit() */ size_t dap_stream_ch_pkt_write_f_mt(dap_stream_worker_t * a_worker , dap_stream_ch_uuid_t a_ch_uuid, uint8_t a_type, const char * a_format,...) { + if (!a_worker) + return 0; va_list ap; va_start(ap,a_format); int l_data_size = dap_vsnprintf(NULL,0,a_format,ap); @@ -161,6 +163,8 @@ size_t dap_stream_ch_pkt_write_f_inter(dap_events_socket_t * a_queue , dap_stre */ size_t dap_stream_ch_pkt_write_mt(dap_stream_worker_t * a_worker , dap_stream_ch_uuid_t a_ch_uuid, uint8_t a_type, const void * a_data, size_t a_data_size) { + if (!a_worker) + return 0; dap_stream_worker_msg_io_t * l_msg = DAP_NEW_Z(dap_stream_worker_msg_io_t); l_msg->ch_uuid = a_ch_uuid; l_msg->ch_pkt_type = a_type; @@ -236,7 +240,7 @@ size_t dap_stream_ch_pkt_write_unsafe(dap_stream_ch_t * a_ch, uint8_t a_type, c a_ch->stream->seq_id++; if ( dap_stream_get_dump_packet_headers() ){ - log_it(L_INFO,"Outgoing channel packet: id='%c' size=%u type=0x%02Xu seq_id=0x%016X enc_type=0x%02hhX", + log_it(L_INFO,"Outgoing channel packet: id='%c' size=%u type=0x%02X seq_id=0x%016"DAP_UINT64_FORMAT_X" enc_type=0x%02hhX", (char) l_hdr.id, l_hdr.size, l_hdr.type, l_hdr.seq_id , l_hdr.enc_type ); } @@ -245,7 +249,7 @@ size_t dap_stream_ch_pkt_write_unsafe(dap_stream_ch_t * a_ch, uint8_t a_type, c size_t l_buf_size_required = a_data_size + sizeof(l_hdr); if(l_buf_size_required > sizeof(a_ch->buf) ){ - log_it(L_WARNING,"packet size is way too big: %lu bytes", a_data_size); + log_it(L_WARNING,"packet size is way too big: %zu bytes", a_data_size); l_buf_allocated = DAP_NEW_Z_SIZE(uint8_t, l_buf_size_required); l_buf_selected = l_buf_allocated; } diff --git a/dap-sdk/net/stream/stream/dap_stream.c b/dap-sdk/net/stream/stream/dap_stream.c index 6e1545d194dbbcf46ac1b4cb659b16c13ad2712a..9a33b5f97471092db8804bb33eec318f84927f9a 100644 --- a/dap-sdk/net/stream/stream/dap_stream.c +++ b/dap-sdk/net/stream/stream/dap_stream.c @@ -413,9 +413,14 @@ static void s_http_client_headers_write(dap_http_client_t * a_http_client, void a_http_client->state_read=DAP_HTTP_CLIENT_STATE_DATA; dap_events_socket_set_readable_unsafe(a_http_client->esocket,true); // Connection is established, setting up keepalive timer - dap_events_socket_uuid_t * l_es_uuid= DAP_NEW_Z(dap_events_socket_uuid_t); - *l_es_uuid = a_http_client->esocket->uuid; - dap_timerfd_start_on_worker(a_http_client->esocket->worker, STREAM_KEEPALIVE_TIMEOUT * 1000, s_callback_keepalive, l_es_uuid); + if (!l_stream->keepalive_timer) { + dap_events_socket_uuid_t * l_es_uuid= DAP_NEW_Z(dap_events_socket_uuid_t); + *l_es_uuid = a_http_client->esocket->uuid; + l_stream->keepalive_timer = dap_timerfd_start_on_worker(a_http_client->esocket->worker, + STREAM_KEEPALIVE_TIMEOUT * 1000, + s_callback_keepalive, + l_es_uuid); + } } } @@ -443,20 +448,19 @@ static void s_http_client_data_write(dap_http_client_t * a_http_client, void * a */ static void s_esocket_callback_worker_assign(dap_events_socket_t * a_esocket, dap_worker_t * a_worker) { - if(a_esocket->type == DESCRIPTOR_TYPE_SOCKET_UDP){ - dap_events_socket_uuid_t * l_es_uuid= DAP_NEW_Z(dap_events_socket_uuid_t); - *l_es_uuid = a_esocket->uuid; - dap_timerfd_start_on_worker(a_worker,STREAM_KEEPALIVE_TIMEOUT * 1000, (dap_timerfd_callback_t)s_callback_keepalive, l_es_uuid); - }else { - dap_http_client_t *l_http_client = DAP_HTTP_CLIENT(a_esocket); - assert(l_http_client); - dap_stream_t * l_stream =DAP_STREAM(l_http_client); - assert(l_stream); - // If we were reassigned after connection was bringed up - if(l_http_client->state_read == DAP_HTTP_CLIENT_STATE_DATA && l_http_client->state_write == DAP_HTTP_CLIENT_STATE_DATA ){ + dap_http_client_t *l_http_client = DAP_HTTP_CLIENT(a_esocket); + assert(l_http_client); + dap_stream_t * l_stream = DAP_STREAM(l_http_client); + assert(l_stream); + if (a_esocket->type == DESCRIPTOR_TYPE_SOCKET_UDP || + (l_http_client->state_read == DAP_HTTP_CLIENT_STATE_DATA && l_http_client->state_write == DAP_HTTP_CLIENT_STATE_DATA )) { + if (!l_stream->keepalive_timer) { dap_events_socket_uuid_t * l_es_uuid= DAP_NEW_Z(dap_events_socket_uuid_t); *l_es_uuid = a_esocket->uuid; - dap_timerfd_start_on_worker(a_worker, STREAM_KEEPALIVE_TIMEOUT * 1000, (dap_timerfd_callback_t)s_callback_keepalive, l_es_uuid); + l_stream->keepalive_timer = dap_timerfd_start_on_worker(a_worker, + STREAM_KEEPALIVE_TIMEOUT * 1000, + (dap_timerfd_callback_t)s_callback_keepalive, + l_es_uuid); } } } @@ -468,7 +472,14 @@ static void s_esocket_callback_worker_assign(dap_events_socket_t * a_esocket, da */ static void s_esocket_callback_worker_unassign(dap_events_socket_t * a_esocket, dap_worker_t * a_worker) { - // TODO switch off keepalive packets sending + UNUSED(a_worker); + dap_http_client_t *l_http_client = DAP_HTTP_CLIENT(a_esocket); + assert(l_http_client); + dap_stream_t * l_stream = DAP_STREAM(l_http_client); + assert(l_stream); + DAP_DEL_Z(l_stream->keepalive_timer->callback_arg); + dap_timerfd_delete(l_stream->keepalive_timer); + l_stream->keepalive_timer = NULL; } @@ -484,7 +495,7 @@ static void s_esocket_data_read(dap_events_socket_t* a_client, void * a_arg) int * l_ret = (int *) a_arg; if (s_dump_packet_headers ) { - log_it(L_DEBUG,"dap_stream_data_read: ready_to_write=%s, client->buf_in_size=%u" , + log_it(L_DEBUG,"dap_stream_data_read: ready_to_write=%s, client->buf_in_size=%zu" , (a_client->flags & DAP_SOCK_READY_TO_WRITE)?"true":"false", a_client->buf_in_size ); } *l_ret = dap_stream_data_proc_read( l_stream); @@ -512,7 +523,7 @@ static void s_esocket_write(dap_events_socket_t* a_esocket , void * a_arg){ } } if (s_dump_packet_headers ) { - log_it(L_DEBUG,"dap_stream_data_write: ready_to_write=%s client->buf_out_size=%u" , + log_it(L_DEBUG,"dap_stream_data_write: ready_to_write=%s client->buf_out_size=%zu" , l_ready_to_write?"true":"false", a_esocket->buf_out_size ); } dap_events_socket_set_writable_unsafe(a_esocket, l_ready_to_write); @@ -758,8 +769,14 @@ static void s_stream_proc_pkt_in(dap_stream_t * a_stream) case STREAM_PKT_TYPE_DATA_PACKET: { dap_stream_ch_pkt_t * l_ch_pkt = (dap_stream_ch_pkt_t *) a_stream->pkt_cache; - if(dap_stream_pkt_read_unsafe(a_stream,l_pkt, l_ch_pkt, sizeof(a_stream->pkt_cache))==0){ - log_it(L_WARNING, "Input: can't decode packet size=%d",l_pkt_size); + size_t l_dec_pkt_size = dap_stream_pkt_read_unsafe(a_stream, l_pkt, l_ch_pkt, sizeof(a_stream->pkt_cache)); + if (l_dec_pkt_size == 0) { + log_it(L_WARNING, "Input: can't decode packet size=%zu",l_pkt_size); + DAP_DELETE(l_pkt); + return; + } + if (l_dec_pkt_size != l_ch_pkt->hdr.size + sizeof(l_ch_pkt->hdr)) { + log_it(L_WARNING, "Input: decoded packet has bad size = %u, decoded size = %zu", l_ch_pkt->hdr.size, l_dec_pkt_size); DAP_DELETE(l_pkt); return; } @@ -780,7 +797,7 @@ static void s_stream_proc_pkt_in(dap_stream_t * a_stream) l_ch->stat.bytes_read+=l_ch_pkt->hdr.size; if(l_ch->proc && l_ch->proc->packet_in_callback){ if ( s_dump_packet_headers ){ - log_it(L_INFO,"Income channel packet: id='%c' size=%u type=0x%02Xu seq_id=0x%016X enc_type=0x%02X",(char) l_ch_pkt->hdr.id, + log_it(L_INFO,"Income channel packet: id='%c' size=%u type=0x%02X seq_id=0x%016"DAP_UINT64_FORMAT_X" enc_type=0x%02X",(char) l_ch_pkt->hdr.id, l_ch_pkt->hdr.size, l_ch_pkt->hdr.type, l_ch_pkt->hdr.seq_id , l_ch_pkt->hdr.enc_type); } l_ch->proc->packet_in_callback(l_ch,l_ch_pkt); @@ -802,6 +819,15 @@ static void s_stream_proc_pkt_in(dap_stream_t * a_stream) l_ret_pkt.type = STREAM_PKT_TYPE_ALIVE; memcpy(l_ret_pkt.sig, c_dap_stream_sig, sizeof(l_ret_pkt.sig)); dap_events_socket_write_unsafe(a_stream->esocket, &l_ret_pkt, sizeof(l_ret_pkt)); + // Reset client keepalive timer + if (a_stream->keepalive_timer) { + void *l_arg = a_stream->keepalive_timer->callback_arg; + dap_timerfd_delete(a_stream->keepalive_timer); + a_stream->keepalive_timer = dap_timerfd_start_on_worker(a_stream->stream_worker->worker, + STREAM_KEEPALIVE_TIMEOUT * 1000, + (dap_timerfd_callback_t)s_callback_keepalive, + l_arg); + } } break; case STREAM_PKT_TYPE_ALIVE: //log_it(L_DEBUG, "Keep alive response recieved"); @@ -826,12 +852,12 @@ static bool s_detect_loose_packet(dap_stream_t * a_stream) if(l_count_loosed_packets > 0) { log_it(L_WARNING, "Detected loosed %d packets. " - "Last read seq_id packet: %d Current: %d", l_count_loosed_packets, + "Last read seq_id packet: %zu Current: %"DAP_UINT64_FORMAT_U, l_count_loosed_packets, a_stream->client_last_seq_id_packet, l_ch_pkt->hdr.seq_id); } else if(l_count_loosed_packets < 0) { if(a_stream->client_last_seq_id_packet != 0 && l_ch_pkt->hdr.seq_id != 0) { log_it(L_WARNING, "Something wrong. count_loosed packets %d can't less than zero. " - "Last read seq_id packet: %d Current: %d", l_count_loosed_packets, + "Last read seq_id packet: %zu Current: %"DAP_UINT64_FORMAT_U, l_count_loosed_packets, a_stream->client_last_seq_id_packet, l_ch_pkt->hdr.seq_id); } // else client don't support seqid functionality } @@ -849,20 +875,22 @@ static bool s_detect_loose_packet(dap_stream_t * a_stream) */ static bool s_callback_keepalive( void * a_arg) { + if (!a_arg) + return false; dap_events_socket_uuid_t * l_es_uuid = (dap_events_socket_uuid_t*) a_arg; dap_worker_t * l_worker = dap_events_get_current_worker(dap_events_get_default()); dap_events_socket_t * l_es = dap_worker_esocket_find_uuid(l_worker, *l_es_uuid); if( l_es){ if(s_debug) - log_it(L_DEBUG,"Keepalive for sock fd %d uuid 0x%016llu", l_es->socket, *l_es_uuid); - dap_stream_pkt_hdr_t l_pkt = {0}; + log_it(L_DEBUG,"Keepalive for sock fd %"DAP_FORMAT_SOCKET" uuid 0x%016"DAP_UINT64_FORMAT_x, l_es->socket, *l_es_uuid); + dap_stream_pkt_hdr_t l_pkt = {}; l_pkt.type = STREAM_PKT_TYPE_KEEPALIVE; memcpy(l_pkt.sig, c_dap_stream_sig, sizeof(l_pkt.sig)); dap_events_socket_write_unsafe( l_es, &l_pkt, sizeof(l_pkt)); return true; }else{ if(s_debug) - log_it(L_INFO,"Keepalive for sock uuid %016llx removed", *l_es_uuid); + log_it(L_INFO,"Keepalive for sock uuid %016"DAP_UINT64_FORMAT_x" removed", *l_es_uuid); DAP_DELETE(l_es_uuid); return false; // Socket is removed from worker } diff --git a/dap-sdk/net/stream/stream/dap_stream_pkt.c b/dap-sdk/net/stream/stream/dap_stream_pkt.c index 39e56a109dbc857c8fd131bc0310b4f82421dedc..d0b5efa8aafe23f248c1bdf10bdee81ef9cedffb 100644 --- a/dap-sdk/net/stream/stream/dap_stream_pkt.c +++ b/dap-sdk/net/stream/stream/dap_stream_pkt.c @@ -76,7 +76,7 @@ dap_stream_pkt_t * dap_stream_pkt_detect(void * a_data, size_t data_size) if(memcmp(sig_start,c_dap_stream_sig,sizeof(c_dap_stream_sig))==0){ ret = (dap_stream_pkt_t *)sig_start; if (length_left < sizeof(dap_stream_ch_pkt_hdr_t)) { - log_it(L_ERROR, "Too small packet size %u", length_left); + log_it(L_ERROR, "Too small packet size %zu", length_left); ret = NULL; break; } diff --git a/dap-sdk/net/stream/stream/dap_stream_worker.c b/dap-sdk/net/stream/stream/dap_stream_worker.c index ae002f36e3b92199788ee659fb0c99f92b06903c..8e553a3da951ce8762c8acadceb73cb27242a873 100644 --- a/dap-sdk/net/stream/stream/dap_stream_worker.c +++ b/dap-sdk/net/stream/stream/dap_stream_worker.c @@ -20,9 +20,9 @@ You should have received a copy of the GNU General Public License along with any DAP SDK based project. If not, see <http://www.gnu.org/licenses/>. */ -#include "dap_common.h" #include "dap_events.h" #include "dap_events_socket.h" +#include "dap_common.h" #include "dap_stream_worker.h" #include "dap_stream_ch_pkt.h" @@ -106,7 +106,7 @@ static void s_ch_io_callback(dap_events_socket_t * a_es, void * a_msg) HASH_FIND(hh_worker, l_stream_worker->channels , &l_msg->ch_uuid , sizeof (l_msg->ch_uuid ), l_msg_ch ); pthread_rwlock_unlock(&l_stream_worker->channels_rwlock); if ( l_msg_ch == NULL){ - log_it(L_DEBUG, "We got i/o message for client thats now not in list. Lost %u data", l_msg->data_size); + log_it(L_DEBUG, "We got i/o message for client thats now not in list. Lost %zu data", l_msg->data_size); DAP_DELETE(l_msg); return; } @@ -119,8 +119,10 @@ static void s_ch_io_callback(dap_events_socket_t * a_es, void * a_msg) dap_stream_ch_set_ready_to_write_unsafe(l_msg_ch, true); if (l_msg->flags_unset & DAP_SOCK_READY_TO_WRITE) dap_stream_ch_set_ready_to_write_unsafe(l_msg_ch, false); - if (l_msg->data_size && l_msg->data) + if (l_msg->data_size && l_msg->data) { dap_stream_ch_pkt_write_unsafe(l_msg_ch, l_msg->ch_pkt_type, l_msg->data,l_msg->data_size); + DAP_DELETE(l_msg->data); + } DAP_DELETE(l_msg); } diff --git a/dap-sdk/net/stream/stream/include/dap_stream.h b/dap-sdk/net/stream/stream/include/dap_stream.h index 21b3aee36a78a24f0bc386eb12aa804c6d24cdbe..baa5a86ba0f68b3856418e377c545148eb4ab29f 100644 --- a/dap-sdk/net/stream/stream/include/dap_stream.h +++ b/dap-sdk/net/stream/stream/include/dap_stream.h @@ -27,11 +27,11 @@ #include <stdbool.h> #include <pthread.h> +#include "dap_events_socket.h" #include "dap_config.h" #include "dap_stream_session.h" #include "dap_stream_ch.h" - -#include "dap_events_socket.h" +#include "dap_timerfd.h" #define CHUNK_SIZE_MAX (3 * 1024) @@ -57,6 +57,8 @@ typedef struct dap_stream { dap_stream_worker_t * stream_worker; struct dap_http_client * conn_http; // HTTP-specific + dap_timerfd_t *keepalive_timer; + char * service_key; bool is_live; diff --git a/modules/app-cli/dap_app_cli.c b/modules/app-cli/dap_app_cli.c index 6c43a07e6f76790af16a24afb663ef71a3afd087..495150e71c3a080d84f00763e9e58e90bab7719f 100644 --- a/modules/app-cli/dap_app_cli.c +++ b/modules/app-cli/dap_app_cli.c @@ -27,11 +27,11 @@ #include <stdlib.h> #include <string.h> +#include "dap_chain_node_cli.h" //#include "dap_client.h" #include "dap_common.h" #include "dap_file_utils.h" #include "dap_strfuncs.h" -#include "dap_chain_node_cli.h" #include "dap_app_cli.h" #include "dap_app_cli_net.h" #include "dap_app_cli_shell.h" diff --git a/modules/app-cli/dap_app_cli_net.c b/modules/app-cli/dap_app_cli_net.c index b75d9a9a7c5a85e144d0fdf29d3c92f4bffe0a45..b5ee8845b1fa4bb1e295da3ebe213aee888a7c26 100644 --- a/modules/app-cli/dap_app_cli_net.c +++ b/modules/app-cli/dap_app_cli_net.c @@ -227,7 +227,7 @@ int dap_app_cli_post_command( dap_app_cli_connect_param_t *a_socket, dap_app_cli dap_string_printf(l_post_data, "POST /connect HTTP/1.1\r\n" "Host: localhost\r\n" "Content-Type: text/text\r\n" - "Content-Length: %d\r\n" + "Content-Length: %zu\r\n" "\r\n" "%s", l_cmd_data->len, l_cmd_data->str); send(*a_socket, l_post_data->str, l_post_data->len, 0); diff --git a/modules/app-cli/dap_app_cli_shell.c b/modules/app-cli/dap_app_cli_shell.c index 56b9e51cbb7dea743d8942ff7e0e71cae9d7bc2d..c1cf0201e0c8e4a29ede1e302fd5ae5e5d73c8a8 100644 --- a/modules/app-cli/dap_app_cli_shell.c +++ b/modules/app-cli/dap_app_cli_shell.c @@ -21,6 +21,7 @@ #include <ws2tcpip.h> #include <io.h> #include <pthread.h> +#include <conio.h> #else #include <sys/ttydefaults.h> #endif @@ -152,7 +153,7 @@ char *rl_readline(const char *prompt) { unsigned char c = rl_getc(rl_instream); - if(c == EOF || c == NEWLINE) + if((char)c == EOF || c == NEWLINE) break; value[value_len] = c; value_len++; diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index ca4cf49bd85359e778496b925da4e3cad7c6fec0..b577c8ad0c9a0fb63bf3ff2080eb6586ef27af36 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -191,7 +191,7 @@ void dap_chain_delete(dap_chain_t * a_chain) DAP_DELETE(a_chain->_inheritor); DAP_DELETE(l_item); }else - log_it(L_WARNING,"Trying to remove non-existent 0x%16llX:0x%16llX chain",a_chain->id.uint64, + log_it(L_WARNING,"Trying to remove non-existent 0x%16"DAP_UINT64_FORMAT_X":0x%16"DAP_UINT64_FORMAT_X" chain",a_chain->id.uint64, a_chain->net_id.uint64); a_chain->datum_types_count = 0; DAP_DELETE(a_chain->datum_types); @@ -301,6 +301,7 @@ static uint16_t s_chain_type_convert(dap_chain_type_t a_type) } /** + * @brief dap_chain_load_from_cfg * Loading chain from config file * @param a_ledger - ledger object * @param a_chain_net_name - chain name, taken from config, for example - "home21-network" @@ -322,9 +323,9 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger, const char * a_cha // Recognize chains id if ( (l_chain_id_str = dap_config_get_item_str(l_cfg,"chain","id")) != NULL ){ - if ( sscanf(l_chain_id_str,"0x%"DAP_UINT64_FORMAT_X,& l_chain_id_u ) !=1 ){ - if ( sscanf(l_chain_id_str,"0x%"DAP_UINT64_FORMAT_x,&l_chain_id_u) !=1 ) { - if ( sscanf(l_chain_id_str,"%"DAP_UINT64_FORMAT_U,&l_chain_id_u ) !=1 ){ + if ( dap_sscanf(l_chain_id_str,"0x%"DAP_UINT64_FORMAT_X,& l_chain_id_u ) !=1 ){ + if ( dap_sscanf(l_chain_id_str,"0x%"DAP_UINT64_FORMAT_x,&l_chain_id_u) !=1 ) { + if ( dap_sscanf(l_chain_id_str,"%"DAP_UINT64_FORMAT_U,&l_chain_id_u ) !=1 ){ log_it (L_ERROR,"Can't recognize '%s' string as chain net id, hex or dec",l_chain_id_str); dap_config_close(l_cfg); return NULL; @@ -345,14 +346,14 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger, const char * a_cha } // Read chain name if ( ( l_chain_name = dap_config_get_item_str(l_cfg,"chain","name") ) == NULL ){ - log_it (L_ERROR,"Can't read chain net name ",l_chain_id_str); + log_it (L_ERROR,"Can't read chain net name %s",l_chain_id_str); dap_config_close(l_cfg); return NULL; } l_chain = dap_chain_create(a_ledger,a_chain_net_name,l_chain_name, a_chain_net_id,l_chain_id); if ( dap_chain_cs_create(l_chain, l_cfg) == 0 ) { - log_it (L_NOTICE,"Consensus initialized for chain id 0x%016llX", + log_it (L_NOTICE,"Consensus initialized for chain id 0x%016"DAP_UINT64_FORMAT_x, l_chain_id.uint64 ); if ( dap_config_get_item_str_default(l_cfg , "files","storage_dir",NULL ) ) { @@ -364,7 +365,8 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger, const char * a_cha log_it(L_DEBUG, "Added atom from treshold"); } } - //dap_chain_save_all( l_chain ); + /* Temporary garbage cleaner */ + dap_chain_save_all( l_chain ); // Save only the valid chain, throw all garbage out! log_it (L_NOTICE, "Loaded chain files"); } else { dap_chain_save_all( l_chain ); @@ -385,7 +387,7 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger, const char * a_cha char** l_datum_types = NULL; uint16_t l_datum_types_count = 0; if((l_datum_types = dap_config_get_array_str(l_cfg, "chain", "datum_types", &l_datum_types_count)) == NULL) { - log_it(L_WARNING, "Can't read chain datum types ", l_chain_id_str); + log_it(L_WARNING, "Can't read chain datum types for chain %s", l_chain_id_str); //dap_config_close(l_cfg); //return NULL; } @@ -403,7 +405,7 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger, const char * a_cha l_chain->datum_types_count = l_count_recognized; } if((l_datum_types = dap_config_get_array_str(l_cfg, "chain", "mempool_auto_types", &l_datum_types_count)) == NULL) { - log_it(L_WARNING, "Can't read chain mempool auto types ", l_chain_id_str); + log_it(L_WARNING, "Can't read chain mempool auto types for chain %s", l_chain_id_str); } // add datum types if(l_chain && l_datum_types && l_datum_types_count) { diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index 3a0fe517d071677f2cc5d3839f0135a7753da15a..833697d368db7f3974aa6c173f9dcf68256b67e8 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -54,10 +54,9 @@ typedef struct dap_chain_cell_file_header } DAP_ALIGN_PACKED dap_chain_cell_file_header_t; -//static const char* s_cells_path = NULL; - /** * @brief dap_chain_cell_init + * current version simply returns 0 * @return */ int dap_chain_cell_init(void) @@ -97,6 +96,7 @@ dap_chain_cell_t * dap_chain_cell_create_fill(dap_chain_t * a_chain, dap_chain_c l_cell->chain = a_chain; l_cell->id.uint64 = a_cell_id.uint64; l_cell->file_storage_path = dap_strdup_printf("%0"DAP_UINT64_FORMAT_x".dchaincell", l_cell->id.uint64); + pthread_rwlock_init(&l_cell->storage_rwlock, NULL); pthread_rwlock_wrlock(&a_chain->cell_rwlock); HASH_ADD(hh, a_chain->cells, id, sizeof(dap_chain_cell_id_t), l_cell); pthread_rwlock_unlock(&a_chain->cell_rwlock); @@ -115,8 +115,9 @@ dap_chain_cell_t * dap_chain_cell_create_fill2(dap_chain_t * a_chain, const char { dap_chain_cell_t * l_cell = DAP_NEW_Z(dap_chain_cell_t); l_cell->chain = a_chain; - sscanf(a_filename, "%"DAP_UINT64_FORMAT_x".dchaincell", &l_cell->id.uint64); + dap_sscanf(a_filename, "%"DAP_UINT64_FORMAT_x".dchaincell", &l_cell->id.uint64); l_cell->file_storage_path = dap_strdup_printf(a_filename); + pthread_rwlock_init(&l_cell->storage_rwlock, NULL); pthread_rwlock_wrlock(&a_chain->cell_rwlock); HASH_ADD(hh, a_chain->cells, id, sizeof(dap_chain_cell_id_t), l_cell); pthread_rwlock_unlock(&a_chain->cell_rwlock); @@ -161,10 +162,12 @@ void dap_chain_cell_delete(dap_chain_cell_t *a_cell) } a_cell->chain = NULL; DAP_DEL_Z(a_cell->file_storage_path) + pthread_rwlock_destroy(&a_cell->storage_rwlock); DAP_DEL_Z(a_cell); } /** + * @brief dap_chain_cell_load * load cell file, which is pointed in a_cell_file_path variable, for example "0.dchaincell" * @param a_chain dap_chain_t object * @param a_cell_file_path contains name of chain, for example "0.dchaincell" @@ -209,21 +212,25 @@ int dap_chain_cell_load(dap_chain_t * a_chain, const char * a_cell_file_path) } unsigned long l_read = fread(l_element, 1, l_el_size, l_f); if(l_read == l_el_size) { - a_chain->callback_atom_add(a_chain, l_element, l_el_size); // !!! blocking GDB call !!! + dap_chain_atom_verify_res_t l_res = a_chain->callback_atom_add(a_chain, l_element, l_el_size); // !!! blocking GDB call !!! + if (l_res == ATOM_PASS && l_res == ATOM_REJECT) { + DAP_DELETE(l_element); + } ++q; } else { - log_it(L_ERROR, "Read only %zd of %zd bytes, stop cell loading", l_read, l_el_size); - ret = -6; + log_it(L_ERROR, "Read only %lu of %zu bytes, stop cell loading", l_read, l_el_size); DAP_DELETE(l_element); + ret = -6; break; } } if (ret < 0) { - log_it(L_INFO, "Couldn't load all atoms, %d only", q); + log_it(L_INFO, "Couldn't load all atoms, %lu only", q); } else { - log_it(L_INFO, "Loaded all %d atoms in cell %s", q, a_cell_file_path); - dap_chain_cell_create_fill2(a_chain, a_cell_file_path); + log_it(L_INFO, "Loaded all %lu atoms in cell %s", q, a_cell_file_path); } + if (q) + dap_chain_cell_create_fill2(a_chain, a_cell_file_path); fclose(l_f); return ret; @@ -236,14 +243,17 @@ int dap_chain_cell_load(dap_chain_t * a_chain, const char * a_cell_file_path) * a_cell->chain contains * name - "zerochain" * net_name - "kelvin-testnet" - * filepath - "C:\\Users\\Public\\Documents\\cellframe-node\\var\\lib\\network\\kelvin-testnet\\zerochain\\/0.dchaincell + * filepath - "C:\\Users\\Public\\Documents\\cellframe-node\\var\\lib\\network\\kelvin-testnet\\zerochain\\/0.dchaincell" + * @param a_atom + * @param a_atom_size + * @return */ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, size_t a_atom_size) { if(!a_cell) return -1; if (!a_atom && !a_cell->chain) { - log_it(L_WARNING,"Chain not found for cell 0x%016X ( %s )", + log_it(L_WARNING,"Chain not found for cell 0x%016"DAP_UINT64_FORMAT_X" ( %s )", a_cell->id.uint64, a_cell->file_storage_path); return -1; } @@ -251,19 +261,19 @@ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, s char l_file_path[MAX_PATH] = {'\0'}; dap_snprintf(l_file_path, MAX_PATH, "%s/%s", DAP_CHAIN_PVT(a_cell->chain)->file_storage_dir, a_cell->file_storage_path); - if(!a_cell->file_storage) - a_cell->file_storage = fopen(l_file_path, "r+b"); + a_cell->file_storage = fopen(l_file_path, "r+b"); if (!a_cell->file_storage) { log_it(L_INFO, "Create chain cell"); a_cell->file_storage = fopen(l_file_path, "w+b"); } if (!a_cell->file_storage) { - log_it(L_ERROR, "Chain cell \"%s\" cannot be opened 0x%016X", + log_it(L_ERROR, "Chain cell \"%s\" cannot be opened 0x%016"DAP_UINT64_FORMAT_X, a_cell->file_storage_path, a_cell->id.uint64); return -3; } } + pthread_rwlock_wrlock(&a_cell->storage_rwlock); fseek(a_cell->file_storage, 0L, SEEK_END); if (ftell(a_cell->file_storage) < (long)sizeof(dap_chain_cell_file_header_t)) { // fill the header fseek(a_cell->file_storage, 0L, SEEK_SET); @@ -275,10 +285,10 @@ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, s .chain_net_id = a_cell->chain->net_id }; if(fwrite(&l_hdr, 1, sizeof(l_hdr), a_cell->file_storage) == sizeof(l_hdr)) { - log_it(L_NOTICE, "Initialized file storage for cell 0x%016X ( %s )", + log_it(L_NOTICE, "Initialized file storage for cell 0x%016"DAP_UINT64_FORMAT_X" ( %s )", a_cell->id.uint64, a_cell->file_storage_path); } else { - log_it(L_ERROR, "Can't init file storage for cell 0x%016X ( %s )", + log_it(L_ERROR, "Can't init file storage for cell 0x%016"DAP_UINT64_FORMAT_X" ( %s )", a_cell->id.uint64, a_cell->file_storage_path); dap_chain_cell_close(a_cell); return -4; @@ -286,17 +296,17 @@ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, s } // if no atom provided in arguments, we flush all the atoms in given chain size_t l_atom_size = a_atom_size ? a_atom_size : 0; - int l_total_wrote_bytes = 0; + size_t l_total_wrote_bytes = 0, l_count = 0; dap_chain_atom_iter_t *l_atom_iter = a_atom ? NULL : a_cell->chain->callback_atom_iter_create(a_cell->chain); if (!a_atom) { fseek(a_cell->file_storage, sizeof(dap_chain_cell_file_header_t), SEEK_SET); } for (dap_chain_atom_ptr_t l_atom = a_atom ? (dap_chain_atom_ptr_t)a_atom : a_cell->chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); l_atom; - l_atom = a_atom ? NULL : a_cell->chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size)) + l_atom = a_atom ? NULL : a_cell->chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size), l_count++) { if (fwrite(&l_atom_size, 1, sizeof(l_atom_size), a_cell->file_storage) != sizeof(l_atom_size)) { - log_it (L_ERROR,"Can't write atom data size from cell 0x%016X in \"%s\"", + log_it (L_ERROR,"Can't write atom data size from cell 0x%016"DAP_UINT64_FORMAT_X" in \"%s\"", a_cell->id.uint64, a_cell->file_storage_path); dap_chain_cell_close(a_cell); @@ -305,7 +315,7 @@ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, s } l_total_wrote_bytes += sizeof(l_atom_size); if (fwrite(l_atom, 1, l_atom_size, a_cell->file_storage) != l_atom_size) { - log_it (L_ERROR, "Can't write data from cell 0x%016X to the file \"%s\"", + log_it (L_ERROR, "Can't write data from cell 0x%016"DAP_UINT64_FORMAT_X" to the file \"%s\"", a_cell->id.uint64, a_cell->file_storage_path); dap_chain_cell_close(a_cell); @@ -322,9 +332,15 @@ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, s } if (l_total_wrote_bytes > 0) { fflush(a_cell->file_storage); - if (!a_atom) + if (!a_atom) { ftruncate(fileno(a_cell->file_storage), l_total_wrote_bytes + sizeof(dap_chain_cell_file_header_t)); + log_it(L_DEBUG, "Saved %zu atoms (total %zu bytes", l_count, l_total_wrote_bytes); + } + } else if (!a_atom) { + log_it(L_WARNING, "Nothing to save, event table is empty"); } + + pthread_rwlock_unlock(&a_cell->storage_rwlock); if (l_atom_iter) { a_cell->chain->callback_atom_iter_delete(l_atom_iter); } @@ -335,6 +351,7 @@ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, s * @brief * return dap_chain_cell_file_append(a_cell, NULL, 0); * @param a_cell dap_chain_cell_t + * @return */ int dap_chain_cell_file_update( dap_chain_cell_t * a_cell) { diff --git a/modules/chain/dap_chain_cs.c b/modules/chain/dap_chain_cs.c index d398b361eaa8ae5f1174b493f28b5d8c6a084725..08f6633557f7d53fea57108b7817d9b6503fecc5 100644 --- a/modules/chain/dap_chain_cs.c +++ b/modules/chain/dap_chain_cs.c @@ -69,7 +69,8 @@ void dap_chain_cs_deinit(void) void dap_chain_cs_type_add (const char * a_cs_str, dap_chain_callback_new_cfg_t a_callback_init) { dap_chain_callback_new_cfg_item_t *l_item = DAP_NEW_Z ( dap_chain_callback_new_cfg_item_t ); - strncpy(l_item->name, a_cs_str, sizeof (l_item->name) ); + strncpy(l_item->name, a_cs_str, sizeof (l_item->name) - 1); + l_item->name[sizeof (l_item->name) - 1] = '\0'; l_item->callback_init = a_callback_init; HASH_ADD_STR( s_class_callbacks, name, l_item); } @@ -97,13 +98,15 @@ int dap_chain_cs_type_create(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) /** * @brief dap_chain_cs_add + * add consensus [dag_pos, dag_poa, block_poa, none] to s_cs_callbacks linked list * @param a_cs_str * @param a_callback_init */ void dap_chain_cs_add (const char * a_cs_str, dap_chain_callback_new_cfg_t a_callback_init) { dap_chain_callback_new_cfg_item_t *l_item = DAP_NEW_Z ( dap_chain_callback_new_cfg_item_t ); - strncpy(l_item->name, a_cs_str, sizeof (l_item->name) ); + strncpy(l_item->name, a_cs_str, sizeof (l_item->name) - 1); + l_item->name[sizeof (l_item->name) - 1] = '\0'; l_item->callback_init = a_callback_init; HASH_ADD_STR( s_cs_callbacks, name, l_item); } diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 16d33b959bfa72a11dd21a33e94f05e49aeb368f..3c6546b95cd26716903ee06a98d23c5d20b88109 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -220,7 +220,12 @@ int dap_chain_ledger_init() */ void dap_chain_ledger_deinit() { - + uint16_t l_net_count = 0; + dap_chain_net_t **l_net_list = dap_chain_net_list(&l_net_count); + for(uint16_t i =0; i < l_net_count; i++) { + dap_chain_ledger_purge(l_net_list[i]->pub.ledger); + } + DAP_DELETE(l_net_list); } /** @@ -244,7 +249,9 @@ static dap_ledger_t * dap_chain_ledger_handle_new(void) } /** + * @brief dap_chain_ledger_handle_free * Remove dap_ledger_t structure + * @param a_ledger */ void dap_chain_ledger_handle_free(dap_ledger_t *a_ledger) { @@ -263,7 +270,7 @@ void dap_chain_ledger_handle_free(dap_ledger_t *a_ledger) } -static int compare_datum_items(const void * l_a, const void * l_b) +/*static int compare_datum_items(const void * l_a, const void * l_b) { const dap_chain_datum_t *l_item_a = (const dap_chain_datum_t*) l_a; const dap_chain_datum_t *l_item_b = (const dap_chain_datum_t*) l_b; @@ -272,7 +279,7 @@ static int compare_datum_items(const void * l_a, const void * l_b) if(l_item_a->header.ts_create < l_item_b->header.ts_create) return -1; return 1; -} +}*/ /** @@ -377,7 +384,7 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger, dap_chain_datum_token_t dap_sign_get_pkey_hash(l_token_item->auth_signs[k],&l_token_item->auth_signs_pkey_hash[k]); } if(s_debug_more) - log_it(L_NOTICE, "Simple token %s added (total_supply = %.1llf total_signs_valid=%hu signs_total=%hu type=DAP_CHAIN_DATUM_TOKEN_PRIVATE )", + log_it(L_NOTICE, "Simple token %s added (total_supply = %.1Lf total_signs_valid=%hu signs_total=%hu type=DAP_CHAIN_DATUM_TOKEN_PRIVATE )", a_token->ticker, dap_chain_datoshi_to_coins(a_token->header_private.total_supply), a_token->header_private.signs_valid, a_token->header_private.signs_total); } @@ -408,6 +415,8 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger, dap_chain_datum_token_t } /** + * @brief s_token_tsd_parse + * * @param a_ledger * @param a_token_item * @param a_token @@ -416,7 +425,7 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger, dap_chain_datum_token_t */ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_item_t *a_token_item , dap_chain_datum_token_t * a_token, size_t a_token_size) { - dap_ledger_private_t * l_ledger_pvt = PVT(a_ledger); + UNUSED(a_ledger); dap_tsd_t * l_tsd= dap_chain_datum_token_tsd_get(a_token,a_token_size); size_t l_tsd_size=0; size_t l_tsd_total_size =a_token_size- (((byte_t*)l_tsd)- (byte_t*) a_token ); @@ -497,7 +506,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite //Allowed tx receiver addres list add, remove or clear case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD:{ if( l_tsd->size == sizeof (dap_chain_addr_t) ){ - dap_chain_addr_t * l_addrs = a_token_item->tx_recv_allow? DAP_NEW_Z_SIZE( typeof (*a_token_item->tx_recv_allow), + dap_chain_addr_t * l_addrs = a_token_item->tx_recv_allow? DAP_NEW_Z_SIZE( dap_chain_addr_t, sizeof(*a_token_item->tx_recv_allow) ) : DAP_REALLOC(a_token_item->tx_recv_allow,(a_token_item->tx_recv_allow_size+1)*sizeof (*a_token_item->tx_recv_allow) ); @@ -536,7 +545,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite } }else{ if(s_debug_more) - log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD expected to have %zd bytes data length, not %zd", + log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD expected to have %zu bytes data length, not %u", sizeof (dap_chain_addr_t), l_tsd->size ); return -10; } @@ -566,7 +575,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite } }else{ if(s_debug_more) - log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_REMOVE expected to have %zd bytes data length, not %zd", + log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_REMOVE expected to have %zu bytes data length, not %u", sizeof (dap_chain_addr_t), l_tsd->size ); return -10; } @@ -579,7 +588,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite a_token_item->tx_recv_allow_size = 0; }else{ if(s_debug_more) - log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_CLEAR expected to have 0 bytes data length, not %zd", + log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_CLEAR expected to have 0 bytes data length, not %u", l_tsd->size ); return -10; } @@ -589,7 +598,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite //Blocked tx receiver addres list add, remove or clear case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD:{ if( l_tsd->size == sizeof (dap_chain_addr_t) ){ - dap_chain_addr_t * l_addrs = a_token_item->tx_recv_block? DAP_NEW_Z_SIZE( typeof (*a_token_item->tx_recv_block), + dap_chain_addr_t * l_addrs = a_token_item->tx_recv_block? DAP_NEW_Z_SIZE( dap_chain_addr_t, sizeof(*a_token_item->tx_recv_block) ) : DAP_REALLOC(a_token_item->tx_recv_block,(a_token_item->tx_recv_block_size+1)*sizeof (*a_token_item->tx_recv_block) ); // Check if its correct @@ -626,7 +635,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite } }else{ if(s_debug_more) - log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD expected to have %zd bytes data length, not %zd", + log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD expected to have %zu bytes data length, not %u", sizeof (dap_chain_addr_t), l_tsd->size ); return -10; } @@ -656,7 +665,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite } }else{ if(s_debug_more) - log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_REMOVE expected to have %zd bytes data length, not %zd", + log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_REMOVE expected to have %zu bytes data length, not %u", sizeof (dap_chain_addr_t), l_tsd->size ); return -10; } @@ -669,7 +678,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite a_token_item->tx_recv_block_size = 0; }else{ if(s_debug_more) - log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_CLEAR expected to have 0 bytes data length, not %zd", + log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_CLEAR expected to have 0 bytes data length, not %u", l_tsd->size ); return -10; } @@ -678,7 +687,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite //Allowed tx sender addres list add, remove or clear case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD:{ if( l_tsd->size == sizeof (dap_chain_addr_t) ){ - dap_chain_addr_t * l_addrs = a_token_item->tx_send_allow? DAP_NEW_Z_SIZE( typeof (*a_token_item->tx_send_allow), + dap_chain_addr_t * l_addrs = a_token_item->tx_send_allow ? DAP_NEW_Z_SIZE( dap_chain_addr_t, sizeof(*a_token_item->tx_send_allow) ) : DAP_REALLOC(a_token_item->tx_send_allow,(a_token_item->tx_send_allow_size+1)*sizeof (*a_token_item->tx_send_allow) ); // Check if its correct @@ -713,7 +722,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite } }else{ if(s_debug_more) - log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD expected to have %zd bytes data length, not %zd", + log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD expected to have %zu bytes data length, not %u", sizeof (dap_chain_addr_t), l_tsd->size ); } }break; @@ -742,7 +751,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite } }else{ if(s_debug_more) - log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_REMOVE expected to have %zd bytes data length, not %zd", + log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_REMOVE expected to have %zu bytes data length, not %u", sizeof (dap_chain_addr_t), l_tsd->size ); return -10; } @@ -755,7 +764,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite a_token_item->tx_send_allow_size = 0; }else{ if(s_debug_more) - log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_CLEAR expected to have 0 bytes data length, not %zd", + log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_CLEAR expected to have 0 bytes data length, not %u", l_tsd->size ); return -10; } @@ -765,7 +774,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite //Blocked tx sender addres list add, remove or clear case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD:{ if( l_tsd->size == sizeof (dap_chain_addr_t) ){ - dap_chain_addr_t * l_addrs = a_token_item->tx_send_block? DAP_NEW_Z_SIZE( typeof (*a_token_item->tx_send_block), + dap_chain_addr_t * l_addrs = a_token_item->tx_send_block ? DAP_NEW_Z_SIZE( dap_chain_addr_t, sizeof(*a_token_item->tx_send_block) ) : DAP_REALLOC(a_token_item->tx_send_block,(a_token_item->tx_send_block_size+1)*sizeof (*a_token_item->tx_send_block) ); // Check if its correct @@ -800,7 +809,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite } }else{ if(s_debug_more) - log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD expected to have %zd bytes data length, not %zd", + log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD expected to have %zu bytes data length, not %u", sizeof (dap_chain_addr_t), l_tsd->size ); } }break; @@ -829,7 +838,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite } }else{ if(s_debug_more) - log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE expected to have %zd bytes data length, not %zd", + log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE expected to have %zu bytes data length, not %u", sizeof (dap_chain_addr_t), l_tsd->size ); return -10; } @@ -842,7 +851,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite a_token_item->tx_send_block_size = 0; }else{ if(s_debug_more) - log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_CLEAR expected to have 0 bytes data length, not %zd", + log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_CLEAR expected to have 0 bytes data length, not %u", l_tsd->size ); return -10; } @@ -862,6 +871,40 @@ int dap_chain_ledger_token_load(dap_ledger_t *a_ledger, dap_chain_datum_token_t } return 0; } + +dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger) +{ + dap_list_t *l_ret_list = NULL; + dap_chain_ledger_token_item_t *l_token_item, *l_tmp_item; + pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock); + HASH_ITER(hh, PVT(a_ledger)->tokens, l_token_item, l_tmp_item) { + const char *l_type_str; + switch (l_token_item->type) { + case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: + l_type_str = "SIMPLE"; break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: + l_type_str = "PRIVATE_DECL"; break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: + l_type_str = "PRIVATE_UPDATE"; break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: + l_type_str = "PUBLIC"; + default: + l_type_str = "UNKNOWN"; break; + } + char *l_item_str = dap_strdup_printf("Token name '%s', type %s, flags %hu\n" + "\tSupply (current/total) %"DAP_UINT64_FORMAT_U"/%"DAP_UINT64_FORMAT_U"\n" + "\tAuth signs (valid/total) %zu/%zu\n" + "\tTotal emissions %u\n", + &l_token_item->ticker, l_type_str, l_token_item->flags, + l_token_item->current_supply, l_token_item->total_supply, + l_token_item->auth_signs_valid, l_token_item->auth_signs_total, + HASH_COUNT(l_token_item->token_emissions)); + l_ret_list = dap_list_append(l_ret_list, l_item_str); + } + pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock); + return l_ret_list; +} + /** * @brief s_treshold_emissions_proc * @param a_ledger @@ -933,7 +976,8 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) dap_global_db_obj_t *l_objs = dap_chain_global_db_gr_load(l_gdb_group, &l_objs_count); for (size_t i = 0; i < l_objs_count; i++) { dap_chain_ledger_token_item_t *l_token_item = DAP_NEW_Z(dap_chain_ledger_token_item_t); - strncpy(l_token_item->ticker, l_objs[i].key, sizeof(l_token_item->ticker)); + strncpy(l_token_item->ticker, l_objs[i].key, sizeof(l_token_item->ticker) - 1); + l_token_item->ticker[sizeof(l_token_item->ticker) - 1] = '\0'; l_token_item->datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, l_objs[i].value_len); memcpy(l_token_item->datum_token, l_objs[i].value, l_objs[i].value_len); pthread_rwlock_init(&l_token_item->token_emissions_rwlock, NULL); @@ -955,6 +999,8 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) l_objs_count = 0; l_objs = dap_chain_global_db_gr_load(l_gdb_group, &l_objs_count); for (size_t i = 0; i < l_objs_count; i++) { + if (!l_objs[i].value_len) + continue; dap_chain_ledger_token_emission_item_t *l_emission_item = DAP_NEW_Z(dap_chain_ledger_token_emission_item_t); dap_chain_hash_fast_from_str(l_objs[i].key, &l_emission_item->datum_token_emission_hash); l_emission_item->datum_token_emission = DAP_NEW_Z_SIZE(dap_chain_datum_token_emission_t, l_objs[i].value_len); @@ -1098,7 +1144,7 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, const dap_ ret = -1; }else if ( (! l_token_item) && ( l_threshold_emissions_count >= s_treshold_emissions_max)) { if(s_debug_more) - log_it(L_WARNING,"Treshold for emissions is overfulled (%lu max)", + log_it(L_WARNING,"Treshold for emissions is overfulled (%zu max)", s_treshold_emissions_max); ret = -2; }else{ // Chech emission correctness @@ -1221,7 +1267,7 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, DAP_DELETE(l_gdb_group); char * l_token_emission_address_str = dap_chain_addr_to_str( &(a_token_emission->hdr.address) ); if(s_debug_more) - log_it(L_NOTICE, "Added token emission datum to %s: type=%s value=%.1llf token=%s to_addr=%s ", + log_it(L_NOTICE, "Added token emission datum to %s: type=%s value=%.1Lf token=%s to_addr=%s ", l_token_item?"emissions cache":"emissions treshold", c_dap_chain_datum_token_emission_type_str[ a_token_emission->hdr.type ] , dap_chain_datoshi_to_coins(a_token_emission->hdr.value), c_token_ticker, @@ -1229,14 +1275,14 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, DAP_DELETE(l_token_emission_address_str); }else{ if(s_debug_more) - log_it(L_WARNING,"Treshold for emissions is overfulled (%lu max), dropping down new data, added nothing", + log_it(L_WARNING,"Treshold for emissions is overfulled (%zu max), dropping down new data, added nothing", s_treshold_emissions_max); ret = -2; } } else { if (l_token_item) { if(s_debug_more) - log_it(L_ERROR, "Can't add token emission datum of %"DAP_UINT64_FORMAT_U" %s ( %s )", + log_it(L_ERROR, "Duplicate token emission datum of %"DAP_UINT64_FORMAT_U" %s ( %s )", a_token_emission->hdr.value, c_token_ticker, l_hash_str); } ret = -1; @@ -1434,9 +1480,9 @@ dap_chain_datum_tx_t* dap_chain_ledger_tx_find_by_hash(dap_ledger_t *a_ledger, d static bool dap_chain_ledger_item_is_used_out(dap_chain_ledger_tx_item_t *a_item, int a_idx_out) { bool l_used_out = false; - if(!a_item) { + if (!a_item || !a_item->cache_data.n_outs) { //log_it(L_DEBUG, "list_cached_item is NULL"); - return false; + return true; } if(a_idx_out >= MAX_OUT_ITEMS) { if(s_debug_more) @@ -1756,11 +1802,11 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t // Get permissions l_token_item = NULL; pthread_rwlock_rdlock(&l_ledger_priv->tokens_rwlock); - HASH_FIND_STR(l_ledger_priv->tokens,l_token, l_token_item); + HASH_FIND_STR(l_ledger_priv->tokens, l_token, l_token_item); pthread_rwlock_unlock(&l_ledger_priv->tokens_rwlock); if (! l_token_item){ if(s_debug_more) - log_it(L_WARNING, "No token permissions found for token %s", l_token); + log_it(L_WARNING, "No token item found for token %s", l_token); l_err_num = -15; break; } @@ -1887,7 +1933,7 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t pthread_rwlock_unlock(&l_ledger_priv->tokens_rwlock); if (! l_token_item){ if(s_debug_more) - log_it(L_WARNING, "No token permissions found for token %s", l_token); + log_it(L_WARNING, "No token item found for token %s", l_token); l_err_num = -15; break; } @@ -1934,8 +1980,8 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t } l_value_cur = NULL; } else { - log_it(L_ERROR, "Emission for tx_token wasn't found"); - l_err_num = -11; + log_it(L_WARNING, "Emission for tx_token wasn't found"); + l_err_num = DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION; break; } } @@ -2003,7 +2049,7 @@ int dap_chain_ledger_tx_add_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t * return 0; } -int dap_chain_ledger_balance_cache_update(dap_ledger_t *a_ledger, dap_ledger_wallet_balance_t *a_balance) +static int s_balance_cache_update(dap_ledger_t *a_ledger, dap_ledger_wallet_balance_t *a_balance) { char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_BALANCES_STR); uint128_t *l_balance_value = DAP_NEW_Z(uint128_t); @@ -2014,6 +2060,25 @@ int dap_chain_ledger_balance_cache_update(dap_ledger_t *a_ledger, dap_ledger_wal DAP_DELETE(l_balance_value); return -1; } + DAP_DELETE(l_gdb_group); + return 0; +} + +static int s_tx_cache_update(dap_ledger_t *a_ledger, dap_chain_ledger_tx_item_t *a_item) +{ + size_t l_tx_size = dap_chain_datum_tx_get_size(a_item->tx); + uint8_t *l_tx_cache = DAP_NEW_Z_SIZE(uint8_t, l_tx_size + sizeof(a_item->cache_data)); + memcpy(l_tx_cache, &a_item->cache_data, sizeof(a_item->cache_data)); + memcpy(l_tx_cache + sizeof(a_item->cache_data), a_item->tx, l_tx_size); + char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TXS_STR); + char *l_tx_hash_str = dap_chain_hash_fast_to_str_new(&a_item->tx_hash_fast); + if (!dap_chain_global_db_gr_set(l_tx_hash_str, l_tx_cache, l_tx_size + sizeof(a_item->cache_data), l_gdb_group)) { + if(s_debug_more) + log_it(L_WARNING, "Ledger cache mismatch"); + DAP_DELETE(l_tx_cache); + return -1; + } + DAP_DELETE(l_gdb_group); return 0; } @@ -2061,7 +2126,7 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, if (!l_item_tmp) { if (l_threshold_txs_count >= s_treshold_txs_max) { if(s_debug_more) - log_it(L_WARNING,"Treshold for tranactions is overfulled (%lu max), dropping down new data, added nothing", + log_it(L_WARNING,"Treshold for tranactions is overfulled (%zu max), dropping down new data, added nothing", s_treshold_txs_max); } else { l_item_tmp = DAP_NEW_Z(dap_chain_ledger_tx_item_t); @@ -2118,7 +2183,7 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, l_multichannel = true; } l_ticker_old_trl = dap_stpcpy(l_token_ticker_old, l_token_ticker); - dap_chain_hash_fast_t *l_tx_prev_hash; + int l_tx_prev_out_used_idx; if (l_type == TX_ITEM_TYPE_IN) { dap_chain_tx_in_t *l_tx_in = bound_item->in.tx_cur_in; dap_ledger_wallet_balance_t *wallet_balance = NULL; @@ -2137,11 +2202,11 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, bound_item->out.tx_prev_out->header.value : bound_item->out.tx_prev_out_ext->header.value; if(s_debug_more) - log_it(L_DEBUG,"SPEND %lu from addr: %s", l_value, l_wallet_balance_key); + log_it(L_DEBUG,"SPEND %"DAP_UINT64_FORMAT_U" from addr: %s", l_value, l_wallet_balance_key); uint128_t l_sub = dap_chain_uint128_from(l_value); wallet_balance->balance = dap_uint128_substract(wallet_balance->balance, l_sub); // Update the cache - dap_chain_ledger_balance_cache_update(a_ledger, wallet_balance); + s_balance_cache_update(a_ledger, wallet_balance); } else { if(s_debug_more) log_it(L_ERROR,"!!! Attempt to SPEND from some non-existent balance !!!: %s %s", l_addr_str, l_token_ticker); @@ -2149,17 +2214,18 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, DAP_DELETE(l_addr_str); DAP_DELETE(l_wallet_balance_key); /// Mark 'out' item in cache because it used - l_tx_prev_hash = &(l_prev_item_out->cache_data.tx_hash_spent_fast[l_tx_in->header.tx_out_prev_idx]); + l_tx_prev_out_used_idx = l_tx_in->header.tx_out_prev_idx; } else { // TX_ITEM_TYPE_IN_COND // all balance deducts performed with previous conditional transaction dap_chain_tx_in_cond_t *l_tx_in_cond = bound_item->in.tx_cur_in_cond; /// Mark 'out' item in cache because it used - l_tx_prev_hash = &(l_prev_item_out->cache_data.tx_hash_spent_fast[l_tx_in_cond->header.tx_out_prev_idx]); + l_tx_prev_out_used_idx = l_tx_in_cond->header.tx_out_prev_idx; } - memcpy(l_tx_prev_hash, l_tx_hash, sizeof(dap_chain_hash_fast_t)); // add a used output + memcpy(&(l_prev_item_out->cache_data.tx_hash_spent_fast[l_tx_prev_out_used_idx]), l_tx_hash, sizeof(dap_chain_hash_fast_t)); l_prev_item_out->cache_data.n_outs_used++; - char * l_tx_prev_hash_str = dap_chain_hash_fast_to_str_new(l_tx_prev_hash); + // mirror it in the cache + s_tx_cache_update(a_ledger, l_prev_item_out); // delete previous transactions from cache because all out is used if(l_prev_item_out->cache_data.n_outs_used == l_prev_item_out->cache_data.n_outs) { @@ -2167,31 +2233,26 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, // remove from memory ledger int res = dap_chain_ledger_tx_remove(a_ledger, &l_tx_prev_hash_to_del); if(res == -2) { - if(s_debug_more) - log_it(L_ERROR, "Can't delete previous transactions because hash=0x%x not found", l_tx_prev_hash_str); + if(s_debug_more) { + char * l_tx_prev_hash_str = dap_chain_hash_fast_to_str_new(&l_tx_prev_hash_to_del); + log_it(L_ERROR, "Can't delete previous transactions because hash=%s not found", l_tx_prev_hash_str); + DAP_DELETE(l_tx_prev_hash_str); + } ret = -100; - DAP_DELETE(l_tx_prev_hash_str); dap_list_free_full(l_list_bound_items, free); goto FIN; } else if(res != 1) { - if(s_debug_more) - log_it(L_ERROR, "Can't delete previous transactions with hash=0x%x", l_tx_prev_hash_str); + if(s_debug_more) { + char * l_tx_prev_hash_str = dap_chain_hash_fast_to_str_new(&l_tx_prev_hash_to_del); + log_it(L_ERROR, "Can't delete previous transactions with hash=%s", l_tx_prev_hash_str); + DAP_DELETE(l_tx_prev_hash_str); + } ret = -101; - DAP_DELETE(l_tx_prev_hash_str); dap_list_free_full(l_list_bound_items, free); goto FIN; } - // TODO restore when the blockchain appears - // remove from mempool ledger - /*char *l_tx_prev_hash_to_del_str = dap_chain_hash_fast_to_str_new(&l_tx_prev_hash_to_del); - if(!dap_chain_global_db_gr_del( dap_strdup(l_tx_prev_hash_to_del_str), c_dap_datum_mempool_gdb_group)) { - log_it(L_ERROR, "Can't delete previous transactions from mempool with hash=0x%x", - l_tx_prev_hash_str); - } - DAP_DELETE( l_tx_prev_hash_to_del_str);*/ - } - DAP_DELETE(l_tx_prev_hash_str); + } // go to next previous transaction l_list_tmp = dap_list_next(l_list_tmp); } @@ -2239,7 +2300,7 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, uint64_t l_value = (l_type == TX_ITEM_TYPE_OUT) ? l_out_item->header.value : l_out_item_ext->header.value; if(s_debug_more) - log_it (L_DEBUG,"GOT %lu to addr: %s", l_value, l_wallet_balance_key); + log_it (L_DEBUG,"GOT %"DAP_UINT64_FORMAT_U" to addr: %s", l_value, l_wallet_balance_key); pthread_rwlock_rdlock(&l_ledger_priv->balance_accounts_rwlock); HASH_FIND_STR(PVT(a_ledger)->balance_accounts, l_wallet_balance_key, wallet_balance); pthread_rwlock_unlock(&l_ledger_priv->balance_accounts_rwlock); @@ -2250,10 +2311,11 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, wallet_balance->balance = dap_uint128_add(wallet_balance->balance, l_add); DAP_DELETE (l_wallet_balance_key); // Update the cache - dap_chain_ledger_balance_cache_update(a_ledger, wallet_balance); + s_balance_cache_update(a_ledger, wallet_balance); } else { wallet_balance = DAP_NEW_Z(dap_ledger_wallet_balance_t); wallet_balance->key = l_wallet_balance_key; + strcpy(wallet_balance->token_ticker, l_token_ticker); uint128_t l_add = dap_chain_uint128_from(l_value); wallet_balance->balance = dap_uint128_add(wallet_balance->balance, l_add); if(s_debug_more) @@ -2263,7 +2325,7 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, strlen(l_wallet_balance_key), wallet_balance); pthread_rwlock_unlock(&l_ledger_priv->balance_accounts_rwlock); // Add it to cache - dap_chain_ledger_balance_cache_update(a_ledger, wallet_balance); + s_balance_cache_update(a_ledger, wallet_balance); } DAP_DELETE (l_addr_str); } else { @@ -2281,26 +2343,18 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, memcpy(&l_item_tmp->tx_hash_fast, l_tx_hash, sizeof(dap_chain_hash_fast_t)); l_item_tmp->tx = DAP_NEW_SIZE(dap_chain_datum_tx_t, dap_chain_datum_tx_get_size(a_tx)); l_item_tmp->cache_data.ts_created = (time_t) a_tx->header.ts_created; - //calculate l_item_tmp->n_outs; - + dap_list_t *l_tist_tmp = dap_chain_datum_tx_items_get(a_tx, TX_ITEM_TYPE_OUT_ALL, &l_item_tmp->cache_data.n_outs); // If debug mode dump the UTXO - if ( dap_log_level_get() == L_DEBUG){ - l_item_tmp->cache_data.n_outs = 0; - if( l_item_tmp->cache_data.n_outs){ - dap_list_t *l_tist_tmp = dap_chain_datum_tx_items_get(a_tx, TX_ITEM_TYPE_OUT, &l_item_tmp->cache_data.n_outs); - for (size_t i =0; i < (size_t) l_item_tmp->cache_data.n_outs; i++){ - // TODO list conditional outputs - dap_chain_tx_out_t * l_tx_out = l_tist_tmp->data; - char * l_tx_out_addr_str = dap_chain_addr_to_str( &l_tx_out->addr ); - if(s_debug_more) - log_it(L_DEBUG,"Added tx out to %s",l_tx_out_addr_str ); - DAP_DELETE (l_tx_out_addr_str); - } - if(l_tist_tmp) - dap_list_free(l_tist_tmp); + if (dap_log_level_get() == L_DEBUG && s_debug_more) { + for (size_t i =0; i < (size_t) l_item_tmp->cache_data.n_outs; i++){ + dap_chain_tx_out_t * l_tx_out = l_tist_tmp->data; + char * l_tx_out_addr_str = dap_chain_addr_to_str( &l_tx_out->addr ); + log_it(L_DEBUG,"Added tx out to %s",l_tx_out_addr_str ); + DAP_DELETE (l_tx_out_addr_str); } } - + if(l_tist_tmp) + dap_list_free(l_tist_tmp); if (!l_ticker_trl) { //No token ticker in previous txs if(s_debug_more) log_it(L_DEBUG, "No token ticker in previous txs"); @@ -2419,7 +2473,7 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger) DAP_DELETE(l_item_current->tx); HASH_DEL(l_ledger_priv->ledger_items, l_item_current); dap_chain_hash_fast_to_str(&l_item_current->tx_hash_fast, l_hash_str, l_hash_str_size); - dap_chain_global_db_gr_del(l_hash_str, l_gdb_group); + dap_chain_global_db_gr_del(dap_strdup(l_hash_str), l_gdb_group); DAP_DELETE(l_item_current); } DAP_DELETE(l_gdb_group); @@ -2429,7 +2483,7 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger) HASH_ITER(hh, l_ledger_priv->treshold_txs, l_item_current, l_item_tmp) { HASH_DEL(l_ledger_priv->treshold_txs, l_item_current); dap_chain_hash_fast_to_str(&l_item_current->tx_hash_fast, l_hash_str, l_hash_str_size); - dap_chain_global_db_gr_del(l_hash_str, l_gdb_group); + dap_chain_global_db_gr_del(dap_strdup(l_hash_str), l_gdb_group); DAP_DELETE(l_item_current->tx); DAP_DELETE(l_item_current); } @@ -2441,7 +2495,6 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger) HASH_ITER(hh, l_ledger_priv->balance_accounts, l_balance_current, l_balance_tmp) { HASH_DEL(l_ledger_priv->balance_accounts, l_balance_current); dap_chain_global_db_gr_del(l_balance_current->key, l_gdb_group); - DAP_DELETE(l_balance_current->key); DAP_DELETE(l_balance_current); } DAP_DELETE(l_gdb_group); @@ -2452,7 +2505,7 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger) HASH_ITER(hh, l_ledger_priv->treshold_emissions, l_emission_current, l_emission_tmp) { HASH_DEL(l_ledger_priv->treshold_emissions, l_emission_current); dap_chain_hash_fast_to_str(&l_emission_current->datum_token_emission_hash, l_hash_str, l_hash_str_size); - dap_chain_global_db_gr_del(l_hash_str, l_emissions_gdb_group); + dap_chain_global_db_gr_del(dap_strdup(l_hash_str), l_emissions_gdb_group); DAP_DELETE(l_emission_current->datum_token_emission); DAP_DELETE(l_emission_current); } @@ -2466,12 +2519,12 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger) HASH_ITER(hh, l_token_current->token_emissions, l_emission_current, l_emission_tmp) { HASH_DEL(l_token_current->token_emissions, l_emission_current); dap_chain_hash_fast_to_str(&l_emission_current->datum_token_emission_hash, l_hash_str, l_hash_str_size); - dap_chain_global_db_gr_del(l_hash_str, l_emissions_gdb_group); + dap_chain_global_db_gr_del(dap_strdup(l_hash_str), l_emissions_gdb_group); DAP_DELETE(l_emission_current->datum_token_emission); DAP_DELETE(l_emission_current); } pthread_rwlock_unlock(&l_token_current->token_emissions_rwlock); - dap_chain_global_db_gr_del(l_token_current->ticker, l_gdb_group); + dap_chain_global_db_gr_del(dap_strdup(l_token_current->ticker), l_gdb_group); DAP_DELETE(l_token_current->datum_token); pthread_rwlock_destroy(&l_token_current->token_emissions_rwlock); DAP_DELETE(l_token_current); @@ -2567,8 +2620,12 @@ uint128_t dap_chain_ledger_calc_balance(dap_ledger_t *a_ledger, const dap_chain_ pthread_rwlock_unlock(&PVT(a_ledger)->balance_accounts_rwlock); if (l_balance_item) { if(s_debug_more) - log_it (L_INFO,"Found address in cache with balance %"DAP_UINT64_FORMAT_U"", l_balance_item->balance); + log_it (L_INFO,"Found address in cache with balance %"DAP_UINT64_FORMAT_U"", + dap_chain_uint128_to(l_balance_item->balance)); l_ret = l_balance_item->balance; + } else { + if (s_debug_more) + log_it (L_WARNING, "Balance item %s not found", l_wallet_balance_key); } DAP_DELETE(l_addr); DAP_DELETE(l_wallet_balance_key); diff --git a/modules/chain/dap_chain_vf.c b/modules/chain/dap_chain_vf.c index 5331558c69362ca447b37d9e5b80ea3a84b63a62..d6797bea0775e50c21584eb53e66e6e6c62a54d8 100644 --- a/modules/chain/dap_chain_vf.c +++ b/modules/chain/dap_chain_vf.c @@ -39,7 +39,8 @@ int dap_chain_vf_init() } /** - * @brief dap_chain_vf_deinit + * @brief + * empty function */ void dap_chain_vf_deinit() { @@ -50,6 +51,8 @@ void dap_chain_vf_deinit() * @brief * empty function * return 0 + * @param a_vf_id + * @param a_callback * @return */ int dap_chain_vf_add(dap_chain_vf_id_t a_vf_id, dap_chain_vf_callback_t a_callback) diff --git a/modules/chain/include/dap_chain_cell.h b/modules/chain/include/dap_chain_cell.h index 5f599e40e4b9f8a7790fcd7792178e63a902304b..2c5f9246e746be0de3c0f5a1d83eae1d4f1a3267 100644 --- a/modules/chain/include/dap_chain_cell.h +++ b/modules/chain/include/dap_chain_cell.h @@ -37,6 +37,7 @@ typedef struct dap_chain_cell { char * file_storage_path; FILE * file_storage; /// @param file_cache @brief Cache for raw blocks uint8_t file_storage_type; /// @param file_storage_type @brief Is file_storage is raw, compressed or smth else + pthread_rwlock_t storage_rwlock; UT_hash_handle hh; } dap_chain_cell_t; diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h index ca99601676ac9b15c873634b1d1e886f722876b3..31baa98f0f70fb9ccf3f3a8a963fb197c7e18c50 100644 --- a/modules/chain/include/dap_chain_ledger.h +++ b/modules/chain/include/dap_chain_ledger.h @@ -54,7 +54,9 @@ typedef bool (* dap_chain_ledger_verificator_callback_t)(dap_chain_tx_out_cond_t #define DAP_CHAIN_LEDGER_CHECK_CELLS_DS 0x0100 // Error code for no previous transaction (candidate to threshold) -#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS -5 +#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS -111 +// Error code for no emission for a transaction (candidate to threshold) +#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION -112 #define DAP_CHAIN_LEDGER_TOKENS_STR "tokens" #define DAP_CHAIN_LEDGER_EMISSIONS_STR "emissions" @@ -121,7 +123,7 @@ int dap_chain_ledger_token_ticker_check(dap_ledger_t * a_ledger, const char *a_t int dap_chain_ledger_token_add(dap_ledger_t * a_ledger,dap_chain_datum_token_t *a_token, size_t a_token_size); int dap_chain_ledger_token_load(dap_ledger_t * a_ledger,dap_chain_datum_token_t *a_token, size_t a_token_size); int dap_chain_ledger_token_decl_add_check(dap_ledger_t * a_ledger,dap_chain_datum_token_t *a_token); - +dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger); /** * Add token emission datum */ diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c index 0b003381dd0161a9ed212c34df67352fec1a7d94..1baf6eb0b38fe2dc05f1d004335c41bb98753a6a 100644 --- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c +++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c @@ -23,10 +23,10 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic */ #include <sys/time.h> +#include "dap_timerfd.h" #include "dap_common.h" #include "dap_hash.h" #include "rand/dap_rand.h" -#include "dap_timerfd.h" #include "dap_chain.h" #include "dap_chain_datum_tx.h" @@ -205,8 +205,8 @@ static bool s_grace_period_control(dap_chain_net_srv_grace_t *a_grace) // Check cond output if it equesl or not to request if ( l_tx_out_cond->subtype.srv_pay.srv_uid.uint64 != l_request->hdr.srv_uid.uint64 ){ - log_it( L_WARNING, "Wrong service uid in request, tx expect to close its output with 0x%016lX", - l_tx_out_cond->subtype.srv_pay.srv_uid ); + log_it( L_WARNING, "Wrong service uid in request, tx expect to close its output with 0x%016"DAP_UINT64_FORMAT_X, + l_tx_out_cond->subtype.srv_pay.srv_uid.uint64 ); l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_WRONG_SRV_UID ; goto free_exit; } @@ -283,6 +283,7 @@ static bool s_grace_period_control(dap_chain_net_srv_grace_t *a_grace) // TODO extend callback to pass ext and ext size from service callbacks l_receipt = dap_chain_net_srv_issue_receipt( l_usage->service, l_usage, l_usage->price,NULL,0 ); dap_stream_ch_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_REQUEST, l_receipt, l_receipt->size); + DAP_DELETE(l_receipt); }else{ l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_PRICE_NOT_FOUND ; goto free_exit; @@ -471,7 +472,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) // only for server case DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_RESPONSE:{ if (l_ch_pkt->hdr.size <= sizeof(dap_chain_receipt_info_t) + 1) { - log_it(L_ERROR, "Wrong sign response size, %zd when expected at least %zd with smth", l_ch_pkt->hdr.size, + log_it(L_ERROR, "Wrong sign response size, %u when expected at least %zu with smth", l_ch_pkt->hdr.size, sizeof(dap_chain_receipt_info_t)+1 ); break; } @@ -703,7 +704,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) log_it( L_NOTICE, "Remote responsed with error code 0x%08X", l_err->code ); // TODO code for service client mode }else{ - log_it(L_ERROR, "Wrong error response size, %zd when expected %zd", l_ch_pkt->hdr.size, + log_it(L_ERROR, "Wrong error response size, %u when expected %zu", l_ch_pkt->hdr.size, sizeof ( dap_stream_ch_chain_net_srv_pkt_error_t) ); } } break; diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv_pkt.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv_pkt.c index a6f028efe7734c86f29fc4b16783f71c50c1e32a..e630e2df12c183ecf7857c1086e0e9a908495dd6 100644 --- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv_pkt.c +++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv_pkt.c @@ -30,8 +30,8 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include <stdint.h> #include <string.h> -#include <dap_common.h> #include <dap_stream.h> +#include <dap_common.h> #include <dap_stream_pkt.h> #include <dap_stream_ch_pkt.h> #include "dap_stream_ch_chain_net_srv_pkt.h" diff --git a/modules/channel/chain-net/dap_stream_ch_chain_net.c b/modules/channel/chain-net/dap_stream_ch_chain_net.c index 5c9bfdbcfe349fa09da05716b307543cb9ceb74e..c54f1ae14aa4f12b7c27117565461b329b8e8736 100644 --- a/modules/channel/chain-net/dap_stream_ch_chain_net.c +++ b/modules/channel/chain-net/dap_stream_ch_chain_net.c @@ -246,10 +246,9 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) dap_chain_node_addr_t * l_addr = (dap_chain_node_addr_t *) l_ch_chain_net_pkt->data; if(l_session_data) memcpy( &l_session_data->addr_remote,l_addr,sizeof (*l_addr) ); - log_it(L_NOTICE,"Accepted remote node addr 0x%016llX",l_addr->uint64); + log_it(L_NOTICE,"Accepted remote node addr 0x%016"DAP_UINT64_FORMAT_X, l_addr->uint64); }else { - log_it(L_WARNING,"Wrong data secion size %u",l_ch_chain_net_pkt_data_size, - sizeof (dap_chain_node_addr_t)); + log_it(L_WARNING,"Wrong data secion size %zu",l_ch_chain_net_pkt_data_size); } dap_stream_ch_set_ready_to_write_unsafe(a_ch, false); }break; @@ -257,7 +256,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE"); if ( l_ch_chain_net_pkt_data_size == sizeof (dap_chain_node_addr_t) ) { dap_chain_node_addr_t * l_addr = (dap_chain_node_addr_t *) l_ch_chain_net_pkt->data; - log_it(L_NOTICE,"Leased new node addr 0x%016llX",l_addr->uint64); + log_it(L_NOTICE,"Leased new node addr 0x%016"DAP_UINT64_FORMAT_X,l_addr->uint64); dap_chain_net_t * l_net = dap_chain_net_by_id( l_ch_chain_net_pkt->hdr.net_id ); if ( l_net == NULL){ char l_err_str[]="ERROR_NET_INVALID_ID"; @@ -267,15 +266,14 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) log_it(L_ERROR, "Invalid net id in packet"); } else { if (dap_db_set_cur_node_addr_exp( l_addr->uint64, l_net->pub.name )) - log_it(L_NOTICE,"Set up cur node address 0x%016llX",l_addr->uint64); + log_it(L_NOTICE,"Set up cur node address 0x%016"DAP_UINT64_FORMAT_X,l_addr->uint64); else - log_it(L_ERROR,"Can't set up cur node address 0x%016llX",l_addr->uint64); + log_it(L_ERROR,"Can't set up cur node address 0x%016"DAP_UINT64_FORMAT_X,l_addr->uint64); } if(l_session_data) memcpy( &l_session_data->addr_remote,l_addr,sizeof (*l_addr) ); }else { - log_it(L_WARNING,"Wrong data secion size %u",l_ch_chain_net_pkt_data_size, - sizeof (dap_chain_node_addr_t)); + log_it(L_WARNING,"Wrong data secion size %zu",l_ch_chain_net_pkt_data_size); } dap_stream_ch_set_ready_to_write_unsafe(a_ch, false); }break; diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 9bd440266b666d73d85e0d04797662780db40ba1..85bcc06fe19016aafcf0adff7d61d053a83d17e8 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -104,7 +104,6 @@ static void s_sync_out_chains_last_worker_callback(dap_worker_t *a_worker, void static void s_sync_out_chains_first_worker_callback(dap_worker_t *a_worker, void *a_arg); static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_arg); -static void s_sync_out_gdb_synced_data_worker_callback(dap_worker_t *a_worker, void *a_arg); static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg); @@ -258,7 +257,7 @@ static void s_sync_out_chains_last_worker_callback(dap_worker_t *a_worker, void dap_stream_ch_chain_t * l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch); l_ch_chain->request_atom_iter = l_sync_request->chain.request_atom_iter; // last packet - dap_stream_ch_chain_sync_request_t l_request = {0}; + dap_stream_ch_chain_sync_request_t l_request = {}; if (s_debug_more ) log_it(L_INFO,"Out: DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS"); dap_stream_ch_chain_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS, @@ -471,8 +470,8 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg) if (!l_chain) { if (s_debug_more) log_it(L_WARNING, "No chain found for DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN"); - DAP_DELETE(l_sync_request); DAP_DEL_Z(l_pkt_item->pkt_data); + DAP_DELETE(l_sync_request); return true; } dap_chain_atom_ptr_t l_atom_copy = (dap_chain_atom_ptr_t)l_pkt_item->pkt_data; @@ -498,6 +497,8 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg) dap_chain_hash_fast_to_str(&l_atom_hash,l_atom_hash_str,sizeof (l_atom_hash_str)-1 ); log_it(L_WARNING,"Atom with hash %s for %s:%s not accepted (code ATOM_PASS, already present)", l_atom_hash_str, l_chain->net_name, l_chain->name); } + dap_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash); + DAP_DELETE(l_atom_copy); break; case ATOM_MOVE_TO_THRESHOLD: case ATOM_ACCEPT: @@ -508,19 +509,23 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg) } dap_chain_cell_t *l_cell = dap_chain_cell_find_by_id(l_chain, l_sync_request->request_hdr.cell_id); if (!l_cell) { - log_it(L_INFO, "Creating cell 0x%016X", l_sync_request->request_hdr.cell_id.uint64); + log_it(L_INFO, "Creating cell 0x%016"DAP_UINT64_FORMAT_X, l_sync_request->request_hdr.cell_id.uint64); l_cell = dap_chain_cell_create_fill(l_chain, l_sync_request->request_hdr.cell_id); } if (!l_cell) { - log_it(L_ERROR, "Can't create cell with id 0x%x to save event...", l_sync_request->request_hdr.cell_id); + log_it(L_ERROR, "Can't create cell with id 0x%"DAP_UINT64_FORMAT_x" to save event...", l_sync_request->request_hdr.cell_id.uint64); break; } - int l_res = dap_chain_cell_file_append(l_cell, l_atom_copy, l_atom_copy_size); - if(l_res < 0) { - log_it(L_ERROR, "Can't save event 0x%x to the file '%s'", l_atom_hash, - l_cell ? l_cell->file_storage_path : "[null]"); - } else { - dap_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash); + if (l_atom_add_res == ATOM_ACCEPT) { + int l_res = dap_chain_cell_file_append(l_cell, l_atom_copy, l_atom_copy_size); + if(l_res < 0) { + char l_atom_hash_str[72]={'\0'}; + dap_chain_hash_fast_to_str(&l_atom_hash,l_atom_hash_str,sizeof (l_atom_hash_str)-1 ); + log_it(L_ERROR, "Can't save event %s to the file '%s'", l_atom_hash_str, + l_cell ? l_cell->file_storage_path : "[null]"); + } else { + dap_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash); + } } if (l_chain->callback_atom_add_from_treshold) { dap_chain_atom_ptr_t l_atom_treshold; @@ -530,29 +535,35 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg) log_it(L_DEBUG, "Try to add atom from treshold"); l_atom_treshold = l_chain->callback_atom_add_from_treshold(l_chain, &l_atom_treshold_size); if(l_atom_treshold) { - l_res = dap_chain_cell_file_append(l_cell, l_atom_treshold, l_atom_treshold_size); + int l_res = dap_chain_cell_file_append(l_cell, l_atom_treshold, l_atom_treshold_size); log_it(L_INFO, "Added atom from treshold"); if(l_res < 0) { - log_it(L_ERROR, "Can't save event 0x%x from treshold to file '%s'", - l_atom_treshold, l_cell ? l_cell->file_storage_path : "[null]"); + char l_atom_hash_str[72]={'\0'}; + dap_chain_hash_fast_to_str(&l_atom_hash,l_atom_hash_str,sizeof (l_atom_hash_str)-1 ); + log_it(L_ERROR, "Can't save event %s from treshold to file '%s'", l_atom_hash_str, + l_cell ? l_cell->file_storage_path : "[null]"); + } else { + dap_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash); } } } while(l_atom_treshold); } - dap_chain_cell_close(l_cell); + //dap_chain_cell_close(l_cell); break; case ATOM_REJECT: { - char l_atom_hash_str[72] = {'\0'}; - dap_chain_hash_fast_to_str(&l_atom_hash,l_atom_hash_str,sizeof (l_atom_hash_str)-1 ); - log_it(L_WARNING,"Atom with hash %s for %s:%s rejected", l_atom_hash_str, l_chain->net_name, l_chain->name); + if (s_debug_more) { + char l_atom_hash_str[72] = {'\0'}; + dap_chain_hash_fast_to_str(&l_atom_hash,l_atom_hash_str,sizeof (l_atom_hash_str)-1 ); + log_it(L_WARNING,"Atom with hash %s for %s:%s rejected", l_atom_hash_str, l_chain->net_name, l_chain->name); + } + DAP_DELETE(l_atom_copy); break; } default: + DAP_DELETE(l_atom_copy); log_it(L_CRITICAL, "Wtf is this ret code? %d", l_atom_add_res); break; } - - DAP_DEL_Z(l_atom_copy); DAP_DEL_Z(l_sync_request); return true; } @@ -626,11 +637,11 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) dap_store_obj_t *l_store_obj = dap_store_unpacket_multiple((dap_store_obj_pkt_t *)l_pkt_item->pkt_data, &l_data_obj_count); if (s_debug_more){ if (l_data_obj_count) - log_it(L_INFO, "In: GLOBAL_DB parse: pkt_data_size=%zd, l_data_obj_count = %d",l_pkt_item->pkt_data_size, l_data_obj_count ); + log_it(L_INFO, "In: GLOBAL_DB parse: pkt_data_size=%"DAP_UINT64_FORMAT_U", l_data_obj_count = %zu",l_pkt_item->pkt_data_size, l_data_obj_count ); else if (l_pkt_item->pkt_data){ - log_it(L_WARNING, "In: GLOBAL_DB parse: pkt_data_size=%zd, error=\"No data objs after unpack\"", l_pkt_item->pkt_data_size, l_data_obj_count ); + log_it(L_WARNING, "In: GLOBAL_DB parse: pkt_data_size=%"DAP_UINT64_FORMAT_U", error=\"No data objs after unpack\"", l_pkt_item->pkt_data_size); }else - log_it(L_WARNING, "In: GLOBAL_DB parse: packet in list with NULL data(pkt_data_size:%zd)", l_pkt_item->pkt_data_size); + log_it(L_WARNING, "In: GLOBAL_DB parse: packet in list with NULL data(pkt_data_size:%"DAP_UINT64_FORMAT_U")", l_pkt_item->pkt_data_size); } uint64_t l_last_id = l_store_obj->id; @@ -675,7 +686,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) char l_ts_str[50]; dap_time_to_str_rfc822(l_ts_str, sizeof(l_ts_str), l_store_obj[i].timestamp); log_it(L_DEBUG, "Unpacked log history: type='%c' (0x%02hhX) group=\"%s\" key=\"%s\"" - " timestamp=\"%s\" value_len=%u ", + " timestamp=\"%s\" value_len=%zu ", (char ) l_store_obj[i].type, l_store_obj[i].type, l_store_obj[i].group, l_store_obj[i].key, l_ts_str, l_store_obj[i].value_len); } @@ -694,7 +705,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) } } // save data to global_db - if(!dap_chain_global_db_obj_save(l_obj, 1)) { + if(!dap_chain_global_db_obj_save(dap_store_obj_copy(l_obj, 1), 1)) { struct sync_request *l_sync_req_err = DAP_DUP(l_sync_request); dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id, s_gdb_in_pkt_error_worker_callback, l_sync_req_err); @@ -761,7 +772,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) return; } if (l_ch_pkt->hdr.size< sizeof (l_chain_pkt->hdr) ){ - log_it(L_ERROR, "Corrupted packet: too small size %zd, smaller then header size %zd", l_ch_pkt->hdr.size, + log_it(L_ERROR, "Corrupted packet: too small size %u, smaller then header size %zu", l_ch_pkt->hdr.size, sizeof(l_chain_pkt->hdr)); } @@ -803,14 +814,13 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) case DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_REQ:{ if(l_ch_chain->state != CHAIN_STATE_IDLE){ log_it(L_WARNING, "Can't process UPDATE_GLOBAL_DB_REQ request because its already busy with syncronization"); - s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, + dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS"); break; } - if(s_debug_more) - log_it(L_INFO, "In: UPDATE_GLOBAL_DB_REQ pkt: net 0x%016x chain 0x%016x cell 0x%016x", l_chain_pkt->hdr.net_id.uint64 , - l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); + log_it(L_INFO, "In: UPDATE_GLOBAL_DB_REQ pkt: net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x, + l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); if (l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) memcpy(&l_ch_chain->request, l_chain_pkt->data, sizeof(dap_stream_ch_chain_sync_request_t)); dap_chain_node_client_t *l_client = (dap_chain_node_client_t *)l_ch_chain->callback_notify_arg; @@ -851,11 +861,11 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) // If requested - begin to recieve record's hashes case DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_START:{ if (s_debug_more) - log_it(L_INFO, "In: UPDATE_GLOBAL_DB_START pkt net 0x%016x chain 0x%016x cell 0x%016x", l_chain_pkt->hdr.net_id.uint64 , - l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); + log_it(L_INFO, "In: UPDATE_GLOBAL_DB_START pkt net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x, + l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); if (l_ch_chain->state != CHAIN_STATE_IDLE){ log_it(L_WARNING, "Can't process UPDATE_GLOBAL_DB_START request because its already busy with syncronization"); - s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, + dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS"); break; @@ -866,7 +876,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) // Response with gdb element hashes and sizes case DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB:{ if(s_debug_more) - log_it(L_INFO, "In: UPDATE_GLOBAL_DB pkt data_size=%d ", l_chain_pkt_data_size); + log_it(L_INFO, "In: UPDATE_GLOBAL_DB pkt data_size=%zu", l_chain_pkt_data_size); if (l_ch_chain->state != CHAIN_STATE_UPDATE_GLOBAL_DB_REMOTE || memcmp(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(dap_stream_ch_chain_pkt_t))) { log_it(L_WARNING, "Can't process UPDATE_GLOBAL_DB request because its already busy with syncronization"); @@ -903,7 +913,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) { if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB && l_ch_chain->state != CHAIN_STATE_IDLE) { log_it(L_WARNING, "Can't process SYNC_GLOBAL_DB request because not in idle state"); - s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, + dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, "ERROR_STATE_NOT_IN_IDLE"); break; @@ -920,7 +930,8 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if(s_debug_more) { if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_END) - log_it(L_INFO, "In: UPDATE_GLOBAL_DB_END pkt"); + log_it(L_INFO, "In: UPDATE_GLOBAL_DB_END pkt with total count %d hashes", + HASH_COUNT(l_ch_chain->remote_gdbs)); else log_it(L_INFO, "In: SYNC_GLOBAL_DB pkt"); } @@ -940,11 +951,11 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if(l_chain_pkt_data_size == sizeof(dap_chain_node_addr_t)){ memcpy(&l_ch_chain->request.node_addr, l_chain_pkt->data, l_chain_pkt_data_size); l_ch_chain->stats_request_gdb_processed = 0; - log_it(L_INFO, "In: FIRST_GLOBAL_DB data_size=%d net 0x%016x chain 0x%016x cell 0x%016x from address "NODE_ADDR_FP_STR, - l_chain_pkt_data_size, l_chain_pkt->hdr.net_id.uint64 , - l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, NODE_ADDR_FP_ARGS_S(l_ch_chain->request.node_addr) ); + log_it(L_INFO, "In: FIRST_GLOBAL_DB data_size=%zu net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x + " from address "NODE_ADDR_FP_STR, l_chain_pkt_data_size, l_chain_pkt->hdr.net_id.uint64 , + l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, NODE_ADDR_FP_ARGS_S(l_ch_chain->request.node_addr) ); }else { - log_it(L_WARNING,"Incorrect data size %zd in packet DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB", l_chain_pkt_data_size); + log_it(L_WARNING,"Incorrect data size %zu in packet DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB", l_chain_pkt_data_size); s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, "ERROR_CHAIN_PACKET_TYPE_FIRST_GLOBAL_DB_INCORRET_DATA_SIZE"); @@ -953,12 +964,12 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) case DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB: { if(s_debug_more) - log_it(L_INFO, "In: GLOBAL_DB data_size=%d ", l_chain_pkt_data_size); + log_it(L_INFO, "In: GLOBAL_DB data_size=%zu", l_chain_pkt_data_size); // get transaction and save it to global_db if(l_chain_pkt_data_size > 0) { struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch); dap_chain_pkt_item_t *l_pkt_item = &l_sync_request->pkt; - l_pkt_item->pkt_data = DAP_NEW_Z_SIZE(byte_t, l_chain_pkt_data_size); + l_pkt_item->pkt_data = DAP_NEW_SIZE(byte_t, l_chain_pkt_data_size); memcpy(l_pkt_item->pkt_data, l_chain_pkt->data, l_chain_pkt_data_size); l_pkt_item->pkt_data_size = l_chain_pkt_data_size; dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_gdb_in_pkt_proc_callback, l_sync_request); @@ -971,8 +982,8 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } break; case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB: { - log_it(L_INFO, "In: SYNCED_GLOBAL_DB: net 0x%016x chain 0x%016x cell 0x%016x", l_chain_pkt->hdr.net_id.uint64 , - l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); + log_it(L_INFO, "In: SYNCED_GLOBAL_DB: net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x, + l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); if (!l_ch_chain->callback_notify_packet_in) { // we haven't node client waitng, so reply to other side dap_stream_ch_chain_sync_request_t l_sync_gdb = {}; dap_chain_net_t *l_net = dap_chain_net_by_id(l_chain_pkt->hdr.net_id); @@ -987,21 +998,22 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) l_sync_gdb.id_start = 1; dap_chain_net_t *l_net = dap_chain_net_by_id(l_chain_pkt->hdr.net_id); l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); - log_it(L_INFO, "In: SYNC_GLOBAL_DB_RVRS pkt: net 0x%016x chain 0x%016x cell 0x%016x, request gdb sync from %u", l_chain_pkt->hdr.net_id.uint64 , - l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id, l_sync_gdb.id_start ); + log_it(L_INFO, "In: SYNC_GLOBAL_DB_RVRS pkt: net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x + ", request gdb sync from %"DAP_UINT64_FORMAT_U, l_chain_pkt->hdr.net_id.uint64 , l_chain_pkt->hdr.chain_id.uint64, + l_chain_pkt->hdr.cell_id.uint64, l_sync_gdb.id_start ); dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, &l_sync_gdb, sizeof(l_sync_gdb)); } break; case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB_GROUP: { if (s_debug_more) - log_it(L_INFO, "In: SYNCED_GLOBAL_DB_GROUP pkt net 0x%016x chain 0x%016x cell 0x%016x", l_chain_pkt->hdr.net_id.uint64 , - l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); + log_it(L_INFO, "In: SYNCED_GLOBAL_DB_GROUP pkt net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x, + l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); } break; case DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB_GROUP: { if (s_debug_more) - log_it(L_INFO, "In: FIRST_GLOBAL_DB_GROUP pkt net 0x%016x chain 0x%016x cell 0x%016x", l_chain_pkt->hdr.net_id.uint64 , - l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); + log_it(L_INFO, "In: FIRST_GLOBAL_DB_GROUP pkt net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x, + l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); } break; /// --- Chains update --- @@ -1009,19 +1021,19 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) case DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_REQ:{ if (l_ch_chain->state != CHAIN_STATE_IDLE) { log_it(L_WARNING, "Can't process UPDATE_CHAINS_REQ request because its already busy with syncronization"); - s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, + dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS"); break; } if(s_debug_more) - log_it(L_INFO, "In: UPDATE_CHAINS_REQ pkt: net 0x%016x chain 0x%016x cell 0x%016x", l_chain_pkt->hdr.net_id.uint64 , - l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); + log_it(L_INFO, "In: UPDATE_CHAINS_REQ pkt: net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x, + l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); dap_chain_t * l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id); if (l_chain) { l_ch_chain->state = CHAIN_STATE_UPDATE_CHAINS; if(s_debug_more) - log_it(L_INFO, "Out: UPDATE_CHAINS_START pkt: net %s chain %s cell 0x%016x", l_chain->name, + log_it(L_INFO, "Out: UPDATE_CHAINS_START pkt: net %s chain %s cell 0x%016"DAP_UINT64_FORMAT_X, l_chain->name, l_chain->net_name, l_chain_pkt->hdr.cell_id.uint64); l_ch_chain->request_atom_iter = l_chain->callback_atom_iter_create(l_chain); l_chain->callback_atom_iter_get_first(l_ch_chain->request_atom_iter, NULL); @@ -1041,7 +1053,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) case DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_START:{ if (l_ch_chain->state != CHAIN_STATE_IDLE) { log_it(L_WARNING, "Can't process UPDATE_CHAINS_START request because its already busy with syncronization"); - s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, + dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS"); break; @@ -1144,18 +1156,27 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if(s_debug_more) { if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_END) - log_it(L_INFO, "In: UPDATE_CHAINS_END pkt"); + log_it(L_INFO, "In: UPDATE_CHAINS_END pkt with total count %d hashes", + HASH_COUNT(l_ch_chain->remote_atoms)); else log_it(L_INFO, "In: SYNC_CHAINS pkt"); } + if ((l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_END) && + HASH_COUNT(l_ch_chain->remote_atoms) > 5000) { + // TODO remove this after chains will come in order + s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, + l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, + "ERROR_SYNC_REQUEST_IS_TOO_LARGE"); + break; + } struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch); l_ch_chain->stats_request_atoms_processed = 0; if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS) { char *l_hash_from_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_from); char *l_hash_to_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_to); - log_it(L_INFO, "In: SYNC_CHAINS pkt: net 0x%016x chain 0x%016x cell 0x%016x between %s and %s", l_ch_chain->request_hdr.net_id.uint64 , - l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64, - l_hash_from_str? l_hash_from_str: "(null)", l_hash_to_str?l_hash_to_str:"(null)"); + log_it(L_INFO, "In: SYNC_CHAINS pkt: net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x + " between %s and %s", l_ch_chain->request_hdr.net_id.uint64, l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64, + l_hash_from_str ? l_hash_from_str : "(null)", l_hash_to_str ? l_hash_to_str : "(null)"); DAP_DELETE(l_hash_from_str); DAP_DELETE(l_hash_to_str); } @@ -1173,10 +1194,10 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if(l_chain_pkt_data_size == sizeof(dap_chain_node_addr_t)){ memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(dap_stream_ch_chain_pkt_hdr_t)); memcpy(&l_ch_chain->request.node_addr, l_chain_pkt->data, sizeof(dap_chain_node_addr_t)); - log_it(L_INFO, "From "NODE_ADDR_FP_STR": FIRST_CHAIN data_size=%d net 0x%016x chain 0x%016x cell 0x%016x ", - NODE_ADDR_FP_ARGS_S(l_ch_chain->request.node_addr), - l_chain_pkt_data_size, l_ch_chain->request_hdr.net_id.uint64 , - l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64); + log_it(L_INFO, "From "NODE_ADDR_FP_STR": FIRST_CHAIN data_size=%zu net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x, + NODE_ADDR_FP_ARGS_S(l_ch_chain->request.node_addr), + l_chain_pkt_data_size, l_ch_chain->request_hdr.net_id.uint64 , + l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64); }else{ log_it(L_WARNING,"Incorrect data size %zd in packet DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_CHAIN", l_chain_pkt_data_size); s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, @@ -1193,7 +1214,11 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if(l_chain_pkt_data_size > 0) { struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch); dap_chain_pkt_item_t *l_pkt_item = &l_sync_request->pkt; - l_pkt_item->pkt_data = DAP_NEW_Z_SIZE(byte_t, l_chain_pkt_data_size); + l_pkt_item->pkt_data = DAP_NEW_SIZE(byte_t, l_chain_pkt_data_size); + if (!l_pkt_item->pkt_data) { + log_it(L_ERROR, "Not enough memory!"); + break; + } memcpy(l_pkt_item->pkt_data, l_chain_pkt->data, l_chain_pkt_data_size); l_pkt_item->pkt_data_size = l_chain_pkt_data_size; if (s_debug_more){ @@ -1248,16 +1273,16 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS_RVRS: { if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) { - dap_stream_ch_chain_sync_request_t l_request={0}; + dap_stream_ch_chain_sync_request_t l_request={}; dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id); if( l_chain){ dap_chain_get_atom_last_hash(l_chain,& l_request.hash_from); // Move away from i/o reactor to callback processor if( dap_log_level_get()<= L_INFO){ char l_hash_from_str[70]={[0]='\0'}; dap_chain_hash_fast_to_str(&l_request.hash_from,l_hash_from_str,sizeof (l_hash_from_str)-1); - log_it(L_INFO, "In: SYNC_CHAINS_RVRS pkt: net 0x%016x chain 0x%016x cell 0x%016x request chains sync from %s", - l_chain_pkt->hdr.net_id.uint64 , l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, - l_hash_from_str[0] ? l_hash_from_str :"(null)"); + log_it(L_INFO, "In: SYNC_CHAINS_RVRS pkt: net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x + "request chains sync from %s", l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, + l_hash_from_str[0] ? l_hash_from_str : "(null)"); } dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, &l_request, sizeof(l_request)); @@ -1275,14 +1300,15 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if(l_chain_pkt_data_size>1) l_error_str[l_chain_pkt_data_size-1]='\0'; // To be sure that nobody sends us garbage // without trailing zero - log_it(L_WARNING,"In from remote addr %s chain id 0x%016x got error on his side: '%s'", + log_it(L_WARNING,"In from remote addr %s chain id 0x%016"DAP_UINT64_FORMAT_x" got error on his side: '%s'", l_ch_chain->ch->stream->esocket->remote_addr_str ? l_ch_chain->ch->stream->esocket->remote_addr_str: "<no addr>", l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt_data_size > 1 ? l_error_str:"<empty>"); } break; case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_ALL: { - log_it(L_INFO, "In from "NODE_ADDR_FP_STR": SYNCED_ALL net 0x%016x chain 0x%016x cell 0x%016x",NODE_ADDR_FP_ARGS_S(l_ch_chain->node_client->remote_node_addr), l_chain_pkt->hdr.net_id.uint64 , - l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); + log_it(L_INFO, "In from "NODE_ADDR_FP_STR": SYNCED_ALL net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x, + NODE_ADDR_FP_ARGS_S(l_ch_chain->node_client->remote_node_addr), l_chain_pkt->hdr.net_id.uint64, + l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); } break; default: { @@ -1416,7 +1442,7 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) if (l_pkt_size) { // If request was from defined node_addr we update its state if( s_debug_more) - log_it(L_INFO, "Send one global_db packet len=%d (rest=%d/%d items)", l_pkt_size, + log_it(L_INFO, "Send one global_db packet len=%zu (rest=%zu/%zu items)", l_pkt_size, dap_db_log_list_get_count_rest(l_ch_chain->request_db_log), dap_db_log_list_get_count(l_ch_chain->request_db_log)); dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB, @@ -1429,7 +1455,7 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) l_ch_chain->request_hdr.net_id.uint64, l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64, NULL, 0); } else { - log_it( L_INFO,"Syncronized database: items syncronyzed %"DAP_UINT64_FORMAT_U" from %"DAP_UINT64_FORMAT_U"", + log_it( L_INFO,"Syncronized database: items syncronyzed %"DAP_UINT64_FORMAT_U" from %zu", l_ch_chain->stats_request_gdb_processed, dap_db_log_list_get_count(l_ch_chain->request_db_log)); // last message dap_stream_ch_chain_sync_request_t l_request = {}; @@ -1525,7 +1551,7 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) break; } if(!l_ch_chain->request_atom_iter || !l_ch_chain->request_atom_iter->cur) { // All chains synced - dap_stream_ch_chain_sync_request_t l_request = {0}; + dap_stream_ch_chain_sync_request_t l_request = {}; // last message l_was_sent_smth = true; dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS, diff --git a/modules/common/dap_chain_common.c b/modules/common/dap_chain_common.c index e25d84909b015bca8abeb04b3ddffd477f69a472..3189c9ec51e390b3fe0ae5c596c51b256626d4df 100644 --- a/modules/common/dap_chain_common.c +++ b/modules/common/dap_chain_common.c @@ -45,7 +45,7 @@ size_t dap_chain_hash_slow_to_str( dap_chain_hash_slow_t *a_hash, char *a_str, s const size_t c_hash_str_size = sizeof(*a_hash) * 2 + 1 /*trailing zero*/+ 2 /* heading 0x */; if(a_str_max < c_hash_str_size) { - log_it(L_ERROR, "String for hash too small, need %u but have only %u", c_hash_str_size, a_str_max); + log_it(L_ERROR, "String for hash too small, need %zu but have only %zu", c_hash_str_size, a_str_max); } size_t i; dap_snprintf(a_str, 3, "0x"); @@ -203,10 +203,11 @@ dap_chain_net_srv_uid_t dap_chain_net_srv_uid_from_str( const char * a_net_srv_u l_byte[2]='\0'; // Read byte chars - if ( sscanf(l_byte,"%02hhx",&l_ret.raw[l_pos] ) != 1) - if( sscanf(l_byte,"%02hhX",&l_ret.raw[l_pos] ) ==1 ) + unsigned int l_bytechar; + if ( sscanf(l_byte,"%02x", &l_bytechar) != 1) + if( sscanf(l_byte,"%02X", &l_bytechar) != 1 ) break; - + l_ret.raw[l_pos] = l_bytechar; // Update pos l_pos++; // Reduce in two steps to not to break if input will have bad input diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c index 81db810637d0b292cf0d9c6eb1f984ee4930ce6a..74245df3bd3e37f32cc5381ea3db2aea43920412 100644 --- a/modules/common/dap_chain_datum_token.c +++ b/modules/common/dap_chain_datum_token.c @@ -77,7 +77,7 @@ dap_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t * a_token, size } if (l_tsd_size+l_hdr_size > a_token_size){ - log_it(L_WARNING, "TSD size %zd overlaps with header, corrupted data"); + log_it(L_WARNING, "TSD size %zd overlaps with header, corrupted data", l_tsd_size); }else if (l_tsd_size +l_hdr_size == a_token_size){ log_it(L_INFO, "No signatures at all, returning pointer to the top of data"); return (dap_tsd_t*) a_token->data_n_tsd; @@ -160,7 +160,7 @@ void dap_chain_datum_token_certs_dump(dap_string_t * a_str_out, byte_t * a_data_ char *l_hash_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash); - dap_string_append_printf(a_str_out, "%d) %s, %s, %lu bytes\n", i, l_hash_str, + dap_string_append_printf(a_str_out, "%d) %s, %s, %u bytes\n", i, l_hash_str, dap_sign_type_to_str(l_sign->header.type), l_sign->header.sign_size); } } diff --git a/modules/common/dap_chain_datum_tx_receipt.c b/modules/common/dap_chain_datum_tx_receipt.c index 0a136f07fbb114f80f3d3039b035eba18a6d903e..d4428f85e57f2032c1b434fb6e0ffae6fafe14b1 100644 --- a/modules/common/dap_chain_datum_tx_receipt.c +++ b/modules/common/dap_chain_datum_tx_receipt.c @@ -123,6 +123,6 @@ uint16_t dap_chain_datum_tx_receipt_signs_count(dap_chain_datum_tx_receipt_t * a l_ret++; } if(a_receipt_size != (size_t) ((byte_t *) l_sign - (byte_t *) a_receipt) ) - log_it(L_ERROR, "Receipt 0x%x (size=%ud) is corrupted", a_receipt, a_receipt_size); + log_it(L_ERROR, "Receipt 0x%zu (size=%zu) is corrupted", (size_t)a_receipt, a_receipt_size); return l_ret; } diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index 09ffc0a59e5f8729d1d6925b7688f54535f5ab19..b759fddcec890219dc3ad34eea6f6d6456ee6760 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -70,9 +70,10 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum, dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t* a_event_size); // CLI commands -static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **str_reply); +static int s_cli_dag_poa(int argc, char ** argv, char **str_reply); static bool s_seed_mode = false; + /** * @brief * init consensus dag_poa @@ -84,7 +85,7 @@ int dap_chain_cs_dag_poa_init(void) // Add consensus constructor dap_chain_cs_add ("dag_poa", s_callback_new ); s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false); - dap_chain_node_cli_cmd_item_create ("dag_poa", s_cli_dag_poa, NULL, "DAG PoA commands", + dap_chain_node_cli_cmd_item_create ("dag_poa", s_cli_dag_poa, "DAG PoA commands", "dag_poa -net <chain net name> -chain <chain name> event sign -event <event hash> [-H hex|base58(default)]\n" "\tSign event <event hash> in the new round pool with its authorize certificate\n\n"); @@ -110,9 +111,8 @@ void dap_chain_cs_dag_poa_deinit(void) * @param str_reply * @return */ -static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **a_str_reply) +static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) { - (void) arg_func; int ret = -666; int arg_index = 1; dap_chain_net_t * l_chain_net = NULL; @@ -123,11 +123,13 @@ static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **a_str_re if(!l_hash_out_type) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type, "hex") && dap_strcmp(l_hash_out_type, "base58")) { - dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameter -H, valid values: -H <hex | base58>"); + dap_chain_node_cli_set_reply_text(a_str_reply, "Invalid parameter -H, valid values: -H <hex | base58>"); return -1; } - dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain,&l_chain_net); + if (dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain,&l_chain_net)) { + return -3; + } dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(l_chain); //dap_chain_cs_dag_poa_t * l_poa = DAP_CHAIN_CS_DAG_POA( l_dag ) ; @@ -142,17 +144,29 @@ static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **a_str_re dap_chain_node_cli_find_option_val(argv, arg_index, argc, "event", &l_event_cmd_str); dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-event", &l_event_hash_str); + if (!l_event_hash_str) { + dap_chain_node_cli_set_reply_text(a_str_reply, "Command dag_poa requires parameter '-event' <event hash>"); + return -4; + } // event hash may be in hex or base58 format char *l_event_hash_hex_str; char *l_event_hash_base58_str; - if(!dap_strncmp(l_event_hash_str, "0x", 2) || !dap_strncmp(l_event_hash_str, "0X", 2)) { + if(!dap_strcmp(l_hash_out_type, "hex")) { l_event_hash_hex_str = dap_strdup(l_event_hash_str); l_event_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_event_hash_str); + if (!l_event_hash_base58_str) { + dap_chain_node_cli_set_reply_text(a_str_reply, "Invalid hex hash format"); + return -5; + } } else { l_event_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_event_hash_str); l_event_hash_base58_str = dap_strdup(l_event_hash_str); + if (!l_event_hash_hex_str) { + dap_chain_node_cli_set_reply_text(a_str_reply, "Invalid base58 hash format"); + } + return -6; } if ( l_event_cmd_str != NULL ){ @@ -215,7 +229,11 @@ static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **a_str_re } DAP_DELETE( l_gdb_group_events ); DAP_DELETE(l_event); + } else { + dap_chain_node_cli_set_reply_text(a_str_reply, "Command dag_poa requires subcommand 'sign'"); } + } else { + dap_chain_node_cli_set_reply_text(a_str_reply, "Command dag_poa requires subcommand 'event'"); } return ret; } @@ -248,7 +266,7 @@ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) l_poa_pvt->auth_certs = DAP_NEW_Z_SIZE ( dap_cert_t *, l_poa_pvt->auth_certs_count * sizeof(dap_cert_t)); char l_cert_name[512]; for (size_t i = 0; i < l_poa_pvt->auth_certs_count ; i++ ){ - dap_snprintf(l_cert_name,sizeof(l_cert_name),"%s.%lu",l_poa_pvt->auth_certs_prefix, i); + dap_snprintf(l_cert_name,sizeof(l_cert_name),"%s.%zu",l_poa_pvt->auth_certs_prefix, i); if ( (l_poa_pvt->auth_certs[i] = dap_cert_find_by_name( l_cert_name)) != NULL ) { log_it(L_NOTICE, "Initialized auth cert \"%s\"", l_cert_name); } else{ @@ -348,7 +366,6 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a } - /** * @brief * function makes event singing verification diff --git a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c index 9b23ff9b298e08245528c59ca01644768773cec9..2641129fd34e675312392d03f221b726879cd8ce 100644 --- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c +++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c @@ -23,10 +23,10 @@ */ #include <stdlib.h> +#include "dap_chain_net.h" #include "dap_common.h" #include "dap_string.h" #include "dap_strfuncs.h" -#include "dap_chain_net.h" #include "dap_chain_cs.h" #include "dap_chain_cs_dag.h" #include "dap_chain_cs_dag_pos.h" @@ -37,7 +37,7 @@ typedef struct dap_chain_cs_dag_pos_pvt { - dap_cert_t * events_sign_wallet; + dap_enc_key_t *events_sign_key; char ** tokens_hold; uint64_t * tokens_hold_value; size_t tokens_hold_size; @@ -113,7 +113,7 @@ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) l_pos_pvt->tokens_hold[i] = dap_strdup( l_tokens_hold[i] ); if ( ( l_pos_pvt->tokens_hold_value[i] = strtoull(l_tokens_hold_value_str[i],NULL,10) ) == 0 ) { - log_it(L_CRITICAL, "Token %s has inproper hold value \"%s\"",l_pos_pvt->tokens_hold[i], + log_it(L_CRITICAL, "Token %s has inproper hold value %"DAP_UINT64_FORMAT_U, l_pos_pvt->tokens_hold[i], l_pos_pvt->tokens_hold_value[i] ); goto lb_err; } @@ -149,11 +149,15 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c const char * l_events_sign_wallet = NULL; if ( ( l_events_sign_wallet = dap_config_get_item_str(a_chain_net_cfg,"dag-pos","events-sign-wallet") ) != NULL ) { - if ( ( PVT(l_pos)->events_sign_wallet = dap_cert_find_by_name(l_events_sign_wallet)) == NULL ){ - log_it(L_ERROR,"Can't load events sign certificate, name \"%s\" is wrong",l_events_sign_wallet); - }else - log_it(L_NOTICE,"Loaded \"%s\" certificate to sign pos event", l_events_sign_wallet); - + dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_events_sign_wallet, dap_chain_wallet_get_path(g_config)); + if (!l_wallet) { + log_it(L_ERROR,"Can't load events sign wallet, name \"%s\" is wrong", l_events_sign_wallet); + } else { + PVT(l_pos)->events_sign_key = dap_chain_wallet_get_key(l_wallet, 0); + log_it(L_NOTICE,"Loaded \"%s\" wallet to sign pos event", l_events_sign_wallet); + } + } else { + log_it(L_WARNING, "Events sign wallet is empty for %s chain, can't sing any events for it", a_chain->name); } return 0; } @@ -195,28 +199,28 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a dap_chain_net_t * l_net = dap_chain_net_by_name( a_dag->chain->net_name ); dap_chain_cs_dag_pos_t * l_pos = DAP_CHAIN_CS_DAG_POS(a_dag); - if( PVT(l_pos)->events_sign_wallet == NULL) { + if( PVT(l_pos)->events_sign_key == NULL) { log_it(L_ERROR, "Can't sign event with events-sign-wallet in [dag-pos] section"); return NULL; } if(a_datum || (a_hashes && a_hashes_count)) { dap_chain_cs_dag_event_t * l_event = dap_chain_cs_dag_event_new(a_dag->chain->id, l_net->pub.cell_id, a_datum, - PVT(l_pos)->events_sign_wallet->enc_key, a_hashes, a_hashes_count, a_dag_event_size); + PVT(l_pos)->events_sign_key, a_hashes, a_hashes_count, a_dag_event_size); return l_event; } else return NULL; } /** - * @brief s_callback_event_verify - * @param a_dag - * @param a_dag_event - * @return + * @brief + * function makes event singing verification + * @param a_dag dag object + * @param a_dag_event dap_chain_cs_dag_event_t + * @param a_dag_event_size size_t size of event object + * @return int */ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event, size_t a_dag_event_size) { - - dap_chain_cs_dag_pos_t * l_pos =DAP_CHAIN_CS_DAG_POS( a_dag ) ; dap_chain_cs_dag_pos_pvt_t * l_pos_pvt = PVT ( DAP_CHAIN_CS_DAG_POS( a_dag ) ); if(a_dag->chain->ledger == NULL){ @@ -235,17 +239,23 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ for ( size_t l_sig_pos=0; l_sig_pos < a_dag_event->header.signs_count; l_sig_pos++ ){ dap_sign_t * l_sign = dap_chain_cs_dag_event_get_sign(a_dag_event, a_dag_event_size,l_sig_pos); if ( l_sign == NULL){ - log_it(L_WARNING, "Event is NOT signed with anything: sig pos %zd, event size %zd", a_dag_event_size); + log_it(L_WARNING, "Event is NOT signed with anything: sig pos %zu, event size %zu", l_sig_pos, a_dag_event_size); return -4; } - size_t l_dag_event_size_without_sign = dap_chain_cs_dag_event_calc_size_excl_signs(a_dag_event,a_dag_event_size); - bool l_sign_verify_ret = dap_sign_verify_size(l_sign, a_dag_event_size) && - dap_sign_verify(l_sign,a_dag_event,l_dag_event_size_without_sign) == 0; - if ( !l_sign_verify_ret ){ - log_it(L_WARNING, "Event's sign is incorrect: code %d", l_sign_verify_ret); + bool l_sign_size_correct = dap_sign_verify_size(l_sign, a_dag_event_size); + if (!l_sign_size_correct) { + log_it(L_WARNING, "Event's sign size is incorrect"); + return -41; + } + size_t l_signs_total = a_dag_event->header.signs_count; + a_dag_event->header.signs_count = l_sig_pos; // temporary change for sign verification + size_t l_dag_event_size_without_sign = dap_chain_cs_dag_event_calc_size_excl_signs(a_dag_event,a_dag_event_size); + int l_sign_verified = dap_sign_verify(l_sign, a_dag_event, l_dag_event_size_without_sign); + a_dag_event->header.signs_count = l_signs_total; + if (l_sign_verified != 1) { + log_it(L_WARNING, "Event's sign is incorrect: code %d", l_sign_verified); return -41; - } if (!l_dag_event_size_without_sign){ @@ -312,7 +322,7 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ // Passed all checks return 0; }else{ - log_it(L_WARNING, "Wrong event: only %su/%su signs are valid", l_verified_num, l_pos_pvt->confirmations_minimum ); + log_it(L_WARNING, "Wrong event: only %hu/%hu signs are valid", l_verified_num, l_pos_pvt->confirmations_minimum ); return -2; } }else{ diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c index 12ada2512c703bfbb658a95031e66389a36eac7c..9f8939c1f376ac065946c590953f317445232fc9 100644 --- a/modules/consensus/none/dap_chain_cs_none.c +++ b/modules/consensus/none/dap_chain_cs_none.c @@ -28,6 +28,7 @@ #include "utlist.h" +#include "dap_chain_net.h" #include "dap_common.h" #include "dap_strfuncs.h" #include "dap_config.h" @@ -35,7 +36,6 @@ #include "dap_chain_ledger.h" #include "dap_chain_global_db.h" #include "dap_chain_global_db_driver.h" -#include "dap_chain_net.h" #include "dap_chain_cs.h" #include "dap_chain_cs_none.h" @@ -79,8 +79,6 @@ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_ite static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size); -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_tx_hash(dap_chain_atom_iter_t * a_atom_iter , - dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size); // Get event(s) from gdb static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t * a_atom_size); // Get the fisrt event from gdb @@ -89,6 +87,7 @@ static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_links(dap_chain_atom size_t * a_links_size_ptr, size_t ** a_lasts_sizes_ptr); // Get list of linked events static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_lasts(dap_chain_atom_iter_t * a_atom_iter, size_t * a_lasts_size_ptr, size_t ** a_lasts_sizes_ptr); // Get list of linked events +static dap_chain_datum_t **s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_atom, size_t a_atom_size, size_t *a_datums_count); static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_size); @@ -135,7 +134,7 @@ static void s_history_callback_notify(void * a_arg, const char a_op_code, const if (a_arg){ dap_chain_gdb_t * l_gdb = (dap_chain_gdb_t *) a_arg; dap_chain_net_t *l_net = dap_chain_net_by_id( l_gdb->chain->net_id); - log_it(L_DEBUG,"%s.%s: op_code='%c' group=\"%s\" key=\"%s\" value_size=%u",l_net->pub.name, + log_it(L_DEBUG,"%s.%s: op_code='%c' group=\"%s\" key=\"%s\" value_size=%zu",l_net->pub.name, l_gdb->chain->name, a_op_code, a_group, a_key, a_value_size); dap_chain_node_mempool_autoproc_notify((void *)l_net, a_op_code, a_group, a_key, a_value, a_value_size); dap_chain_net_sync_gdb_broadcast((void *)l_net, a_op_code, a_group, a_key, a_value, a_value_size); @@ -203,6 +202,7 @@ int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) a_chain->callback_atom_iter_get_links = s_chain_callback_atom_iter_get_links; // Get the next element from chain from the current one a_chain->callback_atom_iter_get_lasts = s_chain_callback_atom_iter_get_lasts; + a_chain->callback_atom_get_datums = s_chain_callback_atom_get_datum; return 0; } @@ -318,23 +318,19 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha switch (l_datum->header.type_id) { case DAP_CHAIN_DATUM_TOKEN_DECL:{ dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; - dap_chain_ledger_token_load(a_chain->ledger,l_token, l_datum->header.data_size); + if (dap_chain_ledger_token_load(a_chain->ledger,l_token, l_datum->header.data_size)) + return ATOM_REJECT; }break; case DAP_CHAIN_DATUM_TOKEN_EMISSION: { dap_chain_datum_token_emission_t *l_token_emission = (dap_chain_datum_token_emission_t*) l_datum->data; - dap_chain_ledger_token_emission_load(a_chain->ledger, l_token_emission, l_datum->header.data_size); + if (dap_chain_ledger_token_emission_load(a_chain->ledger, l_token_emission, l_datum->header.data_size)) + return ATOM_REJECT; }break; case DAP_CHAIN_DATUM_TX:{ dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data; - //if ( !l_gdb_priv->is_load_mode ) // If its not load module but mempool proc - // l_tx->header.ts_created = time(NULL); - //if(dap_chain_datum_tx_get_size(l_tx) == l_datum->header.data_size){ - - // don't save bad transactions to base + // No trashhold herr, don't save bad transactions to base if(dap_chain_ledger_tx_load(a_chain->ledger, l_tx) != 1) return ATOM_REJECT; - //}else - // return -2; }break; default: return ATOM_REJECT; } @@ -343,10 +339,11 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha size_t l_datum_size = dap_chain_datum_size(l_datum); dap_hash_fast(l_datum->data,l_datum->header.data_size,&l_hash_item->datum_data_hash ); dap_chain_hash_fast_to_str(&l_hash_item->datum_data_hash,l_hash_item->key,sizeof(l_hash_item->key)-1); - if ( !l_gdb_priv->is_load_mode ){ - dap_chain_global_db_gr_set(l_hash_item->key, l_datum, l_datum_size, l_gdb_priv->group_datums); - }else - log_it(L_DEBUG,"Load mode, doesnt save item %s:%s", l_hash_item->key, l_gdb_priv->group_datums); + if (!l_gdb_priv->is_load_mode) { + dap_chain_global_db_gr_set(dap_strdup(l_hash_item->key), DAP_DUP_SIZE(l_datum, l_datum_size), + l_datum_size, l_gdb_priv->group_datums); + } else + log_it(L_DEBUG,"Load mode, doesn't save item %s:%s", l_hash_item->key, l_gdb_priv->group_datums); DL_APPEND(l_gdb_priv->hash_items, l_hash_item); return ATOM_ACCEPT; @@ -442,6 +439,8 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at */ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t *a_atom_size) { + if (!a_atom_iter) + return NULL; dap_chain_datum_t * l_datum = NULL; a_atom_iter->cur_item = PVT ( DAP_CHAIN_GDB(a_atom_iter->chain) )->hash_items; if (a_atom_iter->cur_item ){ @@ -451,8 +450,9 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_ if (a_atom_iter->cur) // This iterator should clean up data for it because its allocate it DAP_DELETE( a_atom_iter->cur); a_atom_iter->cur = l_datum; - *a_atom_size = l_datum_size; - }else + if (a_atom_size) + *a_atom_size = l_datum_size; + } else if (a_atom_size) *a_atom_size = 0; return l_datum; } @@ -511,3 +511,19 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts(dap_chain_atom return NULL; } +static dap_chain_datum_t **s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_atom, size_t a_atom_size, size_t *a_datums_count) +{ + UNUSED(a_atom_size); + if (a_atom){ + dap_chain_datum_t * l_datum = a_atom; + if (l_datum){ + dap_chain_datum_t **l_datums = DAP_NEW_SIZE(dap_chain_datum_t *, sizeof(dap_chain_datum_t *)); + if (a_datums_count) + *a_datums_count = 1; + l_datums[0] = l_datum; + return l_datums; + }else + return NULL; + }else + return NULL; +} diff --git a/modules/global-db/CMakeLists.txt b/modules/global-db/CMakeLists.txt index 31122a6cd4adc8d2dc4cef7850ee30b1cf862b8f..1be3f9836b5bc6c6cb5ab89e00c59cc274fc1214 100644 --- a/modules/global-db/CMakeLists.txt +++ b/modules/global-db/CMakeLists.txt @@ -1,8 +1,6 @@ cmake_minimum_required(VERSION 3.1) project (dap_chain_global_db C) -set(BUILD_WITH_GDB_DRIVER_PGSQL ON) - file(GLOB DAP_CHAIN_GLOBAL_DB_SRC *.c) file(GLOB DAP_CHAIN_GLOBAL_DB_HDR include/*.h) diff --git a/modules/global-db/dap_chain_global_db.c b/modules/global-db/dap_chain_global_db.c index 7fa502006bcba5a694502c95fa519e6291be8dca..65983fbe02ff6c3a704baf60c10d32e1ef6589b6 100644 --- a/modules/global-db/dap_chain_global_db.c +++ b/modules/global-db/dap_chain_global_db.c @@ -51,11 +51,13 @@ // for access from several streams //static pthread_mutex_t ldb_mutex_ = PTHREAD_MUTEX_INITIALIZER; +// The function does nothing static inline void lock() { //pthread_mutex_lock(&ldb_mutex_); } +// The function does nothing static inline void unlock() { //pthread_mutex_unlock(&ldb_mutex_); @@ -82,7 +84,7 @@ static bool s_track_history = false; * @param a_callback a callback function * @param a_arg a pointer to an argument * @return (none) -*/ + */ void dap_chain_global_db_add_sync_group(const char *a_group_prefix, dap_global_db_obj_callback_notify_t a_callback, void *a_arg) { sync_group_item_t * l_item = DAP_NEW_Z(sync_group_item_t); @@ -210,7 +212,7 @@ int dap_chain_global_db_init(dap_config_t * g_config) * @brief Deinitialize a database. * @note You should call this function at the end. * @return (none) -*/ + */ void dap_chain_global_db_deinit(void) { lock(); @@ -235,10 +237,8 @@ void dap_chain_global_db_deinit(void) } /** - * @brief Gets an object from a database by a_key and a_group arguments. - * @param a_key an object key string - * @param a_group a group name string - * @return If successful, returns a pointer to the item, otherwise NULL. + * @brief Flushes a database cahce to disk. + * @return 0 */ int dap_chain_global_db_flush(void){ lock(); @@ -310,6 +310,12 @@ uint8_t * dap_chain_global_db_gr_get(const char *a_key, size_t *a_data_len_out, return l_ret_value; } +/** + * @brief Gets an object value from database by a_key for the "local.general" group. + * @param a_key an object key string + * @param a_data_len_out a length of value that was gotten + * @return If successful, returns a pointer to the object value, otherwise NULL. + */ uint8_t * dap_chain_global_db_get(const char *a_key, size_t *a_data_len_out) { return dap_chain_global_db_gr_get(a_key, a_data_len_out, GROUP_LOCAL_GENERAL); @@ -345,6 +351,7 @@ static bool global_db_gr_del_add(char *a_key,const char *a_group, time_t a_times return false; } + /** * @brief Deletes info about the deleted object from the database * @param a_key an object key string, looked like "0x8FAFBD00B..." @@ -372,6 +379,7 @@ static bool global_db_gr_del_del(char *a_key, const char *a_group) return false; } + /** * @brief Gets time stamp of the deleted object by a_group and a_key arguments. * @param a_group a group name sring, for example "kelvin-testnet.nodes" @@ -412,6 +420,7 @@ bool dap_chain_global_db_del(char *a_key) return dap_chain_global_db_gr_del(a_key, GROUP_LOCAL_GENERAL); } + /** * @brief Gets a last item from a database by a_group. * @param a_group a group name string @@ -507,32 +516,42 @@ static sync_group_item_t *find_item_by_mask(sync_group_item_t *a_items, const ch */ void dap_global_db_obj_track_history(void* a_store_data) { - if (!s_track_history) - return; dap_store_obj_t *l_obj = (dap_store_obj_t *)a_store_data; sync_group_item_t *l_sync_group_item = find_item_by_mask(s_sync_group_items, l_obj->group); - if(l_sync_group_item) { - lock(); - dap_db_history_add((char)l_obj->type, l_obj, 1, l_sync_group_item->group_name_for_history); - unlock(); + if (l_sync_group_item) { if(l_sync_group_item->callback_notify) { - if(l_obj) { - l_sync_group_item->callback_notify(l_sync_group_item->callback_arg, + l_sync_group_item->callback_notify(l_sync_group_item->callback_arg, (const char)l_obj->type, l_obj->group, l_obj->key, l_obj->value, l_obj->value_len); - } + } + if (!s_track_history) { + lock(); + dap_db_history_add((char)l_obj->type, l_obj, 1, l_sync_group_item->group_name_for_history); + unlock(); + } else { + DAP_DELETE(l_obj->key); + DAP_DEL_Z(l_obj->value); } } else { // looking for extra group sync_group_item_t *l_sync_extra_group_item = find_item_by_mask(s_sync_group_extra_items, l_obj->group); if(l_sync_extra_group_item) { - lock(); - dap_db_history_add((char)l_obj->type, l_obj, 1, l_sync_extra_group_item->group_name_for_history); - unlock(); - if(l_sync_extra_group_item->callback_notify) + if(l_sync_extra_group_item->callback_notify) { l_sync_extra_group_item->callback_notify(l_sync_extra_group_item->callback_arg, (const char)l_obj->type, l_obj->group, l_obj->key, l_obj->value, l_obj->value_len); + } + if (!s_track_history) { + lock(); + dap_db_history_add((char)l_obj->type, l_obj, 1, l_sync_extra_group_item->group_name_for_history); + unlock(); + } else { + DAP_DELETE(l_obj->key); + DAP_DEL_Z(l_obj->value); + } + } else { + DAP_DELETE(l_obj->key); + DAP_DEL_Z(l_obj->value); } } } @@ -551,9 +570,9 @@ bool dap_chain_global_db_gr_set(char *a_key, void *a_value, size_t a_value_len, { dap_store_obj_t store_data; memset(&store_data, 0, sizeof(dap_store_obj_t)); - store_data.key = a_key; - store_data.value = a_value; + store_data.key = dap_strdup(a_key); store_data.value_len = (a_value_len == (size_t) -1) ? dap_strlen((const char*) a_value) : a_value_len; + store_data.value = store_data.value_len ? DAP_DUP_SIZE(a_value, store_data.value_len) : NULL; store_data.group = (char*)a_group; store_data.timestamp = time(NULL); lock(); @@ -563,9 +582,13 @@ bool dap_chain_global_db_gr_set(char *a_key, void *a_value, size_t a_value_len, // Extract prefix if added successfuly, add history log and call notify callback if present if(!l_res) { // delete info about the deleted entry from the base if one present - global_db_gr_del_del(store_data.key, store_data.group); + global_db_gr_del_del(dap_strdup(a_key), a_group); + store_data.value = a_value; + store_data.key = a_key; dap_global_db_obj_track_history(&store_data); } else { + DAP_DEL_Z(a_value); + DAP_DELETE(a_key); log_it(L_ERROR, "Save error: %d", l_res); } @@ -595,18 +618,21 @@ bool dap_chain_global_db_gr_del(char *a_key,const char *a_group) return NULL; dap_store_obj_t store_data; memset(&store_data, 0, sizeof(dap_store_obj_t)); - store_data.key = a_key; + store_data.key = dap_strdup(a_key); store_data.group = (char*)a_group; lock(); int l_res = dap_chain_global_db_driver_delete(&store_data, 1); unlock(); if(l_res >= 0) { // add to Del group - global_db_gr_del_add(store_data.key, store_data.group, store_data.timestamp); + global_db_gr_del_add(dap_strdup(a_key), store_data.group, store_data.timestamp); } // do not add to history if l_res=1 (already deleted) if (!l_res) { + store_data.key = a_key; dap_global_db_obj_track_history(&store_data); + } else { + DAP_DELETE(a_key); } return !l_res; } @@ -623,21 +649,34 @@ bool dap_chain_global_db_obj_save(void* a_store_data, size_t a_objs_count) if(!a_objs_count) return true; + char *l_keys[a_objs_count]; + void *l_vals[a_objs_count]; + for(size_t i = 0; i < a_objs_count; i++) { + dap_store_obj_t *l_store_obj = (dap_store_obj_t *)a_store_data + i; + l_keys[i] = dap_strdup(l_store_obj->key); + l_vals[i] = DAP_DUP_SIZE(l_store_obj->value, l_store_obj->value_len); + } lock(); int l_res = dap_chain_global_db_driver_appy(a_store_data, a_objs_count); unlock(); for(size_t i = 0; i < a_objs_count; i++) { - dap_store_obj_t *a_store_obj = (dap_store_obj_t *)a_store_data + i; - if (a_store_obj->type == 'a' && !l_res) + dap_store_obj_t *l_store_obj = (dap_store_obj_t *)a_store_data + i; + l_store_obj->key = l_keys[i]; + l_store_obj->value = l_vals[i]; + if (l_store_obj->type == 'a' && !l_res) // delete info about the deleted entry from the base if one present - global_db_gr_del_del(a_store_obj->key, a_store_obj->group); - else if (a_store_obj->type == 'd' && l_res >= 0) + global_db_gr_del_del(dap_strdup(l_store_obj->key), l_store_obj->group); + else if (l_store_obj->type == 'd' && l_res >= 0) // add to Del group - global_db_gr_del_add(a_store_obj->key, a_store_obj->group, a_store_obj->timestamp); - if (!l_res) - // Extract prefix if added successfuly, add history log and call notify callback if present - dap_global_db_obj_track_history(a_store_obj); + global_db_gr_del_add(dap_strdup(l_store_obj->key), l_store_obj->group, l_store_obj->timestamp); + if (!l_res) { + // Extract prefix if added successfuly, add history log and call notify callback if present + dap_global_db_obj_track_history(l_store_obj); + } else { + DAP_DELETE(l_store_obj->key); + DAP_DELETE(l_store_obj->value); + } } return !l_res; } @@ -652,6 +691,8 @@ bool dap_chain_global_db_obj_save(void* a_store_data, size_t a_objs_count) bool dap_chain_global_db_gr_save(dap_global_db_obj_t* a_objs, size_t a_objs_count, const char *a_group) { dap_store_obj_t *l_store_data = DAP_NEW_Z_SIZE(dap_store_obj_t, a_objs_count * sizeof(struct dap_store_obj)); + if (!l_store_data) + return false; time_t l_timestamp = time(NULL); for(size_t q = 0; q < a_objs_count; ++q) { dap_store_obj_t *store_data_cur = l_store_data + q; @@ -662,20 +703,9 @@ bool dap_chain_global_db_gr_save(dap_global_db_obj_t* a_objs, size_t a_objs_coun store_data_cur->value_len = a_obj_cur->value_len; store_data_cur->timestamp = l_timestamp; } - if(l_store_data) { - lock(); - //log_it(L_DEBUG,"Added %u objects", a_objs_count); - int l_res = dap_chain_global_db_driver_add(l_store_data, a_objs_count); - unlock(); - if(!l_res) { - for(size_t i = 0; i < a_objs_count; i++) { - dap_global_db_obj_track_history(l_store_data + i); - } - } - DAP_DELETE(l_store_data); - return !l_res; - } - return false; + int l_res = dap_chain_global_db_obj_save(l_store_data, a_objs_count); + DAP_DELETE(l_store_data); + return l_res; } /** diff --git a/modules/global-db/dap_chain_global_db_driver.c b/modules/global-db/dap_chain_global_db_driver.c index 998d4c1706b32a04a3e13e09cc44a2217060f110..4e41cd5dd65b65a6dc8e5a36b3b9f93148a09a40 100644 --- a/modules/global-db/dap_chain_global_db_driver.c +++ b/modules/global-db/dap_chain_global_db_driver.c @@ -43,6 +43,7 @@ #define LOG_TAG "db_driver" +// A selected database driver. static char *s_used_driver = NULL; //#define USE_WRITE_BUFFER @@ -185,7 +186,7 @@ int dap_db_driver_flush(void) * @param a_store_obj a pointer to the source objects * @param a_store_count a number of objects * @return A pointer to the copied objects. - */ + */ dap_store_obj_t* dap_store_obj_copy(dap_store_obj_t *a_store_obj, size_t a_store_count) { if(!a_store_obj || !a_store_count) @@ -230,7 +231,7 @@ void dap_store_obj_free(dap_store_obj_t *a_store_obj, size_t a_store_count) */ char* dap_chain_global_db_driver_hash(const uint8_t *data, size_t data_size) { - if(!data || data_size <= 0) + if(!data || !data_size) return NULL; dap_chain_hash_fast_t l_hash; memset(&l_hash, 0, sizeof(dap_chain_hash_fast_t)); @@ -452,10 +453,12 @@ int dap_chain_global_db_driver_appy(pdap_store_obj_t a_store_obj, size_t a_store if(l_ret_tmp == 1) { log_it(L_INFO, "item is missing (may be already deleted) %s/%s\n", l_store_obj_cur->group, l_store_obj_cur->key); l_ret = 1; + break; } if(l_ret_tmp < 0) { log_it(L_ERROR, "Can't write item %s/%s (code %d)\n", l_store_obj_cur->group, l_store_obj_cur->key, l_ret_tmp); l_ret -= 1; + break; } } diff --git a/modules/global-db/dap_chain_global_db_driver_cdb.c b/modules/global-db/dap_chain_global_db_driver_cdb.c index 7d00b153a0879f2e362e0dea9bed116d830b72f1..0a480510b8caf414049f29bee3015def5f58ba16 100644 --- a/modules/global-db/dap_chain_global_db_driver_cdb.c +++ b/modules/global-db/dap_chain_global_db_driver_cdb.c @@ -38,6 +38,7 @@ #define LOG_TAG "dap_chain_global_db_cdb" +/** Struct for a item */ typedef struct _obj_arg { pdap_store_obj_t o; uint64_t q; @@ -45,6 +46,7 @@ typedef struct _obj_arg { uint64_t id; } obj_arg, *pobj_arg; +/** Struct for a CDB instanse */ typedef struct _cdb_instance { CDB *cdb; char *local_group; @@ -138,6 +140,7 @@ bool dap_cdb_get_cond_obj_iter_callback(void *arg, const char *key, int ksize, c } return true; } + //** A callback function designed for countng items*/ bool dap_cdb_get_count_iter_callback(void *arg, const char *key, int ksize, const char *val, int vsize, uint32_t expire, uint64_t oid) { UNUSED(ksize); @@ -169,7 +172,7 @@ pcdb_instance dap_cdb_init_group(char *a_group, int a_flags) { pthread_mutex_lock(&cdb_mutex); char l_cdb_path[strlen(s_cdb_path) + strlen(a_group) + 2]; HASH_FIND_STR(s_cdb, a_group, l_cdb_i); - if (l_cdb_i && !(a_flags & (1 << 1))) { + if (l_cdb_i && !(a_flags & CDB_TRUNC)) { goto FIN; } l_cdb_i = DAP_NEW(cdb_instance); @@ -186,10 +189,10 @@ pcdb_instance dap_cdb_init_group(char *a_group, int a_flags) { log_it(L_ERROR, "An error occured while opening CDB: \"%s\"", cdb_errmsg(cdb_errno(l_cdb_i->cdb))); goto ERR; } - if (!(a_flags & (1 << 1))) { + if (!(a_flags & CDB_TRUNC)) { CDBSTAT l_cdb_stat; cdb_stat(l_cdb_i->cdb, &l_cdb_stat); - if (l_cdb_stat.rnum > 0) { + if (l_cdb_stat.rnum > 0 || !(a_flags & CDB_CREAT)) { void *l_iter = cdb_iterate_new(l_cdb_i->cdb, 0); obj_arg l_arg; l_arg.o = DAP_NEW_Z(dap_store_obj_t); @@ -262,7 +265,7 @@ int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_ if (!dap_strcmp(d->d_name, ".") || !dap_strcmp(d->d_name, "..")) { continue; } - pcdb_instance l_cdb_i = dap_cdb_init_group(d->d_name, CDB_CREAT | CDB_PAGEWARMUP); + pcdb_instance l_cdb_i = dap_cdb_init_group(d->d_name, CDB_PAGEWARMUP); if (!l_cdb_i) { dap_db_driver_cdb_deinit(); closedir(dir); @@ -287,7 +290,7 @@ int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_ * @brief Gets CDB by a_group. * @param a_group a group name * @return if CDB is found, a pointer to CDB, otherwise NULL. - */ + */ pcdb_instance dap_cdb_get_db_by_group(const char *a_group) { pcdb_instance l_cdb_i = NULL; pthread_rwlock_rdlock(&cdb_rwlock); @@ -300,7 +303,7 @@ pcdb_instance dap_cdb_get_db_by_group(const char *a_group) { * @brief Creates a directory on the path s_cdb_path/a_group. * @param a_group the group name * @return 0 - */ + */ int dap_cdb_add_group(const char *a_group) { char l_cdb_path[strlen(s_cdb_path) + strlen(a_group) + 2]; memset(l_cdb_path, '\0', sizeof(l_cdb_path)); @@ -352,7 +355,7 @@ int dap_db_driver_cdb_flush(void) { * @brief Read last store item from CDB. * @param a_group a group name * @return If successful, a pointer to item, otherwise NULL. - */ + */ dap_store_obj_t *dap_db_driver_cdb_read_last_store_obj(const char* a_group) { if (!a_group) { return NULL; @@ -517,7 +520,7 @@ dap_store_obj_t* dap_db_driver_cdb_read_cond_store_obj(const char *a_group, uint * @param a_group the group name * @param a_id id * @return If successful, count of store items; otherwise 0. - */ + */ size_t dap_db_driver_cdb_read_count_store(const char *a_group, uint64_t a_id) { if (!a_group) { @@ -579,11 +582,11 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) { return -1; } if(a_store_obj->type == 'a') { - if(!a_store_obj->key) {// || !a_store_obj->value || !a_store_obj->value_len){ + if(!a_store_obj->key) { return -2; } cdb_record l_rec; - l_rec.key = dap_strdup(a_store_obj->key); + l_rec.key = a_store_obj->key; //dap_strdup(a_store_obj->key); int offset = 0; char *l_val = DAP_NEW_Z_SIZE(char, sizeof(uint64_t) + sizeof(unsigned long) + a_store_obj->value_len + sizeof(time_t)); dap_uint_to_hex(l_val, ++l_cdb_i->id, sizeof(uint64_t)); @@ -592,6 +595,7 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) { offset += sizeof(unsigned long); if(a_store_obj->value && a_store_obj->value_len){ memcpy(l_val + offset, a_store_obj->value, a_store_obj->value_len); + DAP_DELETE(a_store_obj->value); } offset += a_store_obj->value_len; unsigned long l_time = (unsigned long)a_store_obj->timestamp; @@ -614,6 +618,7 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) { ret = -1; } } + DAP_DELETE(a_store_obj->key); } return ret; } diff --git a/modules/global-db/dap_chain_global_db_driver_mdbx.c b/modules/global-db/dap_chain_global_db_driver_mdbx.c index 91151f0b2cb3ad35243ce8275fbe8cd1819f908f..ad31e9f059fc39cc2c972a9f374c7b684de29117 100644 --- a/modules/global-db/dap_chain_global_db_driver_mdbx.c +++ b/modules/global-db/dap_chain_global_db_driver_mdbx.c @@ -36,6 +36,8 @@ #include "dap_chain_global_db_driver_mdbx.h" +#ifdef DAP_CHAIN_GDB_ENGINE_MDBX + #define LOG_TAG "dap_chain_global_db_mdbx" static char *s_cdb_path = NULL; @@ -203,3 +205,4 @@ static int s_driver_callback_apply_store_obj(pdap_store_obj_t a_store_obj) return ret; } +#endif diff --git a/modules/global-db/dap_chain_global_db_driver_pgsql.c b/modules/global-db/dap_chain_global_db_driver_pgsql.c index 14d1029971fd15f45efe5f34b1bac5247b737624..cf692542c7220a3e6d322c8c6c5519edaefcea61 100644 --- a/modules/global-db/dap_chain_global_db_driver_pgsql.c +++ b/modules/global-db/dap_chain_global_db_driver_pgsql.c @@ -27,7 +27,6 @@ #include <string.h> #include <pthread.h> #include <errno.h> -#include <pwd.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> @@ -39,6 +38,9 @@ #include "dap_file_utils.h" #include "dap_chain_global_db_driver_pgsql.h" +#ifdef DAP_CHAIN_GDB_ENGINE_PGSQL +#include <pwd.h> + #define LOG_TAG "db_pgsql" struct dap_pgsql_conn_pool_item { @@ -52,7 +54,7 @@ static pthread_rwlock_t s_db_rwlock = PTHREAD_RWLOCK_INITIALIZER; static PGconn *s_pgsql_get_connection(void) { - if (pthread_rwlock_rdlock(&s_db_rwlock) == EDEADLK) { + if (pthread_rwlock_wrlock(&s_db_rwlock) == EDEADLK) { return s_trans_conn; } PGconn *l_ret = NULL; @@ -69,7 +71,7 @@ static PGconn *s_pgsql_get_connection(void) static void s_pgsql_free_connection(PGconn *a_conn) { - if (pthread_rwlock_rdlock(&s_db_rwlock) == EDEADLK) { + if (pthread_rwlock_wrlock(&s_db_rwlock) == EDEADLK) { return; } for (int i = 0; i < DAP_PGSQL_POOL_COUNT; i++) { @@ -191,7 +193,7 @@ int dap_db_driver_pgsql_init(const char *a_filename_dir, dap_db_driver_callbacks int dap_db_driver_pgsql_deinit(void) { pthread_rwlock_wrlock(&s_db_rwlock); - for (int j = 0; j <= DAP_PGSQL_POOL_COUNT; j++) + for (int j = 0; j < DAP_PGSQL_POOL_COUNT; j++) PQfinish(s_conn_pool[j].conn); pthread_rwlock_unlock(&s_db_rwlock); pthread_rwlock_destroy(&s_db_rwlock); @@ -206,7 +208,7 @@ int dap_db_driver_pgsql_start_transaction(void) s_trans_conn = s_pgsql_get_connection(); if (!s_trans_conn) return -1; - pthread_rwlock_rdlock(&s_db_rwlock); + pthread_rwlock_wrlock(&s_db_rwlock); PGresult *l_res = PQexec(s_trans_conn, "BEGIN"); if (PQresultStatus(l_res) != PGRES_COMMAND_OK) { log_it(L_ERROR, "Begin transaction failed with message: \"%s\"", PQresultErrorMessage(l_res)); @@ -222,7 +224,7 @@ int dap_db_driver_pgsql_start_transaction(void) */ int dap_db_driver_pgsql_end_transaction(void) { - if (s_trans_conn) + if (!s_trans_conn) return -1; PGresult *l_res = PQexec(s_trans_conn, "COMMIT"); if (PQresultStatus(l_res) != PGRES_COMMAND_OK) { @@ -245,7 +247,8 @@ static int s_pgsql_create_group_table(const char *a_table_name, PGconn *a_conn) return -1; int l_ret = 0; char *l_query_str = dap_strdup_printf("CREATE TABLE \"%s\"" - "(obj_id SERIAL PRIMARY KEY, obj_ts BIGINT, obj_key TEXT UNIQUE, obj_val BYTEA)", + "(obj_id BIGSERIAL PRIMARY KEY, obj_ts BIGINT, " + "obj_key TEXT UNIQUE, obj_val BYTEA)", a_table_name); PGresult *l_res = PQexec(a_conn, l_query_str); DAP_DELETE(l_query_str); @@ -287,8 +290,15 @@ int dap_db_driver_pgsql_apply_store_obj(dap_store_obj_t *a_store_obj) // execute add request l_res = PQexecParams(l_conn, l_query_str, 2, NULL, l_param_vals, l_param_lens, l_param_formats, 0); + DAP_DELETE(a_store_obj->value); + DAP_DELETE(a_store_obj->key); if (PQresultStatus(l_res) != PGRES_COMMAND_OK) { - if (a_store_obj->type == 'a' && s_pgsql_create_group_table(a_store_obj->group, l_conn) == 0) { + if (s_trans_conn) { //we shouldn't fail within a transaacion + dap_db_driver_pgsql_end_transaction(); + dap_db_driver_pgsql_start_transaction(); + l_conn = s_pgsql_get_connection(); + } + if (s_pgsql_create_group_table(a_store_obj->group, l_conn) == 0) { PQclear(l_res); l_res = PQexecParams(l_conn, l_query_str, 2, NULL, l_param_vals, l_param_lens, l_param_formats, 0); } @@ -300,16 +310,20 @@ int dap_db_driver_pgsql_apply_store_obj(dap_store_obj_t *a_store_obj) } else if (a_store_obj->type == 'd') { // delete one record if (a_store_obj->key) - l_query_str = dap_strdup_printf("DELETE FROM \"%s\" WHERE key = \"%s\"", + l_query_str = dap_strdup_printf("DELETE FROM \"%s\" WHERE obj_key = '%s'", a_store_obj->group, a_store_obj->key); // remove all group else l_query_str = dap_strdup_printf("DROP TABLE \"%s\"", a_store_obj->group); + DAP_DELETE(a_store_obj->key); // execute delete request l_res = PQexec(l_conn, l_query_str); if (PQresultStatus(l_res) != PGRES_COMMAND_OK) { - log_it(L_ERROR, "Delete object failed with message: \"%s\"", PQresultErrorMessage(l_res)); - l_ret = -4; + const char *l_err = PQresultErrorField(l_res, PG_DIAG_SQLSTATE); + if (!l_err || strcmp(l_err, PGSQL_INVALID_TABLE)) { + log_it(L_ERROR, "Delete object failed with message: \"%s\"", PQresultErrorMessage(l_res)); + l_ret = -4; + } } } else { @@ -329,7 +343,7 @@ static void s_pgsql_fill_object(const char *a_group, dap_store_obj_t *a_obj, PGr for (int i = 0; i < PQnfields(a_res); i++) { if (i == PQfnumber(a_res, "obj_id")) { - a_obj->id = be32toh(*(uint32_t *)PQgetvalue(a_res, a_row, i)); + a_obj->id = be64toh(*(uint64_t *)PQgetvalue(a_res, a_row, i)); } else if (i == PQfnumber(a_res, "obj_ts")) { a_obj->timestamp = be64toh(*(time_t *)PQgetvalue(a_res, a_row, i)); } else if ((i == PQfnumber(a_res, "obj_key"))) { @@ -369,12 +383,13 @@ dap_store_obj_t *dap_db_driver_pgsql_read_store_obj(const char *a_group, const c } PGresult *l_res = PQexecParams(l_conn, l_query_str, 0, NULL, NULL, NULL, NULL, 1); - s_pgsql_free_connection(l_conn); DAP_DELETE(l_query_str); if (PQresultStatus(l_res) != PGRES_TUPLES_OK) { - if (strcmp(PQresultErrorField(l_res, PG_DIAG_SQLSTATE), PGSQL_INVALID_TABLE)) + const char *l_err = PQresultErrorField(l_res, PG_DIAG_SQLSTATE); + if (!l_err || strcmp(l_err, PGSQL_INVALID_TABLE)) log_it(L_ERROR, "Read objects failed with message: \"%s\"", PQresultErrorMessage(l_res)); PQclear(l_res); + s_pgsql_free_connection(l_conn); return NULL; } @@ -387,6 +402,7 @@ dap_store_obj_t *dap_db_driver_pgsql_read_store_obj(const char *a_group, const c s_pgsql_fill_object(a_group, l_obj_cur, l_res, i); } PQclear(l_res); + s_pgsql_free_connection(l_conn); if (a_count_out) *a_count_out = l_count; return l_obj; @@ -408,12 +424,13 @@ dap_store_obj_t *dap_db_driver_pgsql_read_last_store_obj(const char *a_group) } char *l_query_str = dap_strdup_printf("SELECT * FROM \"%s\" ORDER BY obj_id DESC LIMIT 1", a_group); PGresult *l_res = PQexecParams(l_conn, l_query_str, 0, NULL, NULL, NULL, NULL, 1); - s_pgsql_free_connection(l_conn); DAP_DELETE(l_query_str); if (PQresultStatus(l_res) != PGRES_TUPLES_OK) { - if (strcmp(PQresultErrorField(l_res, PG_DIAG_SQLSTATE), PGSQL_INVALID_TABLE)) + const char *l_err = PQresultErrorField(l_res, PG_DIAG_SQLSTATE); + if (!l_err || strcmp(l_err, PGSQL_INVALID_TABLE)) log_it(L_ERROR, "Read last object failed with message: \"%s\"", PQresultErrorMessage(l_res)); PQclear(l_res); + s_pgsql_free_connection(l_conn); return NULL; } dap_store_obj_t *l_obj = NULL; @@ -422,6 +439,7 @@ dap_store_obj_t *dap_db_driver_pgsql_read_last_store_obj(const char *a_group) s_pgsql_fill_object(a_group, l_obj, l_res, 0); } PQclear(l_res); + s_pgsql_free_connection(l_conn); return l_obj; } @@ -450,12 +468,13 @@ dap_store_obj_t *dap_db_driver_pgsql_read_cond_store_obj(const char *a_group, ui l_query_str = dap_strdup_printf("SELECT * FROM \"%s\" WHERE obj_id >= '%"DAP_UINT64_FORMAT_U"' " "ORDER BY obj_id ASC", a_group, a_id); PGresult *l_res = PQexecParams(l_conn, l_query_str, 0, NULL, NULL, NULL, NULL, 1); - s_pgsql_free_connection(l_conn); DAP_DELETE(l_query_str); if (PQresultStatus(l_res) != PGRES_TUPLES_OK) { - if (strcmp(PQresultErrorField(l_res, PG_DIAG_SQLSTATE), PGSQL_INVALID_TABLE)) + const char *l_err = PQresultErrorField(l_res, PG_DIAG_SQLSTATE); + if (!l_err || strcmp(l_err, PGSQL_INVALID_TABLE)) log_it(L_ERROR, "Conditional read objects failed with message: \"%s\"", PQresultErrorMessage(l_res)); PQclear(l_res); + s_pgsql_free_connection(l_conn); return NULL; } @@ -468,6 +487,7 @@ dap_store_obj_t *dap_db_driver_pgsql_read_cond_store_obj(const char *a_group, ui s_pgsql_fill_object(a_group, l_obj_cur, l_res, i); } PQclear(l_res); + s_pgsql_free_connection(l_conn); if (a_count_out) *a_count_out = l_count; return l_obj; @@ -486,10 +506,10 @@ dap_list_t *dap_db_driver_pgsql_get_groups_by_mask(const char *a_group_mask) const char *l_query_str = "SELECT tablename FROM pg_catalog.pg_tables WHERE " "schemaname != 'information_schema' AND schemaname != 'pg_catalog'"; PGresult *l_res = PQexec(l_conn, l_query_str); - s_pgsql_free_connection(l_conn); if (PQresultStatus(l_res) != PGRES_TUPLES_OK) { log_it(L_ERROR, "Read tables failed with message: \"%s\"", PQresultErrorMessage(l_res)); PQclear(l_res); + s_pgsql_free_connection(l_conn); return NULL; } @@ -500,6 +520,7 @@ dap_list_t *dap_db_driver_pgsql_get_groups_by_mask(const char *a_group_mask) l_ret_list = dap_list_prepend(l_ret_list, dap_strdup(l_table_name)); } PQclear(l_res); + s_pgsql_free_connection(l_conn); return l_ret_list; } @@ -512,19 +533,21 @@ size_t dap_db_driver_pgsql_read_count_store(const char *a_group, uint64_t a_id) log_it(L_ERROR, "Can't pick PostgreSQL connection from pool"); return 0; } - char *l_query_str= dap_strdup_printf("SELECT count(*) FROM \"%s\" WHERE obj_id >= '%"DAP_UINT64_FORMAT_U"'", + char *l_query_str = dap_strdup_printf("SELECT count(*) FROM \"%s\" WHERE obj_id >= '%"DAP_UINT64_FORMAT_U"'", a_group, a_id); PGresult *l_res = PQexecParams(l_conn, l_query_str, 0, NULL, NULL, NULL, NULL, 1); - s_pgsql_free_connection(l_conn); DAP_DELETE(l_query_str); if (PQresultStatus(l_res) != PGRES_TUPLES_OK) { - if (strcmp(PQresultErrorField(l_res, PG_DIAG_SQLSTATE), PGSQL_INVALID_TABLE)) + const char *l_err = PQresultErrorField(l_res, PG_DIAG_SQLSTATE); + if (!l_err || strcmp(l_err, PGSQL_INVALID_TABLE)) log_it(L_ERROR, "Count objects failed with message: \"%s\"", PQresultErrorMessage(l_res)); PQclear(l_res); + s_pgsql_free_connection(l_conn); return 0; } size_t l_ret = be64toh(*(uint64_t *)PQgetvalue(l_res, 0, 0)); PQclear(l_res); + s_pgsql_free_connection(l_conn); return l_ret; } @@ -539,16 +562,18 @@ bool dap_db_driver_pgsql_is_obj(const char *a_group, const char *a_key) } char *l_query_str = dap_strdup_printf("SELECT EXISTS(SELECT * FROM \"%s\" WHERE obj_key = '%s')", a_group, a_key); PGresult *l_res = PQexecParams(l_conn, l_query_str, 0, NULL, NULL, NULL, NULL, 1); - s_pgsql_free_connection(l_conn); DAP_DELETE(l_query_str); if (PQresultStatus(l_res) != PGRES_TUPLES_OK) { - if (strcmp(PQresultErrorField(l_res, PG_DIAG_SQLSTATE), PGSQL_INVALID_TABLE)) + const char *l_err = PQresultErrorField(l_res, PG_DIAG_SQLSTATE); + if (!l_err || strcmp(l_err, PGSQL_INVALID_TABLE)) log_it(L_ERROR, "Existance check of object failed with message: \"%s\"", PQresultErrorMessage(l_res)); PQclear(l_res); + s_pgsql_free_connection(l_conn); return 0; } int l_ret = *PQgetvalue(l_res, 0, 0); PQclear(l_res); + s_pgsql_free_connection(l_conn); return l_ret; } @@ -577,3 +602,4 @@ int dap_db_driver_pgsql_flush() s_pgsql_free_connection(l_conn); return l_ret; } +#endif diff --git a/modules/global-db/dap_chain_global_db_driver_sqlite.c b/modules/global-db/dap_chain_global_db_driver_sqlite.c index 07b4488dabf2ce836c0fa9b66b47ab56c3d121f1..57ab6c1758cf566a439b746d93a3fb0ea00cd46a 100644 --- a/modules/global-db/dap_chain_global_db_driver_sqlite.c +++ b/modules/global-db/dap_chain_global_db_driver_sqlite.c @@ -78,9 +78,11 @@ typedef struct _SQLITE_ROW_VALUE_ static int dap_db_driver_sqlite_exec(sqlite3 *l_db, const char *l_query, char **l_error_message); /** - * SQLite library initialization, no thread safe - * - * return 0 if Ok, else error code >0 + * @brief Initializes a SQLite database. + * @note no thread safe + * @param a_filename_db a path to the database file + * @param a_drv_callback a pointer to a structure of callback functions + * @return If successful returns 0, else a code < 0. */ int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks_t *a_drv_callback) { @@ -140,9 +142,14 @@ int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks a_drv_callback->flush = dap_db_driver_sqlite_flush; s_filename_db = strdup(a_filename_db); } - return l_ret; + return l_ret; } +/** + * @brief Deinitializes a SQLite database. + * + * @return Returns 0 if successful. + */ int dap_db_driver_sqlite_deinit(void) { pthread_rwlock_wrlock(&s_db_rwlock); @@ -156,7 +163,7 @@ int dap_db_driver_sqlite_deinit(void) return sqlite3_shutdown(); } -// additional function for sqlite to convert byte to number +// An additional function for SQLite to convert byte to number static void byte_to_bin(sqlite3_context *l_context, int a_argc, sqlite3_value **a_argv) { const unsigned char *l_text; @@ -173,12 +180,12 @@ static void byte_to_bin(sqlite3_context *l_context, int a_argc, sqlite3_value ** } /** - * Open SQLite database - * a_filename_utf8 - database file name - * a_flags - database access flags (SQLITE_OPEN_READONLY, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE) - * a_error_message[out] - Error messages (the memory requires deletion via sqlite_free ()) - * - * return: database identifier, NULL when an error occurs. + * @brief Opens a SQLite database and adds byte_to_bin function. + * + * @param a_filename_utf8 a SQLite database file name + * @param a_flags database access flags (SQLITE_OPEN_READONLY, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE) + * @param a_error_message[out] an error message that's received from the SQLite database + * @return Returns a pointer to an instance of SQLite database structure. */ sqlite3* dap_db_driver_sqlite_open(const char *a_filename_utf8, int a_flags, char **a_error_message) { @@ -207,15 +214,22 @@ sqlite3* dap_db_driver_sqlite_open(const char *a_filename_utf8, int a_flags, cha } /** - * Close the database + * @brief Closes a SQLite database. + * + * @param l_db a pointer to an instance of SQLite database structure + * @return (none) */ void dap_db_driver_sqlite_close(sqlite3 *l_db) { if(l_db) sqlite3_close(l_db); } -/* - * Clear the memory allocated via sqlite3_mprintf() + +/** + * @brief Releases memory allocated by sqlite3_mprintf() + * + * @param memory a pointer to a string + * @return (none) */ void dap_db_driver_sqlite_free(char *memory) { @@ -224,15 +238,12 @@ void dap_db_driver_sqlite_free(char *memory) } /** - * Set specific pragma statements - * www.sqlite.org/pragma.html - * - *PRAGMA page_size = bytes; // page size DB; it is reasonable to make it equal to the size of the disk cluster 4096 - *PRAGMA cache_size = -kibibytes; // by default it is equal to 2000 pages of database - *PRAGMA encoding = "UTF-8"; // default = UTF-8 - *PRAGMA foreign_keys = 1; // default = 0 - *PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF; - *PRAGMA synchronous = 0 | OFF | 1 | NORMAL | 2 | FULL; + * @brief Executes a PRAGMA statement. + * + * @param a_db a pointer to an instance of SQLite database structure + * @param a_param a PRAGMA name + * @param a_mode a PRAGMA value + * @return Returns true if successful, otherwise false. */ bool dap_db_driver_sqlite_set_pragma(sqlite3 *a_db, char *a_param, char *a_mode) { @@ -249,6 +260,12 @@ bool dap_db_driver_sqlite_set_pragma(sqlite3 *a_db, char *a_param, char *a_mode) return false; } +/** + * @brief Flushes a SQLite database cahce to disk. + * @note The function closes and opens the database + * + * @return Returns 0 if successful. + */ int dap_db_driver_sqlite_flush() { log_it(L_DEBUG, "Start flush sqlite data base."); @@ -281,9 +298,12 @@ int dap_db_driver_sqlite_flush() } /** - * Execute SQL query to database that does not return data - * - * return 0 if Ok, else error code >0 + * @brief Executes SQL statements. + * + * @param l_db a pointer to an instance of SQLite database structure + * @param l_query the SQL statement + * @param l_error_message[out] an error message that's received from the SQLite database + * @return Returns 0 if successful. */ static int dap_db_driver_sqlite_exec(sqlite3 *l_db, const char *l_query, char **l_error_message) { @@ -304,9 +324,10 @@ static int dap_db_driver_sqlite_exec(sqlite3 *l_db, const char *l_query, char ** } /** - * Create table - * - * return 0 if Ok, else error code + * @brief Creates a table and unique index in the s_db database. + * + * @param a_table_name a table name string + * @return Returns 0 if successful, otherwise -1. */ static int dap_db_driver_sqlite_create_group_table(const char *a_table_name) { @@ -339,19 +360,12 @@ static int dap_db_driver_sqlite_create_group_table(const char *a_table_name) } /** - * Prepare SQL query for database - * l_query [in] SQL-string with a query to database, example: - * SELECT * FROM data - * SELECT id, sd FROM data LIMIT 300 - * SELECT id, sd FROM data ORDER BY id ASC/DESC - * SELECT * FROM data WHERE time>449464766900000 and time<449464766910000" - * SELECT * FROM data WHERE hex(sd) LIKE '%370%' - * hex(x'0806') -> '08f6' или quote(sd) -> X'08f6' - * substr(x'031407301210361320690000',3,2) -> x'0730' - * - * CAST(substr(sd,5,2) as TEXT) - * additional function of line to number _uint8 - * byte_to_bin(x'ff') -> 255 + * @brief Prepares a SQL query for a database + * @param db a pointer to an instance of SQLite database structure. + * @param query the query + * @param l_res[out] a pointer to a pointer to a structure with result + * @param l_error_message[out] an error message that's received from the SQLite database + * @return Returns 0 if successful, */ static int dap_db_driver_sqlite_query(sqlite3 *db, char *query, sqlite3_stmt **l_res, char **l_error_message) { @@ -371,9 +385,10 @@ static int dap_db_driver_sqlite_query(sqlite3 *db, char *query, sqlite3_stmt **l } /** - * Clear memory after fetching a string - * - * return 0 if Ok, else -1 + * @brief Releases memory allocated for a row. + * + * @param row a database row + * @return (none) */ static void dap_db_driver_sqlite_row_free(SQLITE_ROW_VALUE *row) { @@ -385,16 +400,13 @@ static void dap_db_driver_sqlite_row_free(SQLITE_ROW_VALUE *row) } } + /** - * Selects the next entry from the result of the query and returns an array - * - * l_res: identifier received in sqlite_query () - * l_row_out [out]: pointer to a column or NULL - * - * return: - * SQLITE_ROW(100) has another row ready - * SQLITE_DONE(101) finished executing, - * SQLITE_CONSTRAINT(19) data is not unique and will not be added + * @brief Fetches a result values from a query to l_row_out + * + * @param l_res a pointer to a prepared statement structure + * @param l_row_out a pointer to a pointer to a row structure + * @return Returns SQLITE_ROW(100) or SQLITE_DONE(101) or SQLITE_BUSY(5) */ static int dap_db_driver_sqlite_fetch_array(sqlite3_stmt *l_res, SQLITE_ROW_VALUE **l_row_out) { @@ -441,8 +453,12 @@ static int dap_db_driver_sqlite_fetch_array(sqlite3_stmt *l_res, SQLITE_ROW_VALU return l_rc; } + /** - * Clear memory when request processing is complete + * @brief Destroys a prepared statement structure + * + * @param l_res a pointer to the statement structure + * @return Returnes true if successful, otherwise false. */ static bool dap_db_driver_sqlite_query_free(sqlite3_stmt *l_res) { @@ -455,7 +471,11 @@ static bool dap_db_driver_sqlite_query_free(sqlite3_stmt *l_res) } /** - * Convert the array into a string to save to blob + * @brief Convers a byte array into a hexadecimal string + * + * @param blob a byte array + * @param len a length of byte array + * @return Returns a hexadecimal string */ static char* dap_db_driver_get_string_from_blob(uint8_t *blob, int len) { @@ -470,21 +490,25 @@ static char* dap_db_driver_get_string_from_blob(uint8_t *blob, int len) } + /** - * Cleaning the database from the deleted data - * - * return 0 if Ok, else error code >0 + * @brief Executes a VACUUM statement in a database. + * + * @param l_db a a pointer to an instance of SQLite database structure + * @return Returns 0 if successful. */ int dap_db_driver_sqlite_vacuum(sqlite3 *l_db) { - if(!s_db) + if(!l_db) return -1; int l_rc = dap_db_driver_sqlite_exec(l_db, "VACUUM", NULL); return l_rc; } /** - * Start a transaction + * @brief Starts a transaction in s_db database. + * + * @return Returns 0 if successful, otherwise -1. */ int dap_db_driver_sqlite_start_transaction(void) { @@ -504,7 +528,9 @@ int dap_db_driver_sqlite_start_transaction(void) } /** - * End of transaction + * @brief Ends a transaction in s_db database. + * + * @return Returns 0 if successful, otherwise -1. */ int dap_db_driver_sqlite_end_transaction(void) { @@ -522,12 +548,18 @@ int dap_db_driver_sqlite_end_transaction(void) } } +/** + * @brief Replaces '_' char with '.' char in a_table_name. + * + * @param a_table_name a table name string + * @return Returns a group name string with the replaced character + */ char *dap_db_driver_sqlite_make_group_name(const char *a_table_name) { char *l_table_name = dap_strdup(a_table_name); ssize_t l_table_name_len = (ssize_t)dap_strlen(l_table_name); const char *l_needle = "_"; - // replace '_' to '.' + // replace '_' with '.' while(1){ char *l_str = dap_strstr_len(l_table_name, l_table_name_len, l_needle); if(l_str) @@ -538,12 +570,18 @@ char *dap_db_driver_sqlite_make_group_name(const char *a_table_name) return l_table_name; } +/** + * @brief Replaces '.' char with '_' char in a_group_name. + * + * @param a_group_name a group name string + * @return Returns a table name string with the replaced character + */ char *dap_db_driver_sqlite_make_table_name(const char *a_group_name) { char *l_group_name = dap_strdup(a_group_name); ssize_t l_group_name_len = (ssize_t)dap_strlen(l_group_name); const char *l_needle = "."; - // replace '.' to '_' + // replace '.' with '_' while(1){ char *l_str = dap_strstr_len(l_group_name, l_group_name_len, l_needle); if(l_str) @@ -555,8 +593,10 @@ char *dap_db_driver_sqlite_make_table_name(const char *a_group_name) } /** - * Apply data (write or delete) - * + * @brief Applies an object to a database. + * + * @param a_store_obj a pointer to the object structure + * @return Returns 0 if successful. */ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) { @@ -566,26 +606,27 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) char *l_error_message = NULL; char *l_table_name = dap_db_driver_sqlite_make_table_name(a_store_obj->group); if(a_store_obj->type == 'a') { - if(!a_store_obj->key || !a_store_obj->value || !a_store_obj->value_len) + if(!a_store_obj->key) return -1; //dap_chain_hash_fast_t l_hash; //dap_hash_fast(a_store_obj->value, a_store_obj->value_len, &l_hash); char *l_blob_hash = "";//dap_db_driver_get_string_from_blob((uint8_t*) &l_hash, sizeof(dap_chain_hash_fast_t)); char *l_blob_value = dap_db_driver_get_string_from_blob(a_store_obj->value, (int)a_store_obj->value_len); + DAP_DEL_Z(a_store_obj->value); //add one record l_query = sqlite3_mprintf("insert into '%s' values(NULL, '%s', x'%s', '%lld', x'%s')", l_table_name, a_store_obj->key, l_blob_hash, a_store_obj->timestamp, l_blob_value); //dap_db_driver_sqlite_free(l_blob_hash); dap_db_driver_sqlite_free(l_blob_value); } - else if(a_store_obj->type == 'd') { + else if (a_store_obj->type == 'd') { //delete one record - if(a_store_obj->key) + if (a_store_obj->key) { l_query = sqlite3_mprintf("delete from '%s' where key = '%s'", l_table_name, a_store_obj->key); - // remove all group - else { + } else { + // remove all group l_query = sqlite3_mprintf("drop table if exists '%s'", l_table_name); } } @@ -633,11 +674,20 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) dap_db_driver_sqlite_free(l_error_message); l_ret = -1; } + if (a_store_obj->key) + DAP_DELETE(a_store_obj->key); dap_db_driver_sqlite_free(l_query); DAP_DELETE(l_table_name); return l_ret; } +/** + * @brief Fills a object from a row + * + * @param a_group a group name string + * @param a_obj a pointer to the object + * @param a_row a ponter to the row structure + */ static void fill_one_item(const char *a_group, dap_store_obj_t *a_obj, SQLITE_ROW_VALUE *a_row) { a_obj->group = dap_strdup(a_group); @@ -671,9 +721,10 @@ static void fill_one_item(const char *a_group, dap_store_obj_t *a_obj, SQLITE_RO } /** - * Read last items - * - * a_group - group name + * @brief Reads a last object from the s_db database. + * + * @param a_group a group name string + * @return Returns a pointer to the object. */ dap_store_obj_t* dap_db_driver_sqlite_read_last_store_obj(const char *a_group) { @@ -718,12 +769,13 @@ dap_store_obj_t* dap_db_driver_sqlite_read_last_store_obj(const char *a_group) } /** - * Read several items with conditoin - * - * a_group - group name - * a_id - read from this id - * a_count_out[in], how many items to read, 0 - no limits - * a_count_out[out], how many items was read + * @brief Reads some objects from a database by conditions + * + * @param a_group a group name string + * @param a_id id + * @param a_count_out[in] a number of objects to be read, if equals 0 reads with no limits + * @param a_count_out[out] a number of objects that were read + * @return If successful, a pointer to an objects, otherwise NULL. */ dap_store_obj_t* dap_db_driver_sqlite_read_cond_store_obj(const char *a_group, uint64_t a_id, size_t *a_count_out) { @@ -795,12 +847,12 @@ dap_store_obj_t* dap_db_driver_sqlite_read_cond_store_obj(const char *a_group, u } /** - * Read several items - * - * a_group - group name - * a_key - key name, may by NULL, it means reading the whole group - * a_count_out[in], how many items to read, 0 - no limits - * a_count_out[out], how many items was read + * @brief Reads some objects from a SQLite database by a_group, a_key. + * @param a_group a group name string + * @param a_key an object key string, if equals NULL reads the whole group + * @param a_count_out[in] a number of objects to be read, if equals 0 reads with no limits + * @param a_count_out[out] a number of objects that were read + * @return If successful, a pointer to an objects, otherwise NULL. */ dap_store_obj_t* dap_db_driver_sqlite_read_store_obj(const char *a_group, const char *a_key, size_t *a_count_out) { @@ -872,6 +924,12 @@ dap_store_obj_t* dap_db_driver_sqlite_read_store_obj(const char *a_group, const return l_obj; } +/** + * @brief Gets a list of group names from a s_db database by a_group_mask. + * + * @param a_group_mask a group name mask + * @return Returns a pointer to a list of group names. + */ dap_list_t* dap_db_driver_sqlite_get_groups_by_mask(const char *a_group_mask) { if(!a_group_mask || !s_db) @@ -898,6 +956,13 @@ dap_list_t* dap_db_driver_sqlite_get_groups_by_mask(const char *a_group_mask) return l_ret_list; } +/** + * @brief Reads a number of objects from a s_db database by a_group and a_id + * + * @param a_group a group name string + * @param a_id id starting from which the quantity is calculated + * @return Returns a number of objects. + */ size_t dap_db_driver_sqlite_read_count_store(const char *a_group, uint64_t a_id) { sqlite3_stmt *l_res; @@ -916,7 +981,7 @@ size_t dap_db_driver_sqlite_read_count_store(const char *a_group, uint64_t a_id) //log_it(L_ERROR, "Count l_ret=%d, %s\n", sqlite3_errcode(s_db), sqlite3_errmsg(s_db)); return 0; } - size_t l_ret_val; + size_t l_ret_val = 0; SQLITE_ROW_VALUE *l_row = NULL; if (dap_db_driver_sqlite_fetch_array(l_res, &l_row) == SQLITE_ROW && l_row) { l_ret_val = (size_t)l_row->val->val.val_int64; @@ -926,6 +991,13 @@ size_t dap_db_driver_sqlite_read_count_store(const char *a_group, uint64_t a_id) return l_ret_val; } +/** + * @brief Checks if an object is in a s_db database by a_group and a_key. + * + * @param a_group a group name string + * @param a_key a object key string + * @return Returns true if it is, false it's not. + */ bool dap_db_driver_sqlite_is_obj(const char *a_group, const char *a_key) { sqlite3_stmt *l_res; @@ -944,7 +1016,7 @@ bool dap_db_driver_sqlite_is_obj(const char *a_group, const char *a_key) //log_it(L_ERROR, "Exists l_ret=%d, %s\n", sqlite3_errcode(s_db), sqlite3_errmsg(s_db)); return false; } - bool l_ret_val; + bool l_ret_val = false; SQLITE_ROW_VALUE *l_row = NULL; if (dap_db_driver_sqlite_fetch_array(l_res, &l_row) == SQLITE_ROW && l_row) { l_ret_val = (size_t)l_row->val->val.val_int64; diff --git a/modules/global-db/dap_chain_global_db_hist.c b/modules/global-db/dap_chain_global_db_hist.c index 19a973bced7f191b70689eac5370357416327763..9404776f360d6b9d7f5066707b3781ce80b78311 100644 --- a/modules/global-db/dap_chain_global_db_hist.c +++ b/modules/global-db/dap_chain_global_db_hist.c @@ -101,6 +101,10 @@ bool dap_db_history_add(char a_type, pdap_store_obj_t a_store_obj, size_t a_dap_ } l_keys[i] = NULL; l_rec.keys = dap_strjoinv(GLOBAL_DB_HIST_KEY_SEPARATOR, l_keys); + for(i = 0; i < a_dap_store_count; i++) { + DAP_DELETE(l_keys[i]); + DAP_DEL_Z(a_store_obj[i].value); + } DAP_DELETE(l_keys); } @@ -117,7 +121,6 @@ bool dap_db_history_add(char a_type, pdap_store_obj_t a_store_obj, size_t a_dap_ int l_res = dap_chain_global_db_driver_add(&l_store_data, 1); if(l_rec.keys_count > 1) DAP_DELETE(l_rec.keys); - DAP_DELETE(l_str); if(!l_res) return true; return false; diff --git a/modules/global-db/dap_chain_global_db_remote.c b/modules/global-db/dap_chain_global_db_remote.c index 7ba84b9502fe6888d5c8188a69ebee325e572e0d..8bed4f838c9c191b7a8d2dbc0cd68d7558ff674c 100644 --- a/modules/global-db/dap_chain_global_db_remote.c +++ b/modules/global-db/dap_chain_global_db_remote.c @@ -33,8 +33,7 @@ static bool dap_db_set_cur_node_addr_common(uint64_t a_address, char *a_net_name time_t *l_cur_time = DAP_NEW_Z(time_t); *l_cur_time= a_expire_time; char *l_key_time = dap_strdup_printf("cur_node_addr_%s_time", a_net_name); - l_ret = dap_chain_global_db_gr_set( dap_strdup(l_key_time), (uint8_t*) l_cur_time, sizeof(time_t), GROUP_LOCAL_GENERAL); - DAP_DELETE(l_key_time); + l_ret = dap_chain_global_db_gr_set(l_key_time, (uint8_t*) l_cur_time, sizeof(time_t), GROUP_LOCAL_GENERAL); } return l_ret; } @@ -112,9 +111,10 @@ bool dap_db_set_last_id_remote(uint64_t a_node_addr, uint64_t a_id, char *a_grou { //log_it( L_DEBUG, "Node 0x%016X set last synced id %"DAP_UINT64_FORMAT_U"", a_node_addr, a_id); char *l_node_addr_str = dap_strdup_printf("%ju%s", a_node_addr, a_group); - bool l_ret = dap_chain_global_db_gr_set(l_node_addr_str, &a_id, sizeof(uint64_t), + uint64_t *l_id = DAP_NEW(uint64_t); + *l_id = a_id; + bool l_ret = dap_chain_global_db_gr_set(l_node_addr_str, l_id, sizeof(uint64_t), GROUP_LOCAL_NODE_LAST_ID); - DAP_DELETE(l_node_addr_str); return l_ret; } @@ -142,9 +142,8 @@ uint64_t dap_db_get_last_id_remote(uint64_t a_node_addr, char *a_group) */ bool dap_db_set_last_hash_remote(uint64_t a_node_addr, dap_chain_t *a_chain, dap_chain_hash_fast_t *a_hash) { - //log_it( L_DEBUG, "Node 0x%016X set last synced timestamp %"DAP_UINT64_FORMAT_U"", a_id); return dap_chain_global_db_gr_set(dap_strdup_printf("%ju%s%s", a_node_addr, a_chain->net_name, a_chain->name), - a_hash, sizeof(*a_hash), GROUP_LOCAL_NODE_LAST_ID); + DAP_DUP(a_hash), sizeof(*a_hash), GROUP_LOCAL_NODE_LAST_ID); } /** diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index b617fc9988e61bacb3b3235a5388abfe71773083..e72a1242c09f04606ce71c772202e3d60b03ae63 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -77,28 +77,25 @@ int dap_datum_mempool_init(void) * @param a_datum * @return */ -int dap_chain_mempool_datum_add(dap_chain_datum_t * a_datum, dap_chain_t * a_chain ) +char *dap_chain_mempool_datum_add(dap_chain_datum_t * a_datum, dap_chain_t * a_chain ) { if( a_datum == NULL){ log_it(L_ERROR, "NULL datum trying to add in mempool"); - return -1; + return NULL; } - int ret =0; - dap_chain_hash_fast_t l_key_hash; dap_hash_fast(a_datum->data , a_datum->header.data_size, &l_key_hash); - char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash); char * l_gdb_group = dap_chain_net_get_gdb_group_mempool(a_chain); if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (byte_t *) a_datum, dap_chain_datum_size(a_datum) ,l_gdb_group)) { log_it(L_NOTICE, "Datum with data's hash %s was placed in mempool", l_key_str); - }else{ + } else { log_it(L_WARNING, "Can't place data's hash %s was placed in mempool", l_key_str); + DAP_DELETE(l_key_str); } DAP_DELETE(l_gdb_group); - DAP_DELETE(l_key_str); - return ret; + return l_key_str; } /** @@ -167,7 +164,9 @@ dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_ dap_hash_fast_t * l_ret = DAP_NEW_Z(dap_hash_fast_t); dap_hash_fast(l_tx, l_tx_size, l_ret); DAP_DELETE(l_tx); - if(dap_chain_mempool_datum_add (l_datum, a_chain) == 0){ + char *l_hash_str = dap_chain_mempool_datum_add(l_datum, a_chain); + if (l_hash_str) { + DAP_DELETE(l_hash_str); return l_ret; }else{ DAP_DELETE( l_datum ); @@ -202,7 +201,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a // Search unused out: uint64_t l_value_need =a_tx_num*( a_value + a_value_fee ); uint64_t l_value_transfer = 0; // how many coins to transfer - log_it(L_DEBUG,"Create %lu transactions, summary %Lf.7", a_tx_num,dap_chain_datoshi_to_coins(l_value_need) ) ; + log_it(L_DEBUG,"Create %"DAP_UINT64_FORMAT_U" transactions, summary %Lf.7", a_tx_num,dap_chain_datoshi_to_coins(l_value_need) ) ; dap_list_t *l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(a_chain->ledger, a_token_ticker, a_addr_from, l_value_need, &l_value_transfer); if (!l_list_used_out) { @@ -212,7 +211,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a } for (size_t i=0; i< a_tx_num ; i++){ - log_it(L_DEBUG, "Prepare tx %u",i); + log_it(L_DEBUG, "Prepare tx %zu",i); // find the transactions from which to take away coins // create empty transaction @@ -333,13 +332,13 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a //return 0; if( dap_chain_global_db_gr_save(l_objs,a_tx_num,l_gdb_group) ) { - log_it(L_NOTICE, "%u transaction are placed in mempool", a_tx_num); - //DAP_DELETE(l_objs); + log_it(L_NOTICE, "%zu transaction are placed in mempool", a_tx_num); + DAP_DELETE(l_objs); DAP_DELETE(l_gdb_group); return 0; }else{ - log_it(L_ERROR, "Can't place %u transactions in mempool", a_tx_num); - //DAP_DELETE(l_objs); + log_it(L_ERROR, "Can't place %zu transactions in mempool", a_tx_num); + DAP_DELETE(l_objs); DAP_DELETE(l_gdb_group); return -4; } diff --git a/modules/mempool/include/dap_chain_mempool.h b/modules/mempool/include/dap_chain_mempool.h index 5fbf3e3d259370754770503aad85bb88f7d64513..0e8b0be25b623794efbc28e2576eaf50055ac712 100644 --- a/modules/mempool/include/dap_chain_mempool.h +++ b/modules/mempool/include/dap_chain_mempool.h @@ -43,7 +43,7 @@ void dap_datum_mempool_free(dap_datum_mempool_t *datum); void dap_chain_mempool_add_proc(dap_http_t * a_http_server, const char * a_url); -int dap_chain_mempool_datum_add(dap_chain_datum_t *a_datum, dap_chain_t *a_chain); +char *dap_chain_mempool_datum_add(dap_chain_datum_t *a_datum, dap_chain_t *a_chain); dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_t *a_key_from, const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to, const dap_chain_addr_t* a_addr_fee, @@ -67,8 +67,6 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond(dap_chain_net_t * a_net, dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t * a_net,dap_chain_hash_fast_t *a_tx_prev_hash, const dap_chain_addr_t* a_addr_to, dap_enc_key_t * l_key_tx_sign, dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_size); - -int dap_chain_mempool_datum_add(dap_chain_datum_t * a_datum, dap_chain_t * a_chain ); int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a_key_from, const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to, const dap_chain_addr_t* a_addr_fee, diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index aaf69b79cf7c9ed54ab2ea1af0c1a540ae47e164..2658130cbc3065d15b56c3142bfd924750886c4e 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -116,7 +116,6 @@ static size_t s_max_links_count = 5;// by default 5 // number of required connections static size_t s_required_links_count = 3;// by default 3 -static pthread_t s_net_check_pid; static bool s_debug_more = false; struct link_dns_request { @@ -164,8 +163,11 @@ typedef struct dap_chain_net_pvt{ uint16_t gdb_sync_groups_count; uint16_t gdb_sync_nodes_addrs_count; + uint16_t gdb_sync_nodes_links_count; char **gdb_sync_groups; dap_chain_node_addr_t *gdb_sync_nodes_addrs; + uint32_t *gdb_sync_nodes_links_ips; + uint16_t *gdb_sync_nodes_links_ports; uint16_t seed_aliases_count; @@ -237,7 +239,7 @@ static void s_net_state_link_prepare_success(dap_worker_t * a_worker,dap_chain_n static void s_net_state_link_prepare_error(dap_worker_t * a_worker,dap_chain_node_info_t * a_node_info, void * a_arg, int a_errno); -static void s_net_proc_kill( dap_chain_net_t * a_net ); +//static void s_net_proc_kill( dap_chain_net_t * a_net ); int s_net_load(const char * a_net_name, uint16_t a_acl_idx); // Notify callback for GlobalDB changes @@ -246,7 +248,7 @@ static void s_gbd_history_callback_notify (void * a_arg, const char a_op_code, c const size_t a_value_len); static void s_chain_callback_notify(void * a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, void *a_atom, size_t a_atom_size); -static int s_cli_net(int argc, char ** argv, void *arg_func, char **str_reply); +static int s_cli_net(int argc, char ** argv, char **str_reply); static bool s_seed_mode = false; @@ -344,7 +346,10 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c pthread_rwlock_rdlock(&PVT(l_net)->rwlock); for (dap_list_t *l_tmp = PVT(l_net)->links; l_tmp; l_tmp = dap_list_next(l_tmp)) { dap_chain_node_client_t *l_node_client = (dap_chain_node_client_t *)l_tmp->data; - dap_stream_ch_chain_pkt_write_mt( dap_client_get_stream_worker(l_node_client->client), l_node_client->ch_chain_uuid, DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB, l_net->pub.id.uint64, + dap_stream_worker_t *l_stream_worker = dap_client_get_stream_worker(l_node_client->client); + if (l_stream_worker) + continue; + dap_stream_ch_chain_pkt_write_mt(l_stream_worker, l_node_client->ch_chain_uuid, DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB, l_net->pub.id.uint64, l_chain_id.uint64, l_net->pub.cell_id.uint64, l_data_out, sizeof(dap_store_obj_pkt_t) + l_data_out->data_size); } @@ -430,7 +435,7 @@ static void s_fill_links_from_root_aliases(dap_chain_net_t * a_net) pthread_rwlock_unlock(&l_pvt_net->rwlock); } else { log_it(L_WARNING, "Not found link %s."NODE_ADDR_FP_STR" in the node list", a_net->pub.name, - NODE_ADDR_FPS_ARGS(l_link_addr)); + NODE_ADDR_FP_ARGS(l_link_addr)); } } } @@ -453,13 +458,15 @@ static void s_node_link_callback_connected(dap_chain_node_client_t * a_node_clie } a_node_client->resync_gdb = l_net_pvt->flags & F_DAP_CHAIN_NET_SYNC_FROM_ZERO; - if( !a_node_client->is_reconnecting || s_debug_more ) + if (!a_node_client->is_reconnecting) { + if ( s_debug_more ) log_it(L_NOTICE, "Established connection with %s."NODE_ADDR_FP_STR,l_net->pub.name, NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr)); - pthread_rwlock_wrlock(&l_net_pvt->rwlock); - l_net_pvt->links = dap_list_append(l_net_pvt->links, a_node_client); - l_net_pvt->links_connected_count++; - s_net_links_notify(l_net); + pthread_rwlock_wrlock(&l_net_pvt->rwlock); + l_net_pvt->links = dap_list_append(l_net_pvt->links, a_node_client); + l_net_pvt->links_connected_count++; + s_net_links_notify(l_net); + } if(l_net_pvt->state == NET_STATE_LINKS_CONNECTING ){ l_net_pvt->state = NET_STATE_LINKS_ESTABLISHED; @@ -479,30 +486,27 @@ static void s_node_link_callback_disconnected(dap_chain_node_client_t * a_node_c dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg; dap_chain_net_pvt_t * l_net_pvt = PVT(l_net); pthread_rwlock_wrlock(&l_net_pvt->rwlock); - if ( l_net_pvt->state_target ==NET_STATE_ONLINE ){ - if(s_debug_more) - log_it(L_NOTICE, "%s."NODE_ADDR_FP_STR" disconnected, reconnecting back...", - l_net->pub.name, - NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr) ); - - a_node_client->is_reconnecting = true; - - dap_chain_net_client_create_n_connect(l_net, a_node_client->info); - }else if (l_net_pvt->state_target == NET_STATE_OFFLINE){ - log_it(L_INFO, "%s."NODE_ADDR_FP_STR" disconnected",l_net->pub.name,NODE_ADDR_FP_ARGS_S(a_node_client->info->hdr.address)); - - }else{ - log_it(L_CRITICAL,"Link "NODE_ADDR_FP_STR" disconnected, but wrong target state %s: could be only NET_STATE_ONLINE or NET_STATE_OFFLINE " - ,NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr) - , c_net_states[l_net_pvt->state_target] ); - } - if(l_net_pvt->links_connected_count) + if ( l_net_pvt->state_target ==NET_STATE_ONLINE ){ + if(s_debug_more) + log_it(L_NOTICE, "%s."NODE_ADDR_FP_STR" disconnected, reconnecting back...", + l_net->pub.name, + NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr) ); + a_node_client->is_reconnecting = true; + dap_chain_net_client_create_n_connect(l_net, a_node_client->info); + }else if (l_net_pvt->state_target == NET_STATE_OFFLINE){ + if(l_net_pvt->links_connected_count) { + s_node_link_callback_delete(a_node_client,a_arg); l_net_pvt->links_connected_count--; - else + } else log_it(L_CRITICAL,"Links count is zero in disconnected callback, looks smbd decreased it twice or forget to increase on connect/reconnect"); - pthread_rwlock_unlock(&l_net_pvt->rwlock); + log_it(L_INFO, "%s."NODE_ADDR_FP_STR" disconnected",l_net->pub.name,NODE_ADDR_FP_ARGS_S(a_node_client->info->hdr.address)); - s_node_link_callback_delete(a_node_client,a_arg); + }else{ + log_it(L_CRITICAL,"Link "NODE_ADDR_FP_STR" disconnected, but wrong target state %s: could be only NET_STATE_ONLINE or NET_STATE_OFFLINE " + ,NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr) + , c_net_states[l_net_pvt->state_target] ); + } + pthread_rwlock_unlock(&l_net_pvt->rwlock); } /** @@ -572,8 +576,6 @@ static void s_node_link_callback_delete(dap_chain_node_client_t * a_node_client, } } pthread_rwlock_unlock(&l_net_pvt->rwlock); - dap_chain_node_client_close(a_node_client); - dap_notify_server_send_f_mt("{" "class:\"NetLinkDelete\"," "net_id:0x%016" DAP_UINT64_FORMAT_X "," @@ -581,6 +583,7 @@ static void s_node_link_callback_delete(dap_chain_node_client_t * a_node_client, "address:\""NODE_ADDR_FP_STR"\"" "}\n", a_node_client->net->pub.id.uint64, a_node_client->info->hdr.cell_id.uint64, NODE_ADDR_FP_ARGS_S(a_node_client->info->hdr.address)); + dap_chain_node_client_close(a_node_client); } /** @@ -613,10 +616,10 @@ static void s_net_state_link_prepare_success(dap_worker_t * a_worker,dap_chain_n l_dns_request->tries++; l_net_pvt->links_dns_requests--; if (l_net_pvt->links_dns_requests == 0){ // It was the last one - if (l_net_pvt->state != NET_STATE_LINKS_ESTABLISHED){ - l_net_pvt->state = NET_STATE_LINKS_ESTABLISHED; - dap_proc_queue_add_callback_inter( a_worker->proc_queue_input,s_net_states_proc,l_net ); + if (l_net_pvt->state != NET_STATE_LINKS_CONNECTING){ + l_net_pvt->state = NET_STATE_LINKS_CONNECTING; } + dap_proc_queue_add_callback_inter( a_worker->proc_queue_input,s_net_states_proc,l_net ); } pthread_rwlock_unlock(&l_net_pvt->rwlock); dap_notify_server_send_f_mt("{" @@ -712,13 +715,13 @@ static void s_net_links_notify(dap_chain_net_t * a_net ) inet_ntop(AF_INET6,&l_info->hdr.ext_addr_v6,l_ext_addr_v6,sizeof (l_info->hdr.ext_addr_v6)); dap_string_append_printf(l_str_reply,"{" - "id:%u," + "id:%zu," "address:\""NODE_ADDR_FP_STR"\"," "alias:\"%s\"," "cell_id:0x%016"DAP_UINT64_FORMAT_X"," "ext_ipv4:\"%s\"," "ext_ipv6:\"%s\"," - "ext_port:%u" + "ext_port:%hu" "state:\"%s\"" "}", i,NODE_ADDR_FP_ARGS_S(l_info->hdr.address), l_info->hdr.alias, l_info->hdr.cell_id.uint64, l_ext_addr_v4, l_ext_addr_v6,l_info->hdr.ext_port @@ -730,7 +733,7 @@ static void s_net_links_notify(dap_chain_net_t * a_net ) dap_notify_server_send_f_mt("{" "class:\"NetLinks\"," - "net_id:0x%016" DAP_UINT64_FORMAT_X "," + "net_id:0x%016"DAP_UINT64_FORMAT_X"," "links:%s" "}\n", a_net->pub.id.uint64, l_str_reply->str); @@ -744,6 +747,7 @@ static void s_net_links_notify(dap_chain_net_t * a_net ) */ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) { + UNUSED(a_thread); bool l_repeat_after_exit = false; // If true - repeat on next iteration of proc thread loop dap_chain_net_t *l_net = (dap_chain_net_t *) a_arg; assert(l_net); @@ -786,6 +790,15 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) case NET_STATE_LINKS_PREPARE: { log_it(L_NOTICE,"%s.state: NET_STATE_LINKS_PREPARE", l_net->pub.name); s_net_states_notify(l_net); + for (int i = 0; i < l_net_pvt->gdb_sync_nodes_links_count; i++) { + if (i >= l_net_pvt->gdb_sync_nodes_addrs_count) + break; + dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t); + l_link_node_info->hdr.address.uint64 = l_net_pvt->gdb_sync_nodes_addrs[i].uint64; + l_link_node_info->hdr.ext_addr_v4.s_addr = l_net_pvt->gdb_sync_nodes_links_ips[i]; + l_link_node_info->hdr.ext_port = l_net_pvt->gdb_sync_nodes_links_ports[i]; + l_net_pvt->links_info = dap_list_append(l_net_pvt->links_info, l_link_node_info); + } uint64_t l_own_addr = dap_chain_net_get_cur_addr_int(l_net); if (l_net_pvt->node_info) { for (size_t i = 0; i < l_net_pvt->node_info->hdr.links_number; i++) { @@ -859,12 +872,12 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) log_it(L_CRITICAL,"Can't allocate memory for node link info"); break; } - #ifdef DAP_OS_UNIX +/* #ifdef DAP_OS_UNIX struct in_addr _in_addr = { .s_addr = l_addr.s_addr }; #else struct in_addr _in_addr = { { .S_addr = l_addr.S_un.S_addr } }; #endif - +*/ l_sync_fill_root_nodes = false; if (l_net_pvt->state_target != NET_STATE_OFFLINE) { l_net_pvt->links_dns_requests++; @@ -905,7 +918,7 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) case NET_STATE_LINKS_ESTABLISHED:{ log_it(L_INFO,"%s.state: NET_STATE_LINKS_ESTABLISHED", l_net->pub.name); for (dap_list_t *l_tmp = l_net_pvt->links ; l_tmp; l_tmp = dap_list_next(l_tmp)) { - dap_chain_node_client_t *l_link = (dap_chain_node_client_t *)l_tmp->data; + //dap_chain_node_client_t *l_link = (dap_chain_node_client_t *)l_tmp->data; // } }break; @@ -988,7 +1001,7 @@ static dap_chain_net_t *s_net_new(const char * a_id, const char * a_name , PVT(ret)->state_proc_cond = CreateEventA( NULL, FALSE, FALSE, NULL ); #endif - if ( sscanf(a_id,"0x%016lx", &ret->pub.id.uint64 ) == 1 ){ + if ( sscanf(a_id,"0x%016"DAP_UINT64_FORMAT_X, &ret->pub.id.uint64 ) == 1 ){ if (strcmp (a_node_role, "root_master")==0){ PVT(ret)->node_role.enums = NODE_ROLE_ROOT_MASTER; log_it (L_NOTICE, "Node role \"root master\" selected"); @@ -1032,6 +1045,7 @@ static dap_chain_net_t *s_net_new(const char * a_id, const char * a_name , /** * @brief dap_chain_net_delete + * free dap_chain_net_t * a_net object * @param a_net */ void dap_chain_net_delete( dap_chain_net_t * a_net ) @@ -1053,7 +1067,7 @@ void dap_chain_net_delete( dap_chain_net_t * a_net ) int dap_chain_net_init() { dap_chain_node_client_init(); - dap_chain_node_cli_cmd_item_create ("net", s_cli_net, NULL, "Network commands", + dap_chain_node_cli_cmd_item_create ("net", s_cli_net, "Network commands", "net list [chains -n <chain net name>]" "\tList all networks or list all chains in selected network" "net -net <chain net name> [-mode update|all] go < online | offline >\n" @@ -1171,9 +1185,8 @@ void s_set_reply_text_node_status(char **a_str_reply, dap_chain_net_t * a_net){ * @param str_reply * @return */ -static int s_cli_net( int argc, char **argv, void *arg_func, char **a_str_reply) +static int s_cli_net(int argc, char **argv, char **a_str_reply) { - UNUSED(arg_func); int arg_index = 1; dap_chain_net_t * l_net = NULL; @@ -1358,7 +1371,7 @@ static int s_cli_net( int argc, char **argv, void *arg_func, char **a_str_reply) pthread_rwlock_rdlock(&l_net_pvt->rwlock ); size_t l_links_count = dap_list_length(l_net_pvt->links); dap_string_t *l_reply = dap_string_new(""); - dap_string_append_printf(l_reply,"Links %u:\n", l_links_count); + dap_string_append_printf(l_reply,"Links %zu:\n", l_links_count); for (dap_list_t * l_item = l_net_pvt->links; l_item; l_item = l_item->next ) { dap_chain_node_client_t * l_node_client = l_item->data; @@ -1376,10 +1389,10 @@ static int s_cli_net( int argc, char **argv, void *arg_func, char **a_str_reply) "\t\text_ipv4: %s\n" "\t\text_ipv6: %s\n" "\t\text_port: %u\n" - "\t\tstate: %s\n" - , NODE_ADDR_FP_ARGS_S(l_info->hdr.address), l_info->hdr.alias, l_info->hdr.cell_id, - l_ext_addr_v4, l_ext_addr_v6,l_info->hdr.ext_port - , dap_chain_node_client_state_to_str(l_node_client->state) ); + "\t\tstate: %s\n", + NODE_ADDR_FP_ARGS_S(l_info->hdr.address), l_info->hdr.alias, l_info->hdr.cell_id.uint64, + l_ext_addr_v4, l_ext_addr_v6, l_info->hdr.ext_port, + dap_chain_node_client_state_to_str(l_node_client->state) ); } i++; } @@ -1546,7 +1559,8 @@ static int s_cli_net( int argc, char **argv, void *arg_func, char **a_str_reply) } } } else { - dap_chain_node_cli_set_reply_text(a_str_reply,"Command requires one of subcomand: sync, links\n"); + dap_chain_node_cli_set_reply_text(a_str_reply, + "Command requires one of subcomand: sync, link, go, get, stats, ca, ledger"); ret = -1; } @@ -1560,8 +1574,9 @@ typedef struct list_priority_{ char * chains_path; }list_priority; -static int callback_compare_prioritity_list(const void * a_item1, const void * a_item2) +static int callback_compare_prioritity_list(const void * a_item1, const void * a_item2, void *a_unused) { + UNUSED(a_unused); list_priority *l_item1 = (list_priority*) a_item1; list_priority *l_item2 = (list_priority*) a_item2; if(!l_item1 || !l_item2 || l_item1->prior == l_item2->prior) @@ -1615,12 +1630,40 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) char **l_gdb_sync_nodes_addrs = dap_config_get_array_str(l_cfg, "general", "gdb_sync_nodes_addrs", &l_net_pvt->gdb_sync_nodes_addrs_count); if(l_gdb_sync_nodes_addrs && l_net_pvt->gdb_sync_nodes_addrs_count > 0) { - l_net_pvt->gdb_sync_nodes_addrs = (dap_chain_node_addr_t*) DAP_NEW_Z_SIZE(char**, + l_net_pvt->gdb_sync_nodes_addrs = DAP_NEW_Z_SIZE(dap_chain_node_addr_t, sizeof(dap_chain_node_addr_t)*l_net_pvt->gdb_sync_nodes_addrs_count); for(uint16_t i = 0; i < l_net_pvt->gdb_sync_nodes_addrs_count; i++) { dap_chain_node_addr_from_str(l_net_pvt->gdb_sync_nodes_addrs + i, l_gdb_sync_nodes_addrs[i]); } } + // links for special sync + uint16_t l_gdb_links_count = 0; + PVT(l_net)->gdb_sync_nodes_links_count = 0; + char **l_gdb_sync_nodes_links = dap_config_get_array_str(l_cfg, "general", "gdb_sync_nodes_links", &l_gdb_links_count); + if (l_gdb_sync_nodes_links && l_gdb_links_count > 0) { + l_net_pvt->gdb_sync_nodes_links_ips = DAP_NEW_Z_SIZE(uint32_t, l_gdb_links_count * sizeof(uint32_t)); + l_net_pvt->gdb_sync_nodes_links_ports = DAP_NEW_SIZE(uint16_t, l_gdb_links_count * sizeof(uint16_t)); + for(uint16_t i = 0; i < l_gdb_links_count; i++) { + char *l_gdb_link_port_str = strchr(l_gdb_sync_nodes_links[i], ':'); + if (!l_gdb_link_port_str) { + continue; + } + uint16_t l_gdb_link_port = atoi(l_gdb_link_port_str + 1); + if (!l_gdb_link_port) { + continue; + } + int l_gdb_link_len = l_gdb_link_port_str - l_gdb_sync_nodes_links[i]; + char l_gdb_link_ip_str[l_gdb_link_len + 1]; + memcpy(l_gdb_link_ip_str, l_gdb_sync_nodes_links[i], l_gdb_link_len); + l_gdb_link_ip_str[l_gdb_link_len] = '\0'; + struct in_addr l_in_addr; + if (inet_pton(AF_INET, (const char *)l_gdb_link_ip_str, &l_in_addr) > 0) { + PVT(l_net)->gdb_sync_nodes_links_ips[PVT(l_net)->gdb_sync_nodes_links_count] = l_in_addr.s_addr; + PVT(l_net)->gdb_sync_nodes_links_ports[PVT(l_net)->gdb_sync_nodes_links_count] = l_gdb_link_port; + PVT(l_net)->gdb_sync_nodes_links_count++; + } + } + } // groups for special sync uint16_t l_gdb_sync_groups_count; char **l_gdb_sync_groups = dap_config_get_array_str(l_cfg, "general", "gdb_sync_groups", &l_gdb_sync_groups_count); @@ -1631,7 +1674,6 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) } } - // Add network to the list dap_chain_net_item_t * l_net_item = DAP_NEW_Z( dap_chain_net_item_t); dap_chain_net_item_t * l_net_item2 = DAP_NEW_Z( dap_chain_net_item_t); @@ -1727,7 +1769,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) l_pub_key_data = dap_enc_key_serealize_pub_key(l_cert->enc_key, &l_pub_key_data_size); // save pub key if(l_pub_key_data && l_pub_key_data_size > 0) - dap_chain_global_db_gr_set(dap_strdup("cur-node-addr-pkey"), (uint8_t*) l_pub_key_data, l_pub_key_data_size, + dap_chain_global_db_gr_set(dap_strdup("cur-node-addr-pkey"), DAP_DUP_SIZE(l_pub_key_data, l_pub_key_data_size), l_pub_key_data_size, GROUP_LOCAL_NODE_ADDR); } } @@ -1818,7 +1860,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) if (dap_chain_node_alias_register(l_net,l_net_pvt->seed_aliases[i],l_seed_node_addr)) log_it(L_NOTICE,"Seed node "NODE_ADDR_FP_STR" added to the curent list",NODE_ADDR_FP_ARGS(l_seed_node_addr) ); else { - log_it(L_WARNING,"Cant register alias %s for address "NODE_ADDR_FP_STR,NODE_ADDR_FP_ARGS(l_seed_node_addr)); + log_it(L_WARNING,"Cant register alias %s for address "NODE_ADDR_FP_STR, l_net_pvt->seed_aliases[i], NODE_ADDR_FP_ARGS(l_seed_node_addr)); } }else{ log_it(L_WARNING,"Cant save node info for address "NODE_ADDR_FP_STR" return code %d", @@ -1866,7 +1908,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) else{ l_node_addr = DAP_NEW_Z(dap_chain_node_addr_t); bool parse_succesfully = false; - if ( sscanf(l_node_addr_str, "0x%016" DAP_UINT64_FORMAT_x ,&l_node_addr->uint64 ) == 1 ){ + if (dap_sscanf(l_node_addr_str, "0x%016"DAP_UINT64_FORMAT_x, &l_node_addr->uint64 ) == 1 ){ log_it(L_DEBUG, "Parse node address with format 0x016llx"); parse_succesfully = true; } @@ -1914,7 +1956,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) dap_chain_node_info_save(l_net,l_net_pvt->node_info); } - log_it(L_NOTICE,"GDB Info: node_addr: " NODE_ADDR_FP_STR" links: %u cell_id: 0x%016X ", + log_it(L_NOTICE,"GDB Info: node_addr: " NODE_ADDR_FP_STR" links: %u cell_id: 0x%016"DAP_UINT64_FORMAT_X, NODE_ADDR_FP_ARGS(l_node_addr), l_net_pvt->node_info->hdr.links_number, l_net_pvt->node_info->hdr.cell_id.uint64); @@ -2056,7 +2098,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) dap_chain_net_state_go_to(l_net, l_target_state); // Start the proc thread - log_it(L_INFO, "Сhain network \"%s\" initialized",l_net_item->name); + log_it(L_INFO, "Chain network \"%s\" initialized",l_net_item->name); dap_config_close(l_cfg); } @@ -2367,7 +2409,7 @@ void dap_chain_net_proc_mempool (dap_chain_net_t * a_net) size_t l_objs_size = 0; dap_global_db_obj_t * l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size); if(l_objs_size) { - log_it(L_INFO, "%s.%s: Found %u records :", a_net->pub.name, l_chain->name, + log_it(L_INFO, "%s.%s: Found %zu records :", a_net->pub.name, l_chain->name, l_objs_size); size_t l_datums_size = l_objs_size; dap_chain_datum_t ** l_datums = DAP_NEW_Z_SIZE(dap_chain_datum_t*, @@ -2405,7 +2447,7 @@ void dap_chain_net_proc_mempool (dap_chain_net_t * a_net) } } if(l_objs_processed < l_datums_size) - log_it(L_WARNING, "%s.%s: %d records not processed", a_net->pub.name, l_chain->name, + log_it(L_WARNING, "%s.%s: %zu records not processed", a_net->pub.name, l_chain->name, l_datums_size - l_objs_processed); dap_chain_global_db_objs_delete(l_objs, l_objs_size); @@ -2484,6 +2526,10 @@ bool dap_chain_net_get_add_gdb_group(dap_chain_net_t *a_net, dap_chain_node_addr /** * @brief dap_chain_net_verify_datum_for_add + * process datum verification process. Can be: + * if DAP_CHAIN_DATUM_TX, called dap_chain_ledger_tx_add_check + * if DAP_CHAIN_DATUM_TOKEN_DECL, called dap_chain_ledger_token_decl_add_check + * if DAP_CHAIN_DATUM_TOKEN_EMISSION, called dap_chain_ledger_token_emission_add_check * @param a_net * @param a_datum * @return @@ -2526,20 +2572,19 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da dap_chain_datum_token_t * l_token = (dap_chain_datum_token_t*) a_datum->data; size_t l_token_size = a_datum->header.data_size; if(l_token_size < sizeof(dap_chain_datum_token_t)){ - dap_string_append_printf(a_str_out,"==Datum has incorrect size. Only %lu, while at least %lu is expected\n", + dap_string_append_printf(a_str_out,"==Datum has incorrect size. Only %zu, while at least %zu is expected\n", l_token_size, sizeof(dap_chain_datum_token_t)); return; } dap_string_append_printf(a_str_out,"==Datum Token Declaration\n"); dap_string_append_printf(a_str_out, "ticker: %s\n", l_token->ticker); dap_string_append_printf(a_str_out, "size: %zd\n", l_token_size); - dap_hash_fast_t l_hash ={0}; switch (l_token->type) { case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE:{ dap_string_append_printf(a_str_out, "type: SIMPLE\n"); - dap_string_append_printf(a_str_out, "sign_total: %u\n", l_token->header_private.signs_total ); - dap_string_append_printf(a_str_out, "sign_valid: %u\n", l_token->header_private.signs_valid ); - dap_string_append_printf(a_str_out, "total_supply: %u\n", l_token->header_private.total_supply ); + dap_string_append_printf(a_str_out, "sign_total: %hu\n", l_token->header_private.signs_total ); + dap_string_append_printf(a_str_out, "sign_valid: %hu\n", l_token->header_private.signs_valid ); + dap_string_append_printf(a_str_out, "total_supply: %"DAP_UINT64_FORMAT_U"\n", l_token->header_private.total_supply ); }break; case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:{ dap_string_append_printf(a_str_out,"type: PRIVATE_UPDATE\n"); @@ -2551,7 +2596,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da size_t l_offset_max = l_token->header_private_decl.tsd_total_size; while( l_offset< l_offset_max){ if ( (l_tsd->size+l_offset) >l_offset_max){ - log_it(L_WARNING, "<CORRUPTED TSD> too big size %zd when left maximum %zd", + log_it(L_WARNING, "<CORRUPTED TSD> too big size %u when left maximum %zu", l_tsd->size, l_offset_max - l_offset); return; } @@ -2567,8 +2612,8 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da dap_tsd_get_scalar(l_tsd, uint16_t)); break; case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: - dap_string_append_printf(a_str_out,"total_supply: %u\n", - dap_tsd_get_scalar(l_tsd, uint128_t) ); + dap_string_append_printf(a_str_out,"total_supply: %s\n", + dap_chain_balance_print(dap_tsd_get_scalar(l_tsd, uint128_t))); break; case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID : dap_string_append_printf(a_str_out,"total_signs_valid: %u\n", @@ -2584,7 +2629,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da dap_string_append_printf(a_str_out,"total_signs_add: %s\n", l_hash_str ); DAP_DELETE( l_hash_str ); }else - dap_string_append_printf(a_str_out,"total_signs_add: <WRONG SIZE %zd>\n", l_tsd->size); + dap_string_append_printf(a_str_out,"total_signs_add: <WRONG SIZE %u>\n", l_tsd->size); break; case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_REMOVE : if(l_tsd->size == sizeof(dap_chain_hash_fast_t) ){ @@ -2596,7 +2641,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da dap_string_append_printf(a_str_out,"total_signs_remove: %s\n", l_hash_str ); DAP_DELETE( l_hash_str ); }else - dap_string_append_printf(a_str_out,"total_signs_add: <WRONG SIZE %zd>\n", l_tsd->size); + dap_string_append_printf(a_str_out,"total_signs_add: <WRONG SIZE %u>\n", l_tsd->size); break; case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD : dap_string_append_printf(a_str_out,"datum_type_allowed_add: %s\n", @@ -2646,7 +2691,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da dap_string_append_printf(a_str_out, "tx_receiver_blocked_remove: %s\n", dap_tsd_get_string_const(l_tsd) ); break; - default: dap_string_append_printf(a_str_out, "<0x%04X>: <size %zd>\n", l_tsd->type, l_tsd->size); + default: dap_string_append_printf(a_str_out, "<0x%04hX>: <size %u>\n", l_tsd->type, l_tsd->size); } l_offset += dap_tsd_size(l_tsd); @@ -2666,14 +2711,14 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da while( l_offset< l_offset_max){ dap_tsd_t * l_tsd = (void*)l_tsd_first + l_offset; if ( (l_tsd->size+l_offset) >l_offset_max){ - log_it(L_WARNING, "<CORRUPTED TSD> too big size %zd when left maximum %zd", + log_it(L_WARNING, "<CORRUPTED TSD> too big size %u when left maximum %zu", l_tsd->size, l_offset_max - l_offset); return; } switch( l_tsd->type){ case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: - dap_string_append_printf(a_str_out,"total_supply: %lu\n", - dap_tsd_get_scalar(l_tsd, uint128_t) ); + dap_string_append_printf(a_str_out,"total_supply: %s\n", + dap_chain_balance_print(dap_tsd_get_scalar(l_tsd, uint128_t))); break; case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID : dap_string_append_printf(a_str_out,"total_signs_valid: %u\n", @@ -2703,7 +2748,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da dap_string_append_printf(a_str_out, "tx_receiver_blocked: %s\n", dap_tsd_get_string_const(l_tsd) ); break; - default: dap_string_append_printf(a_str_out, "<0x%04X>: <size %zd>\n", l_tsd->type, l_tsd->size); + default: dap_string_append_printf(a_str_out, "<0x%04hX>: <size %u>\n", l_tsd->type, l_tsd->size); } l_offset += dap_tsd_size(l_tsd); @@ -2734,21 +2779,20 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da case TX_ITEM_TYPE_IN:{ dap_chain_tx_in_t * l_in = l_cur->data; dap_string_append_printf(a_str_out,"\ttx_out_prev_idx: %u\n", l_in->header.tx_out_prev_idx ); - dap_string_append_printf(a_str_out,"\ttx_out_prev_idx : %u\n", l_in->header.tx_prev_hash ); char l_tx_prev_hash_str[70]={[0]='\0'}; - dap_hash_fast_to_str(&l_in->header.tx_prev_hash, l_tx_prev_hash_str,sizeof (l_tx_prev_hash_str)-1); + dap_hash_fast_to_str(&l_in->header.tx_prev_hash, l_tx_prev_hash_str, sizeof (l_tx_prev_hash_str)-1); dap_string_append_printf(a_str_out,"\ttx_prev_hash : %s\n", l_tx_prev_hash_str ); } break; case TX_ITEM_TYPE_OUT:{ dap_chain_tx_out_t * l_out = l_cur->data; - dap_string_append_printf(a_str_out,"\tvalue: %u\n", l_out->header.value ); + dap_string_append_printf(a_str_out,"\tvalue: %"DAP_UINT64_FORMAT_U"\n", l_out->header.value ); char * l_addr_str = dap_chain_addr_to_str(&l_out->addr); dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str ); DAP_DELETE(l_addr_str); } break; case TX_ITEM_TYPE_OUT_EXT:{ dap_chain_tx_out_ext_t * l_out_ext = l_cur->data; - dap_string_append_printf(a_str_out,"\tvalue: %u\n", l_out_ext->header.value ); + dap_string_append_printf(a_str_out,"\tvalue: %"DAP_UINT64_FORMAT_U"\n", l_out_ext->header.value ); char * l_addr_str = dap_chain_addr_to_str(&l_out_ext->addr); dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str ); dap_string_append_printf(a_str_out,"\ttoken : %s\n", l_out_ext->token ); @@ -2768,7 +2812,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da case TX_ITEM_TYPE_TOKEN:{ dap_chain_tx_token_t * l_token = l_cur->data; dap_string_append_printf(a_str_out,"\tticker: %s\n", l_token->header.ticker ); - dap_string_append_printf(a_str_out,"\ttoken_emission_chain: 0x%016x\n", l_token->header.token_emission_chain_id ); + dap_string_append_printf(a_str_out,"\ttoken_emission_chain: 0x%016"DAP_UINT64_FORMAT_x"\n", l_token->header.token_emission_chain_id.uint64 ); char l_token_emission_hash_str[70]={ [0]='\0'}; dap_chain_hash_fast_to_str(& l_token->header.token_emission_hash,l_token_emission_hash_str, sizeof (l_token_emission_hash_str)-1); @@ -2778,9 +2822,9 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da dap_chain_tx_token_ext_t * l_token = l_cur->data; dap_string_append_printf(a_str_out,"\tversion: %u\n",l_token->header.version ); dap_string_append_printf(a_str_out,"\tticker: %s\n", l_token->header.ticker ); - dap_string_append_printf(a_str_out,"\text_net: 0x%016x\n",l_token->header.ext_net_id ); - dap_string_append_printf(a_str_out,"\text_chain: 0x%016x\n",l_token->header.ext_chain_id ); - dap_string_append_printf(a_str_out,"\text_tx_out_idx: %u\n",l_token->header.ext_tx_out_idx ); + dap_string_append_printf(a_str_out,"\text_net: 0x%016"DAP_UINT64_FORMAT_x"\n",l_token->header.ext_net_id.uint64 ); + dap_string_append_printf(a_str_out,"\text_chain: 0x%016"DAP_UINT64_FORMAT_x"\n",l_token->header.ext_chain_id.uint64 ); + dap_string_append_printf(a_str_out,"\text_tx_out_idx: %hu\n",l_token->header.ext_tx_out_idx ); char l_token_emission_hash_str[70]={ [0]='\0'}; dap_chain_hash_fast_to_str(& l_token->header.ext_tx_hash,l_token_emission_hash_str, sizeof (l_token_emission_hash_str)-1); @@ -2789,7 +2833,6 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da case TX_ITEM_TYPE_IN_COND:{ dap_chain_tx_in_cond_t * l_in = l_cur->data; dap_string_append_printf(a_str_out,"\ttx_out_prev_idx: %u\n", l_in->header.tx_out_prev_idx ); - dap_string_append_printf(a_str_out,"\ttx_out_prev_idx : %u\n", l_in->header.tx_prev_hash ); dap_string_append_printf(a_str_out,"\treceipt_idx : %u\n", l_in->header.receipt_idx ); char l_tx_prev_hash_str[70]={[0]='\0'}; dap_hash_fast_to_str(&l_in->header.tx_prev_hash, l_tx_prev_hash_str,sizeof (l_tx_prev_hash_str)-1); @@ -2797,11 +2840,11 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da } break; case TX_ITEM_TYPE_OUT_COND:{ dap_chain_tx_out_cond_t * l_out = l_cur->data; - dap_string_append_printf(a_str_out,"\tvalue: %u\n", l_out->header.value ); + dap_string_append_printf(a_str_out,"\tvalue: %"DAP_UINT64_FORMAT_U"\n", l_out->header.value ); switch ( l_out->header.subtype){ case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:{ dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY\n"); - dap_string_append_printf(a_str_out,"\tsrv_uid: 0x%016x\n", l_out->subtype.srv_pay.srv_uid.uint64 ); + dap_string_append_printf(a_str_out,"\tsrv_uid: 0x%016"DAP_UINT64_FORMAT_x"\n", l_out->subtype.srv_pay.srv_uid.uint64 ); switch (l_out->subtype.srv_pay.unit.enm) { case SERV_UNIT_UNDEFINED: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_UNDEFINED\n"); break; case SERV_UNIT_MB: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_MB\n"); break; diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index ed3e1ee5e164c4201d36be9030d48190fe02583b..c4f73594b6b4d1e1a59d7f398fb2c398b29eab27 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -82,20 +82,10 @@ bool dap_chain_node_check_addr(dap_chain_net_t * a_net,dap_chain_node_addr_t *ad /** * Register alias in base */ -bool dap_chain_node_alias_register(dap_chain_net_t * a_net,const char *alias, dap_chain_node_addr_t *addr) +bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias, dap_chain_node_addr_t *a_addr) { - char *a_key = strdup(alias); - dap_chain_node_addr_t *l_addr = DAP_NEW_Z(dap_chain_node_addr_t); - memcpy(l_addr,addr,sizeof (*l_addr)); -// char a_value[2 * sizeof(dap_chain_node_addr_t) + 1]; -// if(bin2hex(a_value, (const unsigned char *) addr, sizeof(dap_chain_node_addr_t)) == -1) -// return false; -// a_value[2 * sizeof(dap_chain_node_addr_t)] = '\0'; - bool res = dap_chain_global_db_gr_set( dap_strdup(a_key), l_addr, sizeof(dap_chain_node_addr_t) - , a_net->pub.gdb_nodes_aliases); - DAP_DELETE(l_addr); - DAP_DELETE(a_key); - return res; + return dap_chain_global_db_gr_set( dap_strdup(a_alias), DAP_DUP(a_addr), + sizeof(dap_chain_node_addr_t), a_net->pub.gdb_nodes_aliases); } /** @@ -150,12 +140,8 @@ int dap_chain_node_info_save(dap_chain_net_t * a_net, dap_chain_node_info_t *a_n } //char *a_value = dap_chain_node_info_serialize(node_info, NULL); size_t l_node_info_size = dap_chain_node_info_get_size(a_node_info); - dap_chain_node_info_t *l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, l_node_info_size); - memcpy(l_node_info, a_node_info, sizeof (*a_node_info) ); - bool res = dap_chain_global_db_gr_set( dap_strdup(l_key), l_node_info, l_node_info_size, a_net->pub.gdb_nodes); - DAP_DELETE(l_key); - //DAP_DELETE(a_value); - return res?0:-3; + bool res = dap_chain_global_db_gr_set(l_key, DAP_DUP(a_node_info), l_node_info_size, a_net->pub.gdb_nodes); + return res ? 0 : -3; } /** @@ -181,7 +167,7 @@ dap_chain_node_info_t* dap_chain_node_info_read( dap_chain_net_t * a_net,dap_cha size_t node_info_size_must_be = dap_chain_node_info_get_size(l_node_info); if(node_info_size_must_be != node_info_size) { - log_it(L_ERROR, "Node has bad size in base=%u (must be %u)", node_info_size, node_info_size_must_be); + log_it(L_ERROR, "Node has bad size in base=%zu (must be %zu)", node_info_size, node_info_size_must_be); DAP_DELETE(l_node_info); DAP_DELETE(l_key); return NULL; @@ -305,11 +291,12 @@ bool dap_chain_node_mempool_autoproc_init() dap_global_db_obj_t *l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size); if (l_objs_size) { for (size_t i = 0; i < l_objs_size; i++) { + // Delete processed objects + dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool); + if (!l_objs[i].value_len) + continue; dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value; - if (dap_chain_node_mempool_process(l_chain, l_role, l_datum)) { - // Delete processed objects - dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool); - } + dap_chain_node_mempool_process(l_chain, l_role, l_datum); } dap_chain_global_db_objs_delete(l_objs, l_objs_size); } diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index 23484d9697dcbeefd610322898f26918ada4c45a..45190dce94cabdfc7f2a67201b464f2fa8f3f9bc 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -85,16 +85,17 @@ bool s_debug_cli = false; static dap_chain_node_cmd_item_t * s_commands = NULL; /** - * @brief + * @brief int s_poll * Wait for data * timeout - timeout in ms * [Specifying a negative value in timeout means an infinite timeout.] * [Specifying a timeout of zero causes poll() to return immediately, even if no file descriptors are ready.] + * return zero if the time limit expired + * return: >0 if data is present to read + * return: -1 if error * @param socket * @param timeout - * @return zero if the time limit expired - * @return: >0 if data is present to read - * @return: -1 if error + * @return int */ static int s_poll( int socket, int timeout ) { @@ -113,12 +114,13 @@ static int s_poll( int socket, int timeout ) return res; } + /** * @brief is_valid_socket * Check socket for validity * @param sock * @return true - * @return false + * @return false */ static bool is_valid_socket(SOCKET sock) { @@ -182,6 +184,7 @@ long s_recv(SOCKET sock, unsigned char *buf, size_t bufsize, int timeout) return res; } + /** * @brief s_get_next_str * Reading from the socket till arrival the specified string @@ -272,7 +275,7 @@ static void* thread_one_client_func(void *args) { SOCKET newsockfd = (SOCKET) (intptr_t) args; if(s_debug_cli) - log_it(L_DEBUG, "new connection sockfd=%d", newsockfd); + log_it(L_DEBUG, "new connection sockfd=%"DAP_FORMAT_SOCKET, newsockfd); int str_len, marker = 0; int timeout = 5000; // 5 sec @@ -343,9 +346,13 @@ static void* thread_one_client_func(void *args) char **l_argv = dap_strsplit(str_cmd, ";", -1); // Call the command function - if(l_cmd && l_argv && l_cmd->func) - res = (*(l_cmd->func))(argc, l_argv, l_cmd->arg_func, &str_reply); - else if (l_cmd){ + if(l_cmd && l_argv && l_cmd->func) { + if (l_cmd->arg_func) { + res = l_cmd->func_ex(argc, l_argv, l_cmd->arg_func, &str_reply); + } else { + res = l_cmd->func(argc, l_argv, &str_reply); + } + } else if (l_cmd) { log_it(L_WARNING,"NULL arguments for input for command \"%s\"", str_cmd); }else { log_it(L_WARNING,"No function for command \"%s\" but it registred?!", str_cmd); @@ -390,7 +397,7 @@ static void* thread_one_client_func(void *args) // close connection int cs = closesocket(newsockfd); if (s_debug_cli) - log_it(L_DEBUG, "close connection=%d sockfd=%d", cs, newsockfd); + log_it(L_DEBUG, "close connection=%d sockfd=%"DAP_FORMAT_SOCKET, cs, newsockfd); return NULL; } @@ -408,6 +415,7 @@ static void* thread_one_client_func(void *args) */ char *p_get_next_str( HANDLE hPipe, int *dwLen, const char *stop_str, bool del_stop_str, int timeout ) { + UNUSED(timeout); bool bSuccess = false; long nRecv = 0; // count of bytes received size_t stop_str_len = (stop_str) ? strlen(stop_str) : 0; @@ -480,7 +488,6 @@ char *p_get_next_str( HANDLE hPipe, int *dwLen, const char *stop_str, bool del_s return NULL; } - /** * @brief thread_pipe_client_func * threading function for processing a request from a client @@ -493,7 +500,7 @@ static void *thread_pipe_client_func( void *args ) // SOCKET newsockfd = (SOCKET) (intptr_t) args; if(s_debug_cli) - log_it(L_INFO, "new connection pipe = %X", hPipe ); + log_it(L_INFO, "new connection pipe = %p", hPipe); int str_len, marker = 0; int timeout = 5000; // 5 sec @@ -573,8 +580,13 @@ static void *thread_pipe_client_func( void *args ) char **l_argv = dap_strsplit( str_cmd, ";", -1 ); // Call the command function - if ( l_cmd && l_argv && l_cmd->func ) - res = (* (l_cmd->func))( argc, l_argv, NULL, &str_reply ); + if ( l_cmd && l_argv && l_cmd->func ) { + if (l_cmd->arg_func) { + res = l_cmd->func_ex(argc, l_argv, l_cmd->arg_func, &str_reply); + } else { + res = l_cmd->func(argc, l_argv, &str_reply); + } + } else if ( l_cmd ) { log_it(L_WARNING,"NULL arguments for input for command \"%s\"", str_cmd ); @@ -622,7 +634,7 @@ static void *thread_pipe_client_func( void *args ) // close connection // int cs = closesocket(newsockfd); - log_it( L_INFO, "close connection pipe = %X", hPipe ); + log_it( L_INFO, "close connection pipe = %p", hPipe ); FlushFileBuffers( hPipe ); DisconnectNamedPipe( hPipe ); @@ -640,9 +652,10 @@ static void *thread_pipe_client_func( void *args ) */ static void* thread_pipe_func( void *args ) { + UNUSED(args); BOOL fConnected = FALSE; pthread_t threadId; - HANDLE hPipe = INVALID_HANDLE_VALUE, hThread = NULL; + HANDLE hPipe = INVALID_HANDLE_VALUE; static const char *cPipeName = "\\\\.\\pipe\\node_cli.pipe"; for (;;) @@ -662,7 +675,7 @@ static void* thread_pipe_func( void *args ) NULL ); // default security attribute if ( hPipe == INVALID_HANDLE_VALUE ) { - log_it( L_ERROR, "CreateNamedPipe failed, GLE = %d.\n", GetLastError() ); + log_it( L_ERROR, "CreateNamedPipe failed, GLE = %lu.\n", GetLastError() ); return NULL; } @@ -670,7 +683,7 @@ static void* thread_pipe_func( void *args ) if ( fConnected ) { - log_it( L_INFO, "Client %X connected, creating a processing thread.\n", hPipe ); + log_it( L_INFO, "Client %p connected, creating a processing thread.\n", hPipe ); pthread_create( &threadId, NULL, thread_pipe_client_func, hPipe ); pthread_detach( threadId ); @@ -683,6 +696,7 @@ static void* thread_pipe_func( void *args ) } #endif + /** * @brief thread_main_func * main threading server function @@ -703,7 +717,7 @@ static void* thread_main_func(void *args) socklen_t size = sizeof(peer); // received a new connection request if((newsockfd = accept(sockfd, (struct sockaddr*) &peer, &size)) == (SOCKET) -1) { - log_it(L_ERROR, "new connection break newsockfd=%d", newsockfd); + log_it(L_ERROR, "new connection break newsockfd=%"DAP_FORMAT_SOCKET, newsockfd); break; } // create child thread for a client connection @@ -713,10 +727,11 @@ static void* thread_main_func(void *args) }; // close connection int cs = closesocket(sockfd); - log_it(L_INFO, "Exit server thread=%d socket=%d", cs, sockfd); + log_it(L_INFO, "Exit server thread=%d socket=%"DAP_FORMAT_SOCKET, cs, sockfd); return NULL; } + /** * @brief dap_chain_node_cli_set_reply_text * Write text to reply string @@ -765,6 +780,7 @@ int dap_chain_node_cli_check_option( char** argv, int arg_start, int arg_end, co return -1; } + /** * @brief dap_chain_node_cli_find_option_val * return index of string in argv, or 0 if not found @@ -817,14 +833,18 @@ int dap_chain_node_cli_find_option_val( char** argv, int arg_start, int arg_end, * @param doc_ex * @return */ -void dap_chain_node_cli_cmd_item_create(const char * a_name, cmdfunc_t *a_func, void *a_arg_func, const char *a_doc, const char *a_doc_ex) +void dap_chain_node_cli_cmd_item_create_ex(const char * a_name, cmdfunc_ex_t *a_func, void *a_arg_func, const char *a_doc, const char *a_doc_ex) { dap_chain_node_cmd_item_t *l_cmd_item = DAP_NEW_Z(dap_chain_node_cmd_item_t); dap_snprintf(l_cmd_item->name,sizeof (l_cmd_item->name),"%s",a_name); l_cmd_item->doc = strdup( a_doc); l_cmd_item->doc_ex = strdup( a_doc_ex); - l_cmd_item->func = a_func; - l_cmd_item->arg_func = a_arg_func; + if (a_arg_func) { + l_cmd_item->func_ex = a_func; + l_cmd_item->arg_func = a_arg_func; + } else { + l_cmd_item->func = (cmdfunc_t *)(void *)a_func; + } HASH_ADD_STR(s_commands,name,l_cmd_item); log_it(L_DEBUG,"Added command %s",l_cmd_item->name); } @@ -867,7 +887,6 @@ dap_chain_node_cmd_item_t* dap_chain_node_cli_cmd_find(const char *a_name) * @brief dap_chain_node_cli_init * Initialization of the server side of the interaction * with the console kelvin-node-cli - * * init commands description * return 0 if OK, -1 error * @param g_config @@ -904,13 +923,13 @@ int dap_chain_node_cli_init(dap_config_t * g_config) } #endif - dap_chain_node_cli_cmd_item_create("global_db", com_global_db, NULL, "Work with global database", + dap_chain_node_cli_cmd_item_create("global_db", com_global_db, "Work with global database", "global_db cells add -cell <cell id> \n" "global_db flush \n\n" // "global_db wallet_info set -addr <wallet address> -cell <cell id> \n\n" ); - dap_chain_node_cli_cmd_item_create("node", com_node, NULL, "Work with node", + dap_chain_node_cli_cmd_item_create("node", com_node, "Work with node", "node add -net <net name> -addr {<node address> | -alias <node alias>} {-port <port>} -cell <cell id> {-ipv4 <ipv4 external address> | -ipv6 <ipv6 external address>}\n\n" "node del -net <net name> -addr <node address> | -alias <node alias>\n\n" "node link {add|del} -net <net name> {-addr <node address> | -alias <node alias>} -link <node address>\n\n" @@ -919,32 +938,32 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "node handshake {<node address> | -alias <node alias>}\n" "node dump -net <net name> [ -addr <node address> | -alias <node alias>] [-full]\n\n" ); - dap_chain_node_cli_cmd_item_create ("ping", com_ping, NULL, "Send ICMP ECHO_REQUEST to network hosts", + dap_chain_node_cli_cmd_item_create ("ping", com_ping, "Send ICMP ECHO_REQUEST to network hosts", "ping [-c <count>] host\n"); - dap_chain_node_cli_cmd_item_create ("traceroute", com_traceroute, NULL, "Print the hops and time of packets trace to network host", + dap_chain_node_cli_cmd_item_create ("traceroute", com_traceroute, "Print the hops and time of packets trace to network host", "traceroute host\n"); - dap_chain_node_cli_cmd_item_create ("tracepath", com_tracepath, NULL, "Traces path to a network host along this path", + dap_chain_node_cli_cmd_item_create ("tracepath", com_tracepath,"Traces path to a network host along this path", "tracepath host\n"); - dap_chain_node_cli_cmd_item_create ("version", com_version, NULL, "Return software version", + dap_chain_node_cli_cmd_item_create ("version", com_version, "Return software version", "version\n" "\tReturn version number\n" ); - dap_chain_node_cli_cmd_item_create ("help", com_help, NULL, "Description of command parameters", + dap_chain_node_cli_cmd_item_create ("help", com_help, "Description of command parameters", "help [<command>]\n" "\tObtain help for <command> or get the total list of the commands\n" ); - dap_chain_node_cli_cmd_item_create ("?", com_help, NULL, "Synonym for \"help\"", + dap_chain_node_cli_cmd_item_create ("?", com_help, "Synonym for \"help\"", "? [<command>]\n" "\tObtain help for <command> or get the total list of the commands\n" ); - dap_chain_node_cli_cmd_item_create("wallet", com_tx_wallet, NULL, "Wallet operations", + dap_chain_node_cli_cmd_item_create("wallet", com_tx_wallet, "Wallet operations", "wallet [new -w <wallet_name> [-sign <sign_type>] [-restore <hex value>] [-net <net_name>] [-force]| list | info -addr <addr> -w <wallet_name> -net <net_name>]\n"); // Token commands - dap_chain_node_cli_cmd_item_create ("token_update", com_token_update, NULL, "Token update", + dap_chain_node_cli_cmd_item_create ("token_update", com_token_update, "Token update", "\nPrivate token update\n" - "\t token_update -net <net name> -chain <chain name> -token <token ticker> -type private [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n" + "\t token_update -net <net name> -chain <chain name> -token <token ticker> [-type private] [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n" "\t Update private token <token ticker> for <netname>:<chain name> with" "\t custom parameters list <Param 1>, <Param 2>...<Param N>." "\n" @@ -992,7 +1011,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "\n" ); // Token commands - dap_chain_node_cli_cmd_item_create ("token_decl", com_token_decl, NULL, "Token declaration", + dap_chain_node_cli_cmd_item_create ("token_decl", com_token_decl, "Token declaration", "Simple token declaration:\n" "\t token_decl -net <net name> -chain <chain name> -token <token ticker> -total_supply <total supply> -signs_total <sign total> -signs_emission <signs for emission> -certs <certs list>\n" "\t Declare new simple token for <netname>:<chain name> with ticker <token ticker>, maximum emission <total supply> and <signs for emission> from <signs total> signatures on valid emission\n" @@ -1031,73 +1050,74 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "\n" ); - dap_chain_node_cli_cmd_item_create ("token_decl_sign", com_token_decl_sign, NULL, "Token declaration add sign", + dap_chain_node_cli_cmd_item_create ("token_decl_sign", com_token_decl_sign, "Token declaration add sign", "token_decl_sign -net <net name> -chain <chain name> -datum <datum_hash> -certs <certs list>\n" "\t Sign existent <datum hash> in mempool with <certs list>\n" ); - dap_chain_node_cli_cmd_item_create ("token_emit", com_token_emit, NULL, "Token emission", + dap_chain_node_cli_cmd_item_create ("token_emit", com_token_emit, "Token emission", "token_emit -net <net name> -chain_emission <chain for emission> -chain_base_tx <chain for base tx> -addr <addr> -token <token ticker> -certs <cert> -emission_value <val>\n"); - dap_chain_node_cli_cmd_item_create ("mempool_list", com_mempool_list, NULL, "List mempool entries for selected chain network and chain id", - "mempool_list -net <net name> -chain <chain name>\n"); + dap_chain_node_cli_cmd_item_create ("mempool_list", com_mempool_list, "List mempool entries for selected chain network", + "mempool_list -net <net name>\n"); - dap_chain_node_cli_cmd_item_create ("mempool_proc", com_mempool_proc, NULL, "Proc mempool entries for selected chain network and chain id", - "mempool_proc -net <net name> -chain <chain name> -datum <datum hash>\n"); + dap_chain_node_cli_cmd_item_create ("mempool_proc", com_mempool_proc, "Proc mempool entrie with specified hash for selected chain network", + "mempool_proc -net <net name> -datum <datum hash>\n"); - dap_chain_node_cli_cmd_item_create ("mempool_delete", com_mempool_delete, NULL, "Delete datum with hash <datum hash>", - "mempool_delete -net <net name> -chain <chain name> -datum <datum hash>\n"); + dap_chain_node_cli_cmd_item_create ("mempool_delete", com_mempool_delete, "Delete datum with hash <datum hash> for selected chain network", + "mempool_delete -net <net name> -datum <datum hash>\n"); - dap_chain_node_cli_cmd_item_create ("mempool_add_ca", com_mempool_add_ca, NULL, + dap_chain_node_cli_cmd_item_create ("mempool_add_ca", com_mempool_add_ca, "Add pubic certificate into the mempool to prepare its way to chains", "mempool_add_ca -net <net name> [-chain <chain name>] -ca_name <Certificate name>\n"); // Transaction commands - dap_chain_node_cli_cmd_item_create ("tx_create", com_tx_create, NULL, "Make transaction", + dap_chain_node_cli_cmd_item_create ("tx_create", com_tx_create, "Make transaction", "tx_create -net <net name> -chain <chain name> -from_wallet <name> -to_addr <addr> -token <token ticker> -value <value> [-fee <addr> -value_fee <val>]\n" ); - dap_chain_node_cli_cmd_item_create ("tx_cond_create", com_tx_cond_create, NULL, "Make cond transaction", + dap_chain_node_cli_cmd_item_create ("tx_cond_create", com_tx_cond_create, "Make cond transaction", "tx_cond_create -net <net name> -token <token_ticker> -wallet_f <wallet_from> -wallet_t <wallet_to>" "-value <value_datoshi> -unit <mb|kb|b|sec|day> -service <vpn>\n" ); - dap_chain_node_cli_cmd_item_create ("tx_verify", com_tx_verify, NULL, "Verifing transaction", + dap_chain_node_cli_cmd_item_create ("tx_verify", com_tx_verify, "Verifing transaction", "tx_verify -wallet <wallet name> \n" ); // Transaction history - dap_chain_node_cli_cmd_item_create("tx_history", com_tx_history, NULL, "Transaction history (for address or by hash)", + dap_chain_node_cli_cmd_item_create("tx_history", com_tx_history, "Transaction history (for address or by hash)", "tx_history [-addr <addr> | -w <wallet name> | -tx <tx_hash>] -net <net name> -chain <chain name>\n"); // Ledger info - dap_chain_node_cli_cmd_item_create("ledger", com_ledger, NULL, "Ledger info", + dap_chain_node_cli_cmd_item_create("ledger", com_ledger, "Ledger info", "ledger list coins -net <network name>\n" "ledger list coins_cond -net <network name>\n" "ledger list addrs -net <network name>\n" "ledger tx [all | -addr <addr> | -w <wallet name> | -tx <tx_hash>] [-chain <chain name>] -net <network name>\n"); // Token info - dap_chain_node_cli_cmd_item_create("token", com_token, NULL, "Token info", + dap_chain_node_cli_cmd_item_create("token", com_token, "Token info", "token list -net <network name>\n" - "token tx all name <token name> -net <network name> [-page_start <page>] [-page <page>]\n"); + "token info -net <network name> -name <token name>\n" + "token tx [all | -addr <wallet_addr> | -wallet <wallet_name>] -name <token name> -net <network name> [-page_start <page>] [-page <page>]\n"); // Log - dap_chain_node_cli_cmd_item_create ("print_log", com_print_log, NULL, "Print log info", + dap_chain_node_cli_cmd_item_create ("print_log", com_print_log, "Print log info", "print_log [ts_after <timestamp >] [limit <line numbers>]\n" ); // Statisticss - dap_chain_node_cli_cmd_item_create("stats", com_stats, NULL, "Print statistics", + dap_chain_node_cli_cmd_item_create("stats", com_stats, "Print statistics", "stats cpu"); // Exit - dap_chain_node_cli_cmd_item_create ("exit", com_exit, NULL, "Stop application and exit", + dap_chain_node_cli_cmd_item_create ("exit", com_exit, "Stop application and exit", "exit\n" ); // Export GDB to JSON - dap_chain_node_cli_cmd_item_create("gdb_export", cmd_gdb_export, NULL, "Export gdb to JSON", + dap_chain_node_cli_cmd_item_create("gdb_export", cmd_gdb_export, "Export gdb to JSON", "gdb_export filename <filename without extension>"); //Import GDB from JSON - dap_chain_node_cli_cmd_item_create("gdb_import", cmd_gdb_import, NULL, "Import gdb from JSON", + dap_chain_node_cli_cmd_item_create("gdb_import", cmd_gdb_import, "Import gdb from JSON", "gdb_import filename <filename without extension>"); // create thread for waiting of clients @@ -1114,7 +1134,9 @@ int dap_chain_node_cli_init(dap_config_t * g_config) if ( l_listen_unix_socket_path && l_listen_unix_socket_permissions ) { if ( l_listen_unix_socket_permissions_str ) { - dap_sscanf(l_listen_unix_socket_permissions_str,"%ou", &l_listen_unix_socket_permissions ); + uint16_t l_perms; + dap_sscanf(l_listen_unix_socket_permissions_str,"%hu", &l_perms); + l_listen_unix_socket_permissions = l_perms; } log_it( L_INFO, "Console interace on path %s (%04o) ", l_listen_unix_socket_path, l_listen_unix_socket_permissions ); @@ -1221,13 +1243,14 @@ int dap_chain_node_cli_init(dap_config_t * g_config) return 0; } + /** + * @brief dap_chain_node_cli_delete * Deinitialization of the server side - * */ void dap_chain_node_cli_delete(void) { - if(server_sockfd >= 0) + if(server_sockfd != INVALID_SOCKET) closesocket(server_sockfd); #ifdef __WIN32 WSACleanup(); diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index f73e975f7cff3df62e84eb349914690cf552f3d0..815826f3db26d45c22afb67b0c43a36ae22cb6e4 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -132,6 +132,7 @@ dap_chain_node_addr_t* dap_chain_node_addr_get_by_alias(dap_chain_net_t * a_net, return l_addr; } + /** * @brief dap_list_t* get_aliases_by_name Get the aliases by name object * Find in base alias by addr @@ -174,8 +175,7 @@ static dap_list_t* get_aliases_by_name(dap_chain_net_t * l_net, dap_chain_node_a * @param a_alias_str * @return dap_chain_node_addr_t* */ -static dap_chain_node_addr_t* s_node_info_get_addr(dap_chain_net_t * a_net, dap_chain_node_info_t *a_node_info, - dap_chain_node_addr_t *a_addr, const char *a_alias_str) +static dap_chain_node_addr_t* s_node_info_get_addr(dap_chain_net_t * a_net, dap_chain_node_addr_t *a_addr, const char *a_alias_str) { dap_chain_node_addr_t *l_address = NULL; if(a_alias_str && !a_addr->uint64) { @@ -188,6 +188,7 @@ static dap_chain_node_addr_t* s_node_info_get_addr(dap_chain_net_t * a_net, dap_ return l_address; } + /** * @brief node_info_read_and_reply * Read node from base @@ -215,8 +216,8 @@ static dap_chain_node_info_t* node_info_read_and_reply(dap_chain_net_t * a_net, DAP_DELETE(l_key); return NULL; } - if(!node_info->hdr.ext_port) - node_info->hdr.ext_port = 8079; + /* if(!node_info->hdr.ext_port) + node_info->hdr.ext_port = 8079; */ size_t node_info_size_must_be = dap_chain_node_info_get_size(node_info); if(node_info_size_must_be != node_info_size) { dap_chain_node_cli_set_reply_text(a_str_reply, "node has bad size in base=%u (must be %u)", node_info_size, @@ -226,29 +227,19 @@ static dap_chain_node_info_t* node_info_read_and_reply(dap_chain_net_t * a_net, return NULL; } -// dap_chain_node_info_t *node_info = dap_chain_node_info_deserialize(str, (str) ? strlen(str) : 0); -// if(!node_info) { -// set_reply_text(str_reply, "node has invalid format in base"); -// } -// DAP_DELETE(str); DAP_DELETE(l_key); return node_info; } + /** - * @brief node_info_add_with_reply - * Handler of command 'global_db node add' - * - * str_reply[out] for reply - * return 0 Ok, -1 error + * @brief node_info_save_and_reply + * Save node to base * @param a_net * @param a_node_info - * @param a_alias_str - * @param a_cell_str - * @param a_ipv4_str - * @param a_ipv6_str - * @param a_str_reply - * @return int + * @param str_reply + * @return true + * @return false */ static bool node_info_save_and_reply(dap_chain_net_t * a_net, dap_chain_node_info_t *a_node_info, char **str_reply) { @@ -279,6 +270,7 @@ static bool node_info_save_and_reply(dap_chain_net_t * a_net, dap_chain_node_inf return res; } + /** * @brief node_info_add_with_reply * Handler of command 'global_db node add' @@ -339,11 +331,10 @@ static int node_info_add_with_reply(dap_chain_net_t * a_net, dap_chain_node_info return -1; } + /** * @brief node_info_del_with_reply * Handler of command 'global_db node add' - * - * str_reply[out] for reply * @param a_net * @param a_node_info * @param alias_str @@ -366,7 +357,7 @@ static int node_info_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_info } // find addr by alias or addr_str - dap_chain_node_addr_t *address = s_node_info_get_addr(a_net, a_node_info, &a_node_info->hdr.address, alias_str); + dap_chain_node_addr_t *address = s_node_info_get_addr(a_net, &a_node_info->hdr.address, alias_str); if(!address) { dap_chain_node_cli_set_reply_text(str_reply, "alias not found"); return -1; @@ -405,10 +396,10 @@ static int node_info_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_info return -1; } + /** * @brief link_add_or_del_with_reply * Handler of command 'global_db node link' - * * cmd 'add' or 'del' * str_reply[out] for reply * return 0 Ok, -1 error @@ -439,7 +430,7 @@ static int link_add_or_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_in #endif // find addr by alias or addr_str - dap_chain_node_addr_t *l_address = s_node_info_get_addr(a_net, a_node_info, &a_node_info->hdr.address, a_alias_str); + dap_chain_node_addr_t *l_address = s_node_info_get_addr(a_net, &a_node_info->hdr.address, a_alias_str); if(!l_address) { dap_chain_node_cli_set_reply_text(a_str_reply, "alias not found"); return -1; @@ -524,18 +515,15 @@ static int link_add_or_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_in return -1; } + /** - * Handler of command 'node dump' * @brief node_info_dump_with_reply Handler of command 'node dump' - * - * str_reply[out] for reply - * return 0 Ok, -1 error * @param a_net * @param a_addr * @param a_is_full * @param a_alias * @param a_str_reply - * @return int + * @return int 0 Ok, -1 error */ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_addr_t * a_addr, bool a_is_full, const char *a_alias, char **a_str_reply) @@ -605,7 +593,7 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add // set short reply with node param if(!a_is_full) dap_string_append_printf(l_string_reply, - "node address "NODE_ADDR_FP_STR"\tcell 0x%016llx\tipv4 %s\tport: %s\tnumber of links %u", + "node address "NODE_ADDR_FP_STR"\tcell 0x%016"DAP_UINT64_FORMAT_x"\tipv4 %s\tport: %s\tnumber of links %u", NODE_ADDR_FP_ARGS_S(node_info_read->hdr.address), node_info_read->hdr.cell_id.uint64, str_ip4, node_info_read->hdr.ext_port ? l_port_str : "default", @@ -613,7 +601,7 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add else // set full reply with node param dap_string_append_printf(l_string_reply, - "node address " NODE_ADDR_FP_STR "\ncell 0x%016llx\nipv4 %s\nipv6 %s\nport: %s%s\nlinks %u%s", + "node address " NODE_ADDR_FP_STR "\ncell 0x%016"DAP_UINT64_FORMAT_x"\nipv4 %s\nipv6 %s\nport: %s%s\nlinks %u%s", NODE_ADDR_FP_ARGS_S(node_info_read->hdr.address), node_info_read->hdr.cell_id.uint64, str_ip4, str_ip6, @@ -626,7 +614,7 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add DAP_DELETE(l_addr); DAP_DELETE(node_info_read); - } else { // Dump list + } else { // Dump list with !a_addr && !a_alias dap_global_db_obj_t *l_objs = NULL; size_t l_nodes_count = 0; dap_string_append(l_string_reply, "\n"); @@ -640,28 +628,13 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add dap_chain_global_db_objs_delete(l_objs, l_nodes_count); return -1; } else { - size_t l_nodes_count_real = 0; - dap_string_append_printf(l_string_reply, "Got %u records:\n", l_nodes_count); + dap_string_append_printf(l_string_reply, "Got %zu records:\n", l_nodes_count); for(size_t i = 0; i < l_nodes_count; i++) { dap_chain_node_info_t *l_node_info = (dap_chain_node_info_t *) l_objs[i].value; - // find addr by alias or addr_str - dap_chain_node_addr_t *address = s_node_info_get_addr(a_net, l_node_info, &l_node_info->hdr.address, a_alias); - if(!address) { - dap_chain_node_cli_set_reply_text(a_str_reply, "alias not found"); - dap_string_free(l_string_reply, true); - dap_chain_global_db_objs_delete(l_objs, l_nodes_count); - return -1; - } // read node - dap_chain_node_info_t *node_info_read = node_info_read_and_reply(a_net, address, NULL); - if(!node_info_read) { - DAP_DELETE(address); + dap_chain_node_info_t *node_info_read = node_info_read_and_reply(a_net, &l_node_info->hdr.address, NULL); + if (!node_info_read) continue; - //dap_string_free(l_string_reply, true); - //dap_chain_global_db_objs_delete(l_objs, l_nodes_count); - //return -1; - } - const int hostlen = 128; char *host4 = (char*) alloca(hostlen); char *host6 = (char*) alloca(hostlen); @@ -673,7 +646,7 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add // get aliases in form of string dap_string_t *aliases_string = dap_string_new(NULL); - dap_list_t *list_aliases = get_aliases_by_name(a_net, address); + dap_list_t *list_aliases = get_aliases_by_name(a_net, &node_info_read->hdr.address); if(list_aliases) { dap_list_t *list = list_aliases; @@ -703,7 +676,7 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add // set short reply with node param if(!a_is_full) dap_string_append_printf(l_string_reply, - "node address "NODE_ADDR_FP_STR"\tcell 0x%016llx\tipv4 %s\tport: %s\tnumber of links %u", + "node address "NODE_ADDR_FP_STR"\tcell 0x%016"DAP_UINT64_FORMAT_x"\tipv4 %s\tport: %s\tnumber of links %u", NODE_ADDR_FP_ARGS_S(node_info_read->hdr.address), node_info_read->hdr.cell_id.uint64, str_ip4, node_info_read->hdr.ext_port ? l_port_str : "default", @@ -711,7 +684,7 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add else // set full reply with node param dap_string_append_printf(l_string_reply, - "node address " NODE_ADDR_FP_STR "\ncell 0x%016llx\nipv4 %s\nipv6 %s\nport: %s%s\nlinks %u%s", + "node address " NODE_ADDR_FP_STR "\ncell 0x%016"DAP_UINT64_FORMAT_x"\nipv4 %s\nipv6 %s\nport: %s%s\nlinks %u%s", NODE_ADDR_FP_ARGS_S(node_info_read->hdr.address), node_info_read->hdr.cell_id.uint64, str_ip4, str_ip6, @@ -720,8 +693,6 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add node_info_read->hdr.links_number, links_string->str); dap_string_free(aliases_string, true); dap_string_free(links_string, true); - - DAP_DELETE(address); DAP_DELETE(node_info_read); } } @@ -735,7 +706,6 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add /** * @brief com_global_db * global_db command - * * @param a_argc * @param a_argv * @param arg_func @@ -743,7 +713,7 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add * @return int * return 0 OK, -1 Err */ -int com_global_db(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply) +int com_global_db(int a_argc, char ** a_argv, char **a_str_reply) { enum { CMD_NONE, CMD_NAME_CELL, CMD_ADD, CMD_FLUSH @@ -854,7 +824,7 @@ int com_global_db(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply /** * Node command */ -int com_node(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply) +int com_node(int a_argc, char ** a_argv, char **a_str_reply) { enum { CMD_NONE, CMD_ADD, CMD_DEL, CMD_LINK, CMD_ALIAS, CMD_HANDSHAKE, CMD_CONNECT, CMD_DUMP @@ -1116,7 +1086,7 @@ int com_node(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply) } log_it(L_NOTICE, "Stream connection established"); - dap_stream_ch_chain_sync_request_t l_sync_request = { { 0 } }; + dap_stream_ch_chain_sync_request_t l_sync_request = {}; dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, dap_stream_ch_chain_get_id()); // fill begin id l_sync_request.id_start = 1; @@ -1280,12 +1250,12 @@ int com_node(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply) DAP_DELETE(address_tmp); } else { - dap_chain_node_cli_set_reply_text(a_str_reply, "no address found by alias"); + dap_chain_node_cli_set_reply_text(a_str_reply, "No address found by alias"); return -4; } } if(!l_node_addr.uint64) { - dap_chain_node_cli_set_reply_text(a_str_reply, "addr not found"); + dap_chain_node_cli_set_reply_text(a_str_reply, "Addr not found"); return -5; } @@ -1296,14 +1266,14 @@ int com_node(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply) // start handshake dap_chain_node_client_t *client = dap_chain_node_client_connect(l_net,node_info); if(!client) { - dap_chain_node_cli_set_reply_text(a_str_reply, "can't connect"); + dap_chain_node_cli_set_reply_text(a_str_reply, "Can't connect"); DAP_DELETE(node_info); return -7; } // wait handshake int res = dap_chain_node_client_wait(client, NODE_CLIENT_STATE_ESTABLISHED, timeout_ms); - if(res != 1) { - dap_chain_node_cli_set_reply_text(a_str_reply, "no response from node"); + if (res) { + dap_chain_node_cli_set_reply_text(a_str_reply, "No response from node"); // clean client struct dap_chain_node_client_close(client); DAP_DELETE(node_info); @@ -1317,23 +1287,22 @@ int com_node(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply) { case -1: dap_chain_node_client_close(client); - dap_chain_node_cli_set_reply_text(a_str_reply, "connection established, but not saved"); + dap_chain_node_cli_set_reply_text(a_str_reply, "Connection established, but not saved"); return -9; case -2: dap_chain_node_client_close(client); - dap_chain_node_cli_set_reply_text(a_str_reply, "connection already present"); + dap_chain_node_cli_set_reply_text(a_str_reply, "Connection already present"); return -10; } - dap_chain_node_cli_set_reply_text(a_str_reply, "connection established"); + dap_chain_node_cli_set_reply_text(a_str_reply, "Connection established"); } break; } return 0; } + /** - * Traceroute command - * * @brief Traceroute command * return 0 OK, -1 Err * @param argc @@ -1342,7 +1311,7 @@ int com_node(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply) * @param str_reply * @return int */ -int com_traceroute(int argc, char** argv, void *arg_func, char **str_reply) +int com_traceroute(int argc, char** argv, char **str_reply) { #ifdef DAP_OS_LINUX const char *addr = NULL; @@ -1413,15 +1382,17 @@ int com_traceroute(int argc, char** argv, void *arg_func, char **str_reply) } return res; #else + UNUSED(argc); + UNUSED(argv); dap_chain_node_cli_set_reply_text(str_reply, "Not realized for your platform"); return -1; #endif } + /** * @brief com_tracepath * Tracepath command - * * @param argc * @param argv * @param arg_func @@ -1429,7 +1400,7 @@ int com_traceroute(int argc, char** argv, void *arg_func, char **str_reply) * @return int * return 0 OK, -1 Err */ -int com_tracepath(int argc, char** argv, void *arg_func, char **str_reply) +int com_tracepath(int argc, char** argv, char **str_reply) { #ifdef DAP_OS_LINUX const char *addr = NULL; @@ -1495,14 +1466,15 @@ int com_tracepath(int argc, char** argv, void *arg_func, char **str_reply) } return res; #else - dap_chain_node_cli_set_reply_text(str_reply, "Not realized for your platform"); - return -1; + UNUSED(argc); + UNUSED(argv); + dap_chain_node_cli_set_reply_text(str_reply, "Not realized for your platform"); + return -1; #endif } + /** - * Ping command - * * @brief Ping command * return 0 OK, -1 Err * @param argc @@ -1511,7 +1483,7 @@ int com_tracepath(int argc, char** argv, void *arg_func, char **str_reply) * @param str_reply * @return int */ -int com_ping(int argc, char** argv, void *arg_func, char **str_reply) +int com_ping(int argc, char** argv, char **str_reply) { #ifdef DAP_OS_LINUX @@ -1567,8 +1539,10 @@ int com_ping(int argc, char** argv, void *arg_func, char **str_reply) } return res; #else - dap_chain_node_cli_set_reply_text(str_reply, "Not realized for your platform"); - return -1; + UNUSED(argc); + UNUSED(argv); + dap_chain_node_cli_set_reply_text(str_reply, "Not realized for your platform"); + return -1; #endif } @@ -1580,11 +1554,10 @@ int com_ping(int argc, char** argv, void *arg_func, char **str_reply) * @param str_reply * @return */ -int com_version(int argc, char ** argv, void *arg_func, char **str_reply) +int com_version(int argc, char ** argv, char **str_reply) { (void) argc; (void) argv; - (void) arg_func; #ifndef DAP_VERSION #pragma message "[!WRN!] DAP_VERSION IS NOT DEFINED. Manual override engaged." #define DAP_VERSION 0.9-15 @@ -1604,7 +1577,7 @@ int com_version(int argc, char ** argv, void *arg_func, char **str_reply) * @param str_reply * @return int */ -int com_help(int argc, char ** argv, void *arg_func, char **str_reply) +int com_help(int argc, char ** argv, char **str_reply) { if(argc > 1) { log_it(L_DEBUG, "Help for command %s", argv[1]); @@ -1621,7 +1594,6 @@ int com_help(int argc, char ** argv, void *arg_func, char **str_reply) log_it(L_DEBUG, "General help requested"); dap_string_t * l_help_list_str = dap_string_new(NULL); dap_chain_node_cmd_item_t *l_cmd = dap_chain_node_cli_cmd_get_first(); - dap_string_printf(l_help_list_str, ""); while(l_cmd) { dap_string_append_printf(l_help_list_str, "%s:\t\t\t%s\n", l_cmd->name, l_cmd->doc ? l_cmd->doc : "(undocumented command)"); @@ -1634,9 +1606,8 @@ int com_help(int argc, char ** argv, void *arg_func, char **str_reply) } } + /** - * com_tx_create command - * * @brief com_tx_wallet * Wallet info * com_tx_create command @@ -1646,7 +1617,7 @@ int com_help(int argc, char ** argv, void *arg_func, char **str_reply) * @param str_reply * @return int */ -int com_tx_wallet(int argc, char ** argv, void *arg_func, char **str_reply) +int com_tx_wallet(int argc, char ** argv, char **str_reply) { const char *c_wallets_path = dap_chain_wallet_get_path(g_config); // Get address of wallet @@ -1668,7 +1639,7 @@ int com_tx_wallet(int argc, char ** argv, void *arg_func, char **str_reply) arg_index++; if(cmd_num == CMD_NONE) { dap_chain_node_cli_set_reply_text(str_reply, - "format of command: wallet [new -w <wallet_name> | list | info [<-addr <addr>]|[-w <wallet_name> -net <net_name>]"); + "Format of command: wallet [new -w <wallet_name> | list | info [<-addr <addr>]|[-w <wallet_name> -net <net_name>]"); return -1; } @@ -1692,14 +1663,14 @@ int com_tx_wallet(int argc, char ** argv, void *arg_func, char **str_reply) int l_is_force = dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-force", NULL); if(!l_wallet_name) { - dap_chain_node_cli_set_reply_text(str_reply, "wallet name option <-w> not defined"); + dap_chain_node_cli_set_reply_text(str_reply, "Wallet name option <-w> not defined"); return -1; } // check wallet existence if(!l_is_force) { dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_name, c_wallets_path); if(l_wallet) { - dap_chain_node_cli_set_reply_text(str_reply, "wallet already exists"); + dap_chain_node_cli_set_reply_text(str_reply, "Wallet already exists"); dap_chain_wallet_close(l_wallet); return -1; } @@ -1727,6 +1698,8 @@ int com_tx_wallet(int argc, char ** argv, void *arg_func, char **str_reply) DAP_DELETE(l_seed); l_seed = NULL; l_seed_size = 0; + dap_chain_node_cli_set_reply_text(str_reply, "Resrote hash is invalid, wallet is not created"); + return -1; } } // Creates new wallet @@ -1734,14 +1707,15 @@ int com_tx_wallet(int argc, char ** argv, void *arg_func, char **str_reply) l_seed, l_seed_size); dap_chain_addr_t *l_addr = l_net? dap_chain_wallet_get_addr(l_wallet,l_net->pub.id ) : NULL; if(!l_wallet) { - dap_chain_node_cli_set_reply_text(str_reply, "wallet is not created"); + dap_chain_node_cli_set_reply_text(str_reply, "Wallet is not created besause of internal error"); return -1; } char *l_addr_str = l_addr? dap_chain_addr_to_str(l_addr) : NULL; - dap_string_append_printf(l_string_ret, "wallet '%s' (type=%s) successfully created\n", l_wallet->name, l_sign_type_str); - if ( l_addr_str ) + dap_string_append_printf(l_string_ret, "Wallet '%s' (type=%s) successfully created\n", l_wallet->name, l_sign_type_str); + if ( l_addr_str ) { dap_string_append_printf(l_string_ret, "new address %s", l_addr_str); - DAP_DELETE(l_addr_str); + DAP_DELETE(l_addr_str); + } dap_chain_wallet_close(l_wallet); } break; @@ -1922,7 +1896,7 @@ int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index, int argc, ch * @param str_reply * @return */ -int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_reply) +int com_token_decl_sign(int argc, char ** argv, char ** a_str_reply) { int arg_index = 1; @@ -2001,65 +1975,56 @@ int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_re if(l_datum->header.type_id == DAP_CHAIN_DATUM_TOKEN_DECL) { dap_chain_datum_token_t * l_datum_token = (dap_chain_datum_token_t *) l_datum->data; size_t l_datum_token_size = l_datum->header.data_size; - size_t l_signs_size = l_datum_token_size - sizeof(l_datum_token->header_private); - + if (l_datum_token->header_private.signs_valid == l_datum_token->header_private.signs_total) { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Datum %s with datum token has all signs on board. Can't add anything to it", l_datum_hash_out_str); + DAP_DELETE(l_datum); + DAP_DELETE(l_gdb_group_mempool); + return -7; + } // Check for signatures, are they all in set and are good enought? - size_t l_signs_count = 0; - - for(size_t l_offset = 0; l_offset < l_signs_size; l_signs_count++) { - dap_sign_t * l_sign = (dap_sign_t *) l_datum_token->data_n_tsd + l_offset; - l_offset += dap_sign_get_size(l_sign); + size_t l_signs_size = 0, i = 1; + do { + dap_sign_t *l_sign = (dap_sign_t *)l_datum_token->data_n_tsd + l_signs_size; if( dap_sign_verify(l_sign, l_datum_token, sizeof(l_datum_token->header_private)) != 1) { - log_it(L_WARNING, "Wrong signature %u for datum_token with key %s in mempool!", l_signs_count, l_datum_hash_out_str); + log_it(L_WARNING, "Wrong signature %zu for datum_token with key %s in mempool!", i, l_datum_hash_out_str); dap_chain_node_cli_set_reply_text(a_str_reply, - "Datum %s with datum token has wrong signature %u, break process and exit", - l_datum_hash_out_str, l_signs_count ); + "Datum %s with datum token has wrong signature %zu, break process and exit", + l_datum_hash_out_str, i); DAP_DELETE(l_datum); - //DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); - return -666; + return -6; }else{ - log_it(L_DEBUG,"Sign %lu passed",l_signs_count); + log_it(L_DEBUG,"Sign %zu passed", i); } - } - log_it(L_DEBUG, "Datum %s with token declaration: %u signatures are verified well (sign_size = %u)", l_datum_hash_out_str, l_signs_count, l_signs_size); - - // Check if all signs are present - if(l_signs_count == l_datum_token->header_private.signs_total) { - dap_chain_node_cli_set_reply_text(a_str_reply, - "Datum %s with datum token has all signs on board. Can't add anything in it"); - DAP_DELETE(l_datum); - //DAP_DELETE(l_datum_token); - DAP_DELETE(l_gdb_group_mempool); - return -7; - } // Check if more signs that could be (corrupted datum) - else if(l_signs_count > l_datum_token->header_private.signs_total) { - dap_chain_node_cli_set_reply_text(a_str_reply, - "Warning! Datum %s with datum token has more signs on board (%u) than its possible to have (%u)!", - l_signs_count, l_datum_token->header_private.signs_total); - DAP_DELETE(l_datum); - //DAP_DELETE(l_datum_token); - DAP_DELETE(l_gdb_group_mempool); - return -8; - } // Check if we have enough place to sign the datum token declaration - else if(l_datum_token->header_private.signs_total >= l_signs_count + l_certs_count) { - size_t l_offset = 0; + l_signs_size += dap_sign_get_size(l_sign); + } while (i++ <= l_datum_token->header_private.signs_valid); + log_it(L_DEBUG, "Datum %s with token declaration: %hu signatures are verified well (sign_size = %zu)", + l_datum_hash_out_str, l_datum_token->header_private.signs_valid, l_signs_size); + + if (l_datum_token->header_private.signs_total >= l_datum_token->header_private.signs_valid + l_certs_count) { + // Copy TSD sections to new location + size_t l_tsd_size = l_datum_token_size - l_signs_size; + uint8_t *l_token_tsd = DAP_NEW_SIZE(uint8_t, l_tsd_size); + memcpy(l_token_tsd, l_datum_token->data_n_tsd + l_signs_size, l_tsd_size); + size_t l_offset = l_signs_size; for(size_t i = 0; i < l_certs_count; i++) { + // Add signs to token dap_sign_t * l_sign = dap_sign_create(l_certs[i]->enc_key, l_datum_token, sizeof(l_datum_token->header_private), 0); size_t l_sign_size = dap_sign_get_size(l_sign); - - l_signs_size+= l_sign_size; + l_signs_size += l_sign_size; l_datum_size += l_sign_size; - l_datum_token_size+= l_sign_size; + l_datum_token_size += l_sign_size; - if ( (l_datum = DAP_REALLOC(l_datum, l_datum_size)) != NULL ){ // add place for new signatures + if ( (l_datum = DAP_REALLOC(l_datum, l_datum_size)) != NULL ) { + // add place for new signatures l_datum_token = (dap_chain_datum_token_t*) l_datum->data; l_datum->header.data_size = l_datum_token_size; memcpy(l_datum_token->data_n_tsd + l_offset, l_sign, l_sign_size); - log_it(L_DEBUG, "Added datum token declaration sign with cert %s (new size %lu)", + log_it(L_DEBUG, "Added datum token declaration sign with cert %s (new size %zu)", l_certs[i]->name , l_datum_size); DAP_DELETE(l_sign); @@ -2069,7 +2034,9 @@ int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_re return -81; } } - + // Return TSD sections to its place + memcpy(l_datum_token->data_n_tsd + l_signs_size, l_token_tsd, l_tsd_size); + DAP_DELETE(l_token_tsd); // Recalc hash, string and place new datum @@ -2125,8 +2092,8 @@ int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_re } else { dap_chain_node_cli_set_reply_text(a_str_reply, - "Error! Not enought place for new signature (%u is left when we need %u signatures)", - l_datum_token->header_private.signs_total - l_signs_count, l_certs_count); + "Error! Not enought place for new signature (%hu is left when we need %hu signatures)", + l_datum_token->header_private.signs_total - l_datum_token->header_private.signs_valid, l_certs_count); return -6; } } else { @@ -2164,7 +2131,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a size_t l_objs_size = 0; dap_global_db_obj_t * l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size); if(l_objs_size > 0) - dap_string_append_printf(a_str_tmp, "%s.%s: Found %u records :\n", a_net->pub.name, a_chain->name, + dap_string_append_printf(a_str_tmp, "%s.%s: Found %zu records :\n", a_net->pub.name, a_chain->name, l_objs_size); else dap_string_append_printf(a_str_tmp, "%s.%s: Not found records\n", a_net->pub.name, a_chain->name); @@ -2201,7 +2168,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a * @param str_reply * @return */ -int com_mempool_list(int argc, char ** argv, void *arg_func, char ** a_str_reply) +int com_mempool_list(int argc, char ** argv, char ** a_str_reply) { int arg_index = 1; dap_chain_t * l_chain = NULL; @@ -2247,7 +2214,7 @@ int com_mempool_list(int argc, char ** argv, void *arg_func, char ** a_str_reply * @param a_str_reply * @return */ -int com_mempool_delete(int argc, char ** argv, void *arg_func, char ** a_str_reply) +int com_mempool_delete(int argc, char ** argv, char ** a_str_reply) { int arg_index = 1; dap_chain_t * l_chain = NULL; @@ -2314,13 +2281,14 @@ int com_mempool_delete(int argc, char ** argv, void *arg_func, char ** a_str_rep /** * @brief com_mempool_proc + * process mempool datums * @param argc * @param argv * @param arg_func * @param a_str_reply * @return */ -int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply) +int com_mempool_proc(int argc, char ** argv, char ** a_str_reply) { int arg_index = 1; dap_chain_t * l_chain = NULL; @@ -2336,24 +2304,18 @@ int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply } dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net); - if(!l_net){ - return -1; - }else { - if(*a_str_reply) { - DAP_DELETE(*a_str_reply); - *a_str_reply = NULL; - } - } - char * l_gdb_group_mempool = NULL, *l_gdb_group_mempool_tmp; - if(l_chain) { - l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain); - l_gdb_group_mempool_tmp = l_gdb_group_mempool; - }else{ - dap_chain_node_cli_set_reply_text(a_str_reply, "no -chain param"); + if (!l_net || !l_chain) return -1; + if(*a_str_reply) { + DAP_DELETE(*a_str_reply); + *a_str_reply = NULL; } + char * l_gdb_group_mempool = NULL, *l_gdb_group_mempool_tmp; + l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain); + l_gdb_group_mempool_tmp = l_gdb_group_mempool; + // If full or light it doesnt work if(dap_chain_net_get_role(l_net).enums>= NODE_ROLE_FULL){ dap_chain_node_cli_set_reply_text(a_str_reply, "Need master node role or higher for network %s to process this command", l_net->pub.name); @@ -2448,7 +2410,7 @@ int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply * @param arg_func * @param str_reply * @return - * @details token_update -net <net name> -chain <chain name> -token <token ticker> -type private -flags [<Flag 1>][,<Flag 2>]...[,<Flag N>]... [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n" + * @details token_update -net <net name> -chain <chain name> -token <token ticker> [-type private] -flags [<Flag 1>][,<Flag 2>]...[,<Flag N>]... [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n" * \t Update token for <netname>:<chain name> with ticker <token ticker>, flags <Flag 1>,<Flag2>...<Flag N>" * \t and custom parameters list <Param 1>, <Param 2>...<Param N>." * \n" @@ -2489,7 +2451,7 @@ int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply "\t -tx_sender_blocked_remove <value>:\t Remove tx sender(s) from blocked\n" "\n" */ -int com_token_update(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_reply) +int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply) { int l_arg_index = 1; @@ -2498,17 +2460,8 @@ int com_token_update(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str const char * l_ticker = NULL; - const char * l_total_supply_str = NULL; - uint64_t l_total_supply = 0; - - const char * l_signs_emission_str = NULL; - uint16_t l_signs_emission = 0; - - const char * l_signs_total_str = NULL; uint16_t l_signs_total = 0; - const char * l_certs_str = NULL; - dap_cert_t ** l_certs = NULL; size_t l_certs_count = 0; @@ -2524,15 +2477,8 @@ int com_token_update(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str return -1; } - dap_chain_node_cli_cmd_values_parse_net_chain(&l_arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_net); - if(!l_net) + if (dap_chain_node_cli_cmd_values_parse_net_chain(&l_arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_net)) return -1; - else { - if(*a_str_reply) { - DAP_DELETE(*a_str_reply); - *a_str_reply = NULL; - } - } // Token ticker l_arg_index=dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-token", &l_ticker); // Check for ticker @@ -2544,9 +2490,9 @@ int com_token_update(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str // Token type l_arg_index=dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-type", &l_type_str); - if (strcmp( l_type_str, "private") == 0){ + if (!l_type_str || !strcmp(l_type_str, "private")) { l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE; - }else{ + } else { dap_chain_node_cli_set_reply_text(a_str_reply, "token_update can't accept type \"%s\"", l_type_str); return -22; } @@ -2679,13 +2625,18 @@ int com_token_update(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE, l_arg_param); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_tsd_size( l_tsd); - }else { + } else if (strcmp( a_argv[l_arg_index], "-chain") && strcmp( a_argv[l_arg_index], "-net") && + strcmp( a_argv[l_arg_index], "-token") && !strcmp( a_argv[l_arg_index], "-type")) { dap_chain_node_cli_set_reply_text(a_str_reply, "Unknown param \"%s\"",a_argv[l_arg_index]); return -20; } l_arg_index+=2; } + if (!l_tsd_total_size) { + dap_chain_node_cli_set_reply_text(a_str_reply, "No valid params to update"); + return -21; + } // If we have more certs than we need signs - use only first part of the list if(l_certs_count > l_signs_total) @@ -2816,7 +2767,7 @@ int com_token_update(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str "\t -tx_sender_blocked <value>:\t Blocked tx sender(s)\n" "\n" */ -int com_token_decl(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_reply) +int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) { int l_arg_index = 1; @@ -3027,7 +2978,7 @@ int com_token_decl(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_r log_it(L_DEBUG,"== TX_RECEIVER_BLOCKED_ADD: %s", dap_tsd_get_string_const(l_tsd) ); break; - default: log_it(L_DEBUG, "== 0x%04X: binary data %zd size ",l_tsd->type, l_tsd->size ); + default: log_it(L_DEBUG, "== 0x%04X: binary data %u size ",l_tsd->type, l_tsd->size ); } size_t l_tsd_size = dap_tsd_size( l_tsd); memcpy(l_datum_token->data_n_tsd + l_datum_data_offset, l_tsd, l_tsd_size); @@ -3157,29 +3108,19 @@ int com_token_decl(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_r l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_TOKEN); } - + int l_ret = 0; if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) { if(!dap_strcmp(l_hash_out_type,"hex")) dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token %s is placed in datum pool ", l_key_str, l_ticker); else dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token %s is placed in datum pool ", l_key_str_base58, l_ticker); - DAP_DELETE(l_datum); - DAP_DELETE(l_datum_token); - DAP_DELETE(l_gdb_group_mempool); - DAP_DELETE(l_key_str); - DAP_DELETE(l_key_str_base58); - return 0; } else { dap_chain_node_cli_set_reply_text(a_str_reply, "datum tx %s is not placed in datum pool ", l_key_str_base58); DAP_DELETE(l_datum); - DAP_DELETE(l_datum_token); - DAP_DELETE(l_gdb_group_mempool); - DAP_DELETE(l_key_str); - DAP_DELETE(l_key_str_base58); - return -2; + l_ret = -2; } - return 0; + return l_ret; } /** @@ -3190,7 +3131,7 @@ int com_token_decl(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_r * @param str_reply * @return */ -int com_token_emit(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_reply) +int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply) { int arg_index = 1; const char *str_tmp = NULL; @@ -3212,9 +3153,6 @@ int com_token_emit(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_r dap_cert_t ** l_certs = NULL; size_t l_certs_size = 0; - const char * l_wallet_str = NULL; - dap_chain_wallet_t * l_wallet = NULL; - const char * l_chain_emission_str = NULL; dap_chain_t * l_chain_emission = NULL; @@ -3486,22 +3424,21 @@ int com_token_emit(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_r return -2; } DAP_DELETE(str_reply_tmp); - DAP_DELETE(l_datum_tx); DAP_DELETE(l_addr); return 0; } + /** * @brief com_tx_cond_create * Create transaction * com_tx_cond_create command * @param a_argc * @param a_argv - * @param a_arg_func * @param a_str_reply * @return int */ -int com_tx_cond_create(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) +int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply) { (void) a_argc; int arg_index = 1; @@ -3568,7 +3505,7 @@ int com_tx_cond_create(int a_argc, char ** a_argv, void *a_arg_func, char **a_st dap_chain_node_cli_set_reply_text(a_str_reply, "tx_cond_create requires parameter '-service={vpn}'"); return -7; } - dap_chain_net_srv_uid_t l_srv_uid = { 0 }; + dap_chain_net_srv_uid_t l_srv_uid = {}; if(!dap_strcmp(l_service_str, "vpn")) l_srv_uid.uint64 = 0x0000000000000001; //dap_chain_addr_t *addr_to = dap_chain_addr_from_str(l_addr_to_str); @@ -3676,13 +3613,11 @@ int com_tx_cond_create(int a_argc, char ** a_argv, void *a_arg_func, char **a_st * @details Place public CA into the mempool * @param a_argc * @param a_argv - * @param a_arg_func * @param a_str_reply * @return */ -int com_mempool_add_ca( int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_reply) +int com_mempool_add_ca(int a_argc, char ** a_argv, char ** a_str_reply) { - UNUSED(a_arg_func); int arg_index = 1; // Read params @@ -3692,36 +3627,28 @@ int com_mempool_add_ca( int a_argc, char ** a_argv, void *a_arg_func, char ** a dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-ca_name", &l_ca_name); dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,a_argc, a_argv, a_str_reply, &l_chain, &l_net); - - // Check for network if was set or not if ( l_net == NULL ){ - dap_chain_node_cli_set_reply_text(a_str_reply, - "mempool_add_ca_public requires parameter '-net' to specify the chain network name"); return -1; + } else if (a_str_reply && *a_str_reply) { + DAP_DELETE(*a_str_reply); + *a_str_reply = NULL; } // Chech for chain if was set or not if ( l_chain == NULL){ // If wasn't set - trying to auto detect l_chain = dap_chain_net_get_chain_by_chain_type( l_net, CHAIN_TYPE_CA ); - if (l_chain == NULL) { - l_chain = l_net->pub.default_chain; - } if (l_chain == NULL) { // If can't auto detect // clean previous error code - if(a_str_reply && *a_str_reply) { - DAP_DELETE(*a_str_reply); - *a_str_reply = NULL; - } dap_chain_node_cli_set_reply_text(a_str_reply, "No chains for CA datum in network \"%s\"", l_net->pub.name ); return -2; } } - // Check if '-name' wasn't specified + // Check if '-ca_name' wasn't specified if (l_ca_name == NULL){ dap_chain_node_cli_set_reply_text(a_str_reply, - "mempool_add_ca_public requires parameter '-name' to specify the certificate name"); + "mempool_add_ca_public requires parameter '-ca_name' to specify the certificate name"); return -3; } @@ -3762,9 +3689,15 @@ int com_mempool_add_ca( int a_argc, char ** a_argv, void *a_arg_func, char ** a } // Finaly add datum to mempool - if ( dap_chain_mempool_datum_add ( l_datum,l_chain ) == 0 ){ + char *l_hash_str = dap_chain_mempool_datum_add(l_datum,l_chain); + if (l_hash_str) { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Datum %s was successfully placed to mempool", l_hash_str); + DAP_DELETE(l_hash_str); return 0; - }else{ + } else { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Can't place certificate \"%s\" to mempool", l_ca_name); DAP_DELETE( l_datum ); return -8; } @@ -3774,15 +3707,13 @@ int com_mempool_add_ca( int a_argc, char ** a_argv, void *a_arg_func, char ** a /** * @brief Create transaction * com_tx_create command - * - * Create transaction * @param argc * @param argv * @param arg_func * @param str_reply * @return int */ -int com_tx_create(int argc, char ** argv, void *arg_func, char **str_reply) +int com_tx_create(int argc, char ** argv, char **str_reply) { int arg_index = 1; // int cmd_num = 1; @@ -3920,6 +3851,7 @@ int com_tx_create(int argc, char ** argv, void *arg_func, char **str_reply) return res; } + /** * @brief com_tx_verify * Verifing transaction @@ -3930,7 +3862,7 @@ int com_tx_create(int argc, char ** argv, void *arg_func, char **str_reply) * @param str_reply * @return int */ -int com_tx_verify(int argc, char ** argv, void *arg_func, char **str_reply) +int com_tx_verify(int argc, char ** argv, char **str_reply) { if(argc > 1) { if(str_reply) @@ -3941,18 +3873,17 @@ int com_tx_verify(int argc, char ** argv, void *arg_func, char **str_reply) return -1; } + /** * @brief com_tx_history * tx_history command - * * Transaction history for an address * @param a_argc * @param a_argv - * @param a_arg_func * @param a_str_reply * @return int */ -int com_tx_history(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) +int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply) { int arg_index = 1; const char *l_addr_base58 = NULL; @@ -4064,6 +3995,7 @@ int com_tx_history(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_re return 0; } + /** * @brief stats command * @@ -4073,7 +4005,7 @@ int com_tx_history(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_re * @param str_reply * @return int */ -int com_stats(int argc, char ** argv, void *arg_func, char **str_reply) +int com_stats(int argc, char ** argv, char **str_reply) { enum { CMD_NONE, CMD_STATS_CPU @@ -4131,8 +4063,11 @@ int com_stats(int argc, char ** argv, void *arg_func, char **str_reply) * @param str_reply * @return int */ -int com_exit(int argc, char ** argv, void *arg_func, char **str_reply) +int com_exit(int argc, char ** argv, char **str_reply) { + UNUSED(argc); + UNUSED(argv); + UNUSED(str_reply); //dap_events_stop_all(); exit(0); return 0; @@ -4148,7 +4083,7 @@ int com_exit(int argc, char ** argv, void *arg_func, char **str_reply) * @param str_reply * @return int */ -int com_print_log(int argc, char ** argv, void *arg_func, char **str_reply) +int com_print_log(int argc, char ** argv, char **str_reply) { int arg_index = 1; const char * l_str_ts_after = NULL; @@ -4183,13 +4118,14 @@ int com_print_log(int argc, char ** argv, void *arg_func, char **str_reply) /** * @brief cmd_gdb_export + * action for cellframe-node-cli gdb_export command * @param argc * @param argv * @param arg_func * @param a_str_reply * @return */ -int cmd_gdb_export(int argc, char ** argv, void *arg_func, char ** a_str_reply) +int cmd_gdb_export(int argc, char ** argv, char ** a_str_reply) { int arg_index = 1; const char *l_filename = NULL; @@ -4233,7 +4169,7 @@ int cmd_gdb_export(int argc, char ** argv, void *arg_func, char ** a_str_reply) } size_t l_data_size = 0; pdap_store_obj_t l_data = dap_chain_global_db_obj_gr_get(NULL, &l_data_size, d->d_name); - log_it(L_INFO, "Exporting group %s, number of records: %d", d->d_name, l_data_size); + log_it(L_INFO, "Exporting group %s, number of records: %zu", d->d_name, l_data_size); if (!l_data_size) { continue; } @@ -4245,7 +4181,7 @@ int cmd_gdb_export(int argc, char ** argv, void *arg_func, char ** a_str_reply) for (size_t i = 0; i < l_data_size; ++i) { size_t l_out_size = DAP_ENC_BASE64_ENCODE_SIZE((int64_t)l_data[i].value_len) + 1; char *l_value_enc_str = DAP_NEW_Z_SIZE(char, l_out_size); - size_t l_enc_size = dap_enc_base64_encode(l_data[i].value, l_data[i].value_len, l_value_enc_str, DAP_ENC_DATA_TYPE_B64); + //size_t l_enc_size = dap_enc_base64_encode(l_data[i].value, l_data[i].value_len, l_value_enc_str, DAP_ENC_DATA_TYPE_B64); struct json_object *jobj = json_object_new_object(); json_object_object_add(jobj, "id", json_object_new_int64((int64_t)l_data[i].id)); @@ -4284,7 +4220,7 @@ int cmd_gdb_export(int argc, char ** argv, void *arg_func, char ** a_str_reply) * @param a_str_reply * @return */ -int cmd_gdb_import(int argc, char ** argv, void *arg_func, char ** a_str_reply) +int cmd_gdb_import(int argc, char ** argv, char ** a_str_reply) { int arg_index = 1; const char *l_filename = NULL; @@ -4316,7 +4252,7 @@ int cmd_gdb_import(int argc, char ** argv, void *arg_func, char ** a_str_reply) struct json_object *l_json_group_name = json_object_object_get(l_group_obj, "group"); const char *l_group_name = json_object_get_string(l_json_group_name); // proc group name - log_it(L_INFO, "Group %d: %s", i, l_group_name); + log_it(L_INFO, "Group %zu: %s", i, l_group_name); struct json_object *l_json_records = json_object_object_get(l_group_obj, "records"); size_t l_records_count = json_object_array_length(l_json_records); pdap_store_obj_t l_group_store = DAP_NEW_Z_SIZE(dap_store_obj_t, l_records_count * sizeof(dap_store_obj_t)); @@ -4335,15 +4271,15 @@ int cmd_gdb_import(int argc, char ** argv, void *arg_func, char ** a_str_reply) l_group_store[j].timestamp = json_object_get_int64(l_ts); l_group_store[j].value_len = (uint64_t)json_object_get_int64(l_value_len); l_group_store[j].type = 'a'; - const char *l_value_str = json_object_get_string(l_value); + //const char *l_value_str = json_object_get_string(l_value); char *l_val = DAP_NEW_Z_SIZE(char, l_group_store[j].value_len); - size_t l_dec_size = dap_enc_base64_decode(l_value_str, strlen(l_value_str), l_val, DAP_ENC_DATA_TYPE_B64); + //size_t l_dec_size = dap_enc_base64_decode(l_value_str, strlen(l_value_str), l_val, DAP_ENC_DATA_TYPE_B64); l_group_store[j].value = (uint8_t*)l_val; } if (dap_chain_global_db_driver_appy(l_group_store, l_records_count)) { log_it(L_CRITICAL, "An error occured on importing group %s...", l_group_name); } - dap_store_obj_free(l_group_store, l_records_count); + //dap_store_obj_free(l_group_store, l_records_count); } json_object_put(l_json); return 0; diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index 94896a07a5dc6f7ee8eeb3c80ade13e35fc4d48e..8d4e8ed037ebba59a603ffc41b69e61867e8ec17 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -26,6 +26,7 @@ #include <stddef.h> #include <pthread.h> +#include "dap_chain_wallet.h" #include "dap_common.h" #include "dap_enc_base58.h" #include "dap_strfuncs.h" @@ -33,7 +34,6 @@ #include "dap_list.h" #include "dap_hash.h" -#include "dap_chain_wallet.h" #include "dap_chain_datum.h" #include "dap_chain_datum_token.h" #include "dap_chain_datum_tx_items.h" @@ -87,13 +87,15 @@ void _dap_chain_tx_hash_processed_ht_free(dap_chain_tx_hash_processed_ht_t *l_ha * @param a_tx_hash_processed * @param l_tx_num */ -void _dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, - dap_ledger_t *a_ledger, - dap_string_t *a_str_out, - const char *a_hash_out_type, - bool save_processed_tx, - dap_chain_tx_hash_processed_ht_t **a_tx_hash_processed, - size_t *l_tx_num){ + +static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, + dap_ledger_t *a_ledger, + dap_string_t *a_str_out, + const char *a_hash_out_type, + bool save_processed_tx, + dap_chain_tx_hash_processed_ht_t **a_tx_hash_processed, + size_t *l_tx_num) +{ dap_chain_hash_fast_t l_tx_hash; dap_hash_fast(a_datum, dap_chain_datum_tx_get_size(a_datum), &l_tx_hash); if (save_processed_tx){ @@ -232,10 +234,10 @@ void _dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, l_pkey_tmp = (dap_pkey_t*)((dap_chain_tx_pkey_t*)item)->pkey; dap_hash_fast(l_pkey_tmp->pkey, l_pkey_tmp->header.size, &l_pkey_hash_tmp); l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&l_pkey_hash_tmp); - dap_string_append_printf(a_str_out, "\t PKey: \n", + dap_string_append_printf(a_str_out, "\t PKey: \n" "\t\t SIG type: %s\n" - "\t\t SIG size: %i\n" - "\t\t Sequence number: %i \n" + "\t\t SIG size: %u\n" + "\t\t Sequence number: %u \n" "\t\t Key: \n" "\t\t\t Type: %s\n" "\t\t\t Size: %u\n" @@ -288,9 +290,9 @@ void _dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, DAP_FREE(l_hash_str_tmp); break; case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE: - dap_string_append_printf(a_str_out, "\t\t\t uid:\n" - "\t\t\t addr:\n" - "\t\t\t value: %ld", + dap_string_append_printf(a_str_out, "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n" + "\t\t\t addr: %s\n" + "\t\t\t value: %Lf", ((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.srv_uid.uint64, dap_chain_addr_to_str( &((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.fee_addr @@ -365,6 +367,7 @@ static dap_chain_datum_t* get_prev_tx(dap_tx_data_t *a_tx_data) return l_datum; } + /** * @brief dap_db_history_tx * Get data according the history log @@ -496,7 +499,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, (l_tx_out) ? dap_chain_addr_to_str(&l_tx_out->addr) : NULL; if(l_tx_out) - dap_string_append_printf(l_str_out, " OUT item %lld %s to %s\n", + dap_string_append_printf(l_str_out, " OUT item %"DAP_UINT64_FORMAT_U" %s to %s\n", l_tx_out->header.value, dap_strlen(l_token_str) > 0 ? l_token_str : "?", l_dst_to_str ? l_dst_to_str : "?" @@ -547,7 +550,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, (dap_chain_tx_out_t*) l_list_out_prev_item->data : NULL; // print value from prev out item - dap_string_append_printf(l_str_out, " prev OUT item value=%lld", + dap_string_append_printf(l_str_out, " prev OUT item value=%"DAP_UINT64_FORMAT_U, l_tx_prev_out ? l_tx_prev_out->header.value : 0); } dap_string_append_printf(l_str_out, "\n"); @@ -739,7 +742,7 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons dap_list_t *l_list_out_info_tmp = l_list_out_info; while(l_list_out_info_tmp) { l_tx_data = (dap_tx_data_t*) l_list_out_info_tmp->data; - if(l_tx_data->token_ticker && l_tx_data->token_ticker[0]) + if(l_tx_data->token_ticker[0]) break; l_list_out_info_tmp = dap_list_next(l_list_out_info_tmp); } @@ -756,13 +759,13 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_records_tmp->data; if(!dap_strcmp(a_hash_out_type,"hex")){ - dap_string_append_printf(l_str_out, "tx hash %s \n emit %lu %s\n", + dap_string_append_printf(l_str_out, "tx hash %s \n emit %"DAP_UINT64_FORMAT_U" %s\n", tx_hash_str,//l_tx_data->tx_hash_str, l_tx_out->header.value, l_tx_data->token_ticker); } else { - dap_string_append_printf(l_str_out, "tx hash %s \n emit %lu %s\n", + dap_string_append_printf(l_str_out, "tx hash %s \n emit %"DAP_UINT64_FORMAT_U" %s\n", l_tx_data->tx_hash_str, l_tx_out->header.value, l_tx_data->token_ticker); @@ -786,7 +789,7 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons dap_list_t *l_list_out_info_tmp = l_list_out_info; while(l_list_out_info_tmp) { l_tx_data = (dap_tx_data_t*) l_list_out_info_tmp->data; - if(l_tx_data->token_ticker && l_tx_data->token_ticker[0]) + if(l_tx_data->token_ticker[0]) break; l_list_out_info_tmp = dap_list_next(l_list_out_info_tmp); } @@ -868,7 +871,7 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons tx_hash_str = dap_enc_base58_from_hex_str_to_str(l_tx_data->tx_hash_str); if(l_is_use_src_addr && !l_is_use_dst_addr) { dap_string_append_printf(l_str_out, - "tx hash %s \n %s in send %lu %s from %s\n to %s\n", + "tx hash %s \n %s in send %"DAP_UINT64_FORMAT_U" %s from %s\n to %s\n", tx_hash_str,//l_tx_data->tx_hash_str, l_time_str ? l_time_str : "", l_tx_prev_out->header.value, @@ -878,7 +881,7 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons } else if(l_is_use_dst_addr && !l_is_use_src_addr) { if(!l_src_str_is_cur) dap_string_append_printf(l_str_out, - "tx hash %s \n %s in recv %lu %s from %s\n", + "tx hash %s \n %s in recv %"DAP_UINT64_FORMAT_U" %s from %s\n", tx_hash_str,//l_tx_data->tx_hash_str, l_time_str ? l_time_str : "", l_tx_prev_out->header.value, @@ -910,7 +913,7 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons if(l_tx_out && a_addr && memcmp(&l_tx_out->addr, a_addr, sizeof(dap_chain_addr_t))==0) { if(!l_src_str_is_cur) dap_string_append_printf(l_str_out, - "tx hash %s \n %s recv %lu %s from %s\n", + "tx hash %s \n %s recv %"DAP_UINT64_FORMAT_U" %s from %s\n", tx_hash_str,//l_tx_data->tx_hash_str, l_time_str ? l_time_str : "", l_tx_out->header.value, @@ -921,7 +924,7 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons } else { dap_string_append_printf(l_str_out, - "tx hash %s \n %s send %lu %s to %s\n", + "tx hash %s \n %s send %"DAP_UINT64_FORMAT_U" %s to %s\n", tx_hash_str,//l_tx_data->tx_hash_str, l_time_str ? l_time_str : "", l_tx_out->header.value, @@ -992,57 +995,40 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke { dap_string_t *l_str_out = dap_string_new(NULL); *a_token_num = 0; - bool l_tx_hash_found = false; - // list all transactions - dap_tx_data_t *l_tx_data_hash = NULL; - // load transactions size_t l_atom_size = 0; dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); - dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); - size_t l_datums_count = 0; - dap_chain_datum_t **l_datums = (a_chain->callback_atom_get_datums && l_atom && l_atom_size) ? - a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count) : NULL; - if(!l_datums) { - log_it(L_WARNING, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name); + if(!a_chain->callback_atom_get_datums) { + log_it(L_DEBUG, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name); return NULL ; } - for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) { - - dap_chain_datum_t *l_datum = l_datums[l_datum_n]; - if(!l_datum ) {// || l_datum->header.type_id != DAP_CHAIN_DATUM_TX) { - // go to next atom - //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); - continue; - } - /* - // transaction - dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data; - dap_list_t *l_records_out = NULL; - - - dap_chain_datum_t *l_datum = - a_chain->callback_atom_get_datum ? - a_chain->callback_atom_get_datum(l_atom) : (dap_chain_datum_t*) l_atom; - if(!l_datum) { - // go to next transaction - l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); - l_atom_size = a_chain->callback_atom_get_size(l_atom); - log_it(L_ERROR, "datum=NULL for atom=0x%x", l_atom); - continue; - } -*/ - char l_time_str[70]; - // get time of create datum - if(dap_time_to_str_rfc822(l_time_str, 71, l_datum->header.ts_create) < 1) - l_time_str[0] = '\0'; - if(l_datum->header.type_id==DAP_CHAIN_DATUM_TOKEN_DECL) { + for (dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); + l_atom && l_atom_size; l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size)) { + size_t l_datums_count = 0; + dap_chain_datum_t **l_datums = a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count); + for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) { + dap_chain_datum_t *l_datum = l_datums[l_datum_n]; + if (!l_datum || l_datum->header.type_id != DAP_CHAIN_DATUM_TOKEN_DECL) + continue; + char l_time_str[70]; + // get time of create datum + if (dap_time_to_str_rfc822(l_time_str, 70, l_datum->header.ts_create) < 1) + l_time_str[0] = '\0'; dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; - if(!a_token_name || !dap_strcmp(l_token->ticker, a_token_name)) { + if (!a_token_name || !dap_strcmp(l_token->ticker, a_token_name)) { + dap_chain_hash_fast_t l_datum_hash = {}; + dap_hash_fast(l_datum, dap_chain_datum_size(l_datum), &l_datum_hash); + char *l_out_hash_str; + if (!strcmp(a_hash_out_type, "hex")) + l_out_hash_str = dap_chain_hash_fast_to_str_new(&l_datum_hash); + else + l_out_hash_str = dap_enc_base58_encode_hash_to_str(&l_datum_hash); + dap_string_append(l_str_out, l_out_hash_str); + dap_string_append(l_str_out, "\n"); dap_string_append_printf(l_str_out, "token %s, created: %s\n", l_token->ticker, l_time_str); switch (l_token->type) { // Simple private token decl case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: - dap_string_append_printf(l_str_out, " total_supply: %.0llf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n", + dap_string_append_printf(l_str_out, " total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n", l_token->header_private.total_supply / DATOSHI_LD, l_token->header_private.total_supply, l_token->header_private.signs_valid, l_token->header_private.signs_total); @@ -1061,11 +1047,11 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); dap_string_append_printf(l_str_out, - " total_supply: %.0llf(%"DAP_UINT64_FORMAT_U"), flags: 0x%x\n, premine_supply: %"DAP_UINT64_FORMAT_U", premine_address '%s'\n", + " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", l_token->header_public.total_supply / DATOSHI_LD, - l_token->header_public.total_supply, + dap_chain_balance_print(l_token->header_public.total_supply), l_token->header_public.flags, - l_token->header_public.premine_supply, + dap_chain_balance_print(l_token->header_public.premine_supply), l_addr ? l_addr : "-"); DAP_DELETE(l_addr); DAP_DELETE(l_balance); @@ -1074,23 +1060,19 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke default: dap_string_append_printf(l_str_out, "unknown token type: 0x%x\n", l_token->type); break; - } dap_string_append_printf(l_str_out, "\n"); (*a_token_num)++; } } - - // go to next transaction - //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); - //l_atom_size = a_chain->callback_atom_get_size(l_atom); + DAP_DELETE(l_datums); } - a_chain->callback_atom_iter_delete(l_atom_iter); char *l_ret_str = l_str_out ? dap_string_free(l_str_out, false) : NULL; return l_ret_str; } + /** * @brief dap_db_history_filter * Get data according the history log @@ -1170,7 +1152,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; //if(a_datum_start < 0 || (l_datum_num >= a_datum_start && l_datum_num < a_datum_end)) // datum out of page - if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < a_datum_start || l_datum_num+l_datum_num_global >= a_datum_end)){ + if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)){ l_token_num++; break; } @@ -1179,7 +1161,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger switch (l_token->type) { // Simple private token decl case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: - dap_string_append_printf(l_str_out, " total_supply: %.0llf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n", + dap_string_append_printf(l_str_out, " total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n", l_token->header_private.total_supply / DATOSHI_LD, l_token->header_private.total_supply, l_token->header_private.signs_valid, l_token->header_private.signs_total); @@ -1198,11 +1180,11 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); dap_string_append_printf(l_str_out, - " total_supply: %.0llf(%"DAP_UINT64_FORMAT_U"), flags: 0x%x\n, premine_supply: %"DAP_UINT64_FORMAT_U", premine_address '%s'\n", + " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", l_token->header_public.total_supply / DATOSHI_LD, - l_token->header_public.total_supply, + dap_chain_balance_print(l_token->header_public.total_supply), l_token->header_public.flags, - l_token->header_public.premine_supply, + dap_chain_balance_print(l_token->header_public.premine_supply), l_addr ? l_addr : "-"); DAP_DELETE(l_addr); DAP_DELETE(l_balance); @@ -1222,7 +1204,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger // emission case DAP_CHAIN_DATUM_TOKEN_EMISSION: { // datum out of page - if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < a_datum_start || l_datum_num+l_datum_num_global >= a_datum_end)) { + if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { l_token_num++; break; } @@ -1234,7 +1216,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger break; } - dap_string_append_printf(l_str_out, "emission: %.0llf(%"DAP_UINT64_FORMAT_U") %s, type: %s, version: %d\n", + dap_string_append_printf(l_str_out, "emission: %.0Lf(%"DAP_UINT64_FORMAT_U") %s, type: %s, version: %d\n", l_token_em->hdr.value / DATOSHI_LD, l_token_em->hdr.value, l_token_em->hdr.ticker, c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type], l_token_em->hdr.version); @@ -1251,7 +1233,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger dap_string_append_printf(l_str_out, " codename: %s\n", l_token_em->data.type_algo.codename); break; case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: - dap_string_append_printf(l_str_out, " value_start: %.0llf(%"DAP_UINT64_FORMAT_U"), codename: %s\n", + dap_string_append_printf(l_str_out, " value_start: %.0Lf(%"DAP_UINT64_FORMAT_U"), codename: %s\n", l_token_em->data.type_atom_owner.value_start / DATOSHI_LD, l_token_em->data.type_atom_owner.value_start, l_token_em->data.type_atom_owner.value_change_algo_codename); @@ -1277,14 +1259,14 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger case DAP_CHAIN_DATUM_TX:{ // datum out of page - if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < a_datum_start || l_datum_num+l_datum_num_global >= a_datum_end)) { + if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { l_tx_num++; break; } dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data; // dap_chain_tx_hash_processed_ht_t *l_tx_hash_processed = a_tx_hash_processed; //calc tx hash - _dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num); + s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num); // a_tx_hash_processed = l_tx_hash_processed; // l_tx_num++; @@ -1526,7 +1508,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger } break; default: - dap_string_append_printf(l_str_out, "unknown datum type=%d %lld %s to %s\n", l_datum->header.type_id); + dap_string_append_printf(l_str_out, "unknown datum type=%d\n", l_datum->header.type_id); break; } l_datum_num++; @@ -1539,7 +1521,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger a_chain->callback_atom_iter_delete(l_atom_iter); //total dap_string_append_printf(l_str_out, - "---------------\ntokens: %u\nemissions: %u\ntransactions: %u\ntotal datums: %u", l_token_num, + "---------------\ntokens: %zu\nemissions: %zu\ntransactions: %zu\ntotal datums: %zu", l_token_num, l_emission_num, l_tx_num, l_datum_num); // return total datums @@ -1567,14 +1549,13 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger /** * @brief com_ledger * ledger command - * * @param a_argc * @param a_argv * @param a_arg_func * @param a_str_reply * @return int */ -int com_ledger(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) +int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) { enum { CMD_NONE, CMD_LIST, CMD_TX_HISTORY, CMD_TX_INFO }; int arg_index = 1; @@ -1743,9 +1724,9 @@ int com_ledger(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) int l_sub_cmd = SUBCMD_NONE; if (dap_chain_node_cli_find_option_val(a_argv, 2, 3, "coins", NULL )) l_sub_cmd = SUBCMD_LIST_COIN; - dap_chain_node_cli_find_option_val(a_argv, 4, a_argc, "-net", &l_net_str); - if (l_net == NULL){ - dap_chain_node_cli_set_reply_text(a_str_reply, "command requires key -net"); + dap_chain_node_cli_find_option_val(a_argv, 3, a_argc, "-net", &l_net_str); + if (l_net_str == NULL){ + dap_chain_node_cli_set_reply_text(a_str_reply, "Command requires key -net"); return -1; } dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name(l_net_str); @@ -1753,7 +1734,16 @@ int com_ledger(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) dap_chain_node_cli_set_reply_text(a_str_reply, "Can't get ledger for net %s", l_net_str); return -2; } - //dap_chain_ledger_ + dap_string_t *l_str_ret = dap_string_new(""); + dap_list_t *l_token_list = dap_chain_ledger_token_info(l_ledger); + dap_string_append_printf(l_str_ret, "Found %u tokens in %s ledger\n", dap_list_length(l_token_list), l_net_str); + for (dap_list_t *l_list = l_token_list; l_list; l_list = dap_list_next(l_list)) { + dap_string_append(l_str_ret, (char *)l_list->data); + } + dap_list_free_full(l_token_list, free); + dap_chain_node_cli_set_reply_text(a_str_reply, l_str_ret->str); + dap_string_free(l_str_ret, true); + return 0; } else if (l_cmd == CMD_TX_INFO){ //GET hash dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-hash", &l_tx_hash_str); @@ -1784,7 +1774,7 @@ int com_ledger(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) return -2; } dap_string_t *l_str = dap_string_new(""); - _dap_chain_datum_tx_out_data(l_datum_tx, l_ledger, l_str, l_hash_out_type, false, NULL, NULL); + s_dap_chain_datum_tx_out_data(l_datum_tx, l_ledger, l_str, l_hash_out_type, false, NULL, NULL); dap_chain_node_cli_set_reply_text(a_str_reply, l_str->str); dap_string_free(l_str, true); } @@ -1795,26 +1785,21 @@ int com_ledger(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) return 0; } + /** * @brief com_token * token command - * * @param a_argc * @param a_argv * @param a_arg_func * @param a_str_reply * @return int */ -int com_token(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) +int com_token(int a_argc, char ** a_argv, char **a_str_reply) { enum { CMD_NONE, CMD_LIST, CMD_INFO, CMD_TX }; int arg_index = 1; - //const char *l_addr_base58 = NULL; - //const char *l_wallet_name = NULL; const char *l_net_str = NULL; - const char *l_chain_str = NULL; - - dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; dap_chain_tx_hash_processed_ht_t *l_list_tx_hash_processd = NULL; @@ -1827,13 +1812,7 @@ int com_token(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) return -1; } - //bool l_is_all = dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-all", NULL); - //dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_addr_base58); - //dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-w", &l_wallet_name); dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-net", &l_net_str); - //dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-chain", &l_chain_str); - //dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-tx", &l_tx_hash_str); - // Select chain network if(!l_net_str) { dap_chain_node_cli_set_reply_text(a_str_reply, "command requires parameter '-net'"); @@ -1875,7 +1854,7 @@ int com_token(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) } dap_chain_enum_unlock(); //total - dap_string_append_printf(l_str_out, "---------------\ntokens: %u\n", l_token_num_total); + dap_string_append_printf(l_str_out, "---------------\ntokens: %zu\n", l_token_num_total); dap_chain_node_cli_set_reply_text(a_str_reply, l_str_out->str); dap_string_free(l_str_out, true); return 0; @@ -1925,7 +1904,7 @@ int com_token(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) int l_subcmd = CMD_NONE; const char *l_addr_base58_str = NULL; const char *l_wallet_name = NULL; - if(dap_chain_node_cli_find_option_val(a_argv, 2, a_argc, "-all", NULL)) + if(dap_chain_node_cli_find_option_val(a_argv, 2, a_argc, "all", NULL)) l_subcmd = SUBCMD_TX_ALL; else if(dap_chain_node_cli_find_option_val(a_argv, 2, a_argc, "-addr", &l_addr_base58_str)) l_subcmd = SUBCMD_TX_ADDR; diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index f2c4384bca13b5f35417a18ac5ad45c9a5eb253b..46a0b193dd0cc599bee5e50561cc85dd53002d20 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -153,7 +153,8 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg) return; // check for last attempt bool l_is_last_attempt = a_arg ? true : false; - if(l_is_last_attempt){ + if (l_is_last_attempt) { + dap_chain_node_client_state_t l_prev_state = l_node_client->state; pthread_mutex_lock(&l_node_client->wait_mutex); l_node_client->state = NODE_CLIENT_STATE_DISCONNECTED; #ifndef _WIN32 @@ -164,7 +165,7 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg) pthread_mutex_unlock(&l_node_client->wait_mutex); l_node_client->esocket_uuid = 0; - if (l_node_client->callbacks.disconnected) { + if (l_prev_state >= NODE_CLIENT_STATE_ESTABLISHED && l_node_client->callbacks.disconnected) { l_node_client->callbacks.disconnected(l_node_client, l_node_client->callbacks_arg); } else if (l_node_client->keep_connection) { dap_events_socket_uuid_t *l_uuid = DAP_NEW(dap_events_socket_uuid_t); @@ -490,7 +491,7 @@ static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t* a_ch_ch } break; case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS: { if(s_stream_ch_chain_debug_more) - log_it(L_INFO,"Out: chain %x sent to uplink "NODE_ADDR_FP_STR,l_node_client->cur_chain ? l_node_client->cur_chain->id.uint64 : 0, NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr)); + log_it(L_INFO,"Out: chain %"DAP_UINT64_FORMAT_x" sent to uplink "NODE_ADDR_FP_STR,l_node_client->cur_chain ? l_node_client->cur_chain->id.uint64 : 0, NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr)); }break; default: { } @@ -507,6 +508,7 @@ static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t* a_ch_ch */ static int save_stat_to_database(dap_stream_ch_chain_net_srv_pkt_test_t *a_request, dap_chain_node_client_t * a_node_client) { + UNUSED(a_node_client); int l_ret = 0; if(!a_request) return -1; @@ -530,7 +532,7 @@ static int save_stat_to_database(dap_stream_ch_chain_net_srv_pkt_test_t *a_reque char *l_group = NULL; dap_chain_net_t * l_net = dap_chain_net_by_id(a_request->net_id); if(l_net) { - l_group = dap_strdup_printf("%s.orders-test-stat", l_net->pub.gdb_groups_prefix); + l_group = dap_strdup_printf("local.%s.orders-test-stat", l_net->pub.gdb_groups_prefix); } if(l_group) { dap_store_obj_t *l_obj = dap_chain_global_db_get_last(l_group); @@ -550,6 +552,7 @@ static int save_stat_to_database(dap_stream_ch_chain_net_srv_pkt_test_t *a_reque json_object_put(jobj); return l_ret; } + /** * @brief s_ch_chain_callback_notify_packet_R - Callback for channel 'R' * @param a_ch_chain @@ -583,11 +586,10 @@ static void s_ch_chain_callback_notify_packet_R(dap_stream_ch_chain_net_srv_t* a } } + /** * @brief dap_chain_node_client_connect_channels * Create connection to server - * - * return a connection handle, or NULL, if an error * @param l_net * @param a_node_info * @param a_active_channels @@ -694,8 +696,6 @@ static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_no /** * @brief dap_chain_node_client_connect * Create connection to server - * - * return a connection handle, or NULL, if an error * @param a_net * @param a_node_info * @return dap_chain_node_client_t* return a connection handle, or NULL, if an error @@ -718,6 +718,7 @@ void dap_chain_node_client_reset(dap_chain_node_client_t *a_client) } } + /** * @brief dap_chain_node_client_close * Close connection to server, delete chain_node_client_t *client @@ -754,6 +755,7 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client) } } + /** * @brief dap_chain_node_client_send_ch_pkt * Send stream request to server @@ -775,13 +777,13 @@ int dap_chain_node_client_send_ch_pkt(dap_chain_node_client_t *a_client, uint8_t return 0; } + /** * @brief dap_chain_node_client_wait * wait for the complete of request * * timeout_ms timeout in milliseconds * waited_state state which we will wait, sample NODE_CLIENT_STATE_CONNECT or NODE_CLIENT_STATE_SENDED - * return -2 false, -1 timeout, 0 end of connection or sending data * @param a_client * @param a_waited_state * @param a_timeout_ms @@ -919,6 +921,7 @@ static void nodelist_response_error_callback(dap_client_t *a_client, int a_err) { }*/ + /** * @brief dap_chain_node_client_send_nodelist_req * Send nodelist request to server diff --git a/modules/net/dap_chain_node_dns_client.c b/modules/net/dap_chain_node_dns_client.c index d11d489468af43b436632a2c5187c713a1fde7db..af3c5a5684acea9c28e4fb477d6447249d503f57 100644 --- a/modules/net/dap_chain_node_dns_client.c +++ b/modules/net/dap_chain_node_dns_client.c @@ -251,7 +251,7 @@ int dap_chain_node_info_dns_request(struct in_addr a_addr, uint16_t a_port, char dap_dns_buf_put_uint16(l_dns_client->dns_request, DNS_RECORD_TYPE_A); dap_dns_buf_put_uint16(l_dns_client->dns_request, DNS_CLASS_TYPE_IN); - dap_events_socket_callbacks_t l_esocket_callbacks={0}; + dap_events_socket_callbacks_t l_esocket_callbacks={}; l_esocket_callbacks.worker_assign_callback = s_dns_client_esocket_worker_assign_callback; l_esocket_callbacks.delete_callback = s_dns_client_esocket_delete_callback; // Delete client callback @@ -330,36 +330,3 @@ void dap_dns_buf_put_uint64(dap_dns_buf_t *buf, uint64_t val) dap_dns_buf_put_uint32(buf, val >> 32); dap_dns_buf_put_uint32(buf, val); } - -/** - * @brief dap_dns_resolve_hostname - * @param str - * @return - */ -dap_chain_node_info_t *dap_dns_resolve_hostname(char *str) -{ - log_it(L_DEBUG, "DNS parser retrieve hostname %s", str); - dap_chain_net_t *l_net = dap_chain_net_by_name(str); - if (l_net == NULL) { - uint16_t l_nets_count; - dap_chain_net_t **l_nets = dap_chain_net_list(&l_nets_count); - if (!l_nets_count) { - log_it(L_WARNING, "No chain network present"); - return 0; - } - l_net = l_nets[rand() % l_nets_count]; - } - // get nodes list from global_db - dap_global_db_obj_t *l_objs = NULL; - size_t l_nodes_count = 0; - // read all node - l_objs = dap_chain_global_db_gr_load(l_net->pub.gdb_nodes, &l_nodes_count); - if (!l_nodes_count || !l_objs) - return 0; - size_t l_node_num = rand() % l_nodes_count; - dap_chain_node_info_t *l_node_info = DAP_NEW_Z(dap_chain_node_info_t); - memcpy(l_node_info, l_objs[l_node_num].value, sizeof(dap_chain_node_info_t)); - dap_chain_global_db_objs_delete(l_objs, l_nodes_count); - log_it(L_DEBUG, "DNS resolver find ip %s", inet_ntoa(l_node_info->hdr.ext_addr_v4)); - return l_node_info; -} diff --git a/modules/net/dap_chain_node_dns_server.c b/modules/net/dap_chain_node_dns_server.c index 8ef90c7f8a84a5473d9922e977870982a9654094..66090c88cf0d36d692757926c689fa92d0c1f0da 100644 --- a/modules/net/dap_chain_node_dns_server.c +++ b/modules/net/dap_chain_node_dns_server.c @@ -284,6 +284,44 @@ void dap_dns_server_stop() { DAP_DELETE(s_dns_server); } - - - +/** + * @brief dap_dns_resolve_hostname + * @param str + * @return + */ +dap_chain_node_info_t *dap_dns_resolve_hostname(char *str) +{ + log_it(L_DEBUG, "DNS parser retrieve hostname %s", str); + dap_chain_net_t *l_net = dap_chain_net_by_name(str); + if (l_net == NULL) { + uint16_t l_nets_count; + dap_chain_net_t **l_nets = dap_chain_net_list(&l_nets_count); + if (!l_nets_count) { + log_it(L_WARNING, "No chain network present"); + return NULL; + } + l_net = l_nets[rand() % l_nets_count]; + } + // get nodes list from global_db + dap_global_db_obj_t *l_objs = NULL; + size_t l_nodes_count = 0; + // read all node + l_objs = dap_chain_global_db_gr_load(l_net->pub.gdb_nodes, &l_nodes_count); + if (!l_nodes_count || !l_objs) + return NULL; + dap_chain_node_info_t *l_node_candidate; + for (int i = 0; i < 5; i++) { + // 5 tryes for non empty address & port + size_t l_node_num = rand() % l_nodes_count; + l_node_candidate = (dap_chain_node_info_t *)l_objs[l_node_num].value; + if (l_node_candidate->hdr.ext_addr_v4.s_addr && l_node_candidate->hdr.ext_port) + break; + } + if (!l_node_candidate->hdr.ext_addr_v4.s_addr || !l_node_candidate->hdr.ext_port) + return NULL; + dap_chain_node_info_t *l_node_info = DAP_NEW_Z(dap_chain_node_info_t); + memcpy(l_node_info, l_node_candidate, sizeof(dap_chain_node_info_t)); + dap_chain_global_db_objs_delete(l_objs, l_nodes_count); + log_it(L_DEBUG, "DNS resolver find ip %s", inet_ntoa(l_node_info->hdr.ext_addr_v4)); + return l_node_info; +} diff --git a/modules/net/dap_chain_node_ping.c b/modules/net/dap_chain_node_ping.c index b2986f7c22b9d2a2253b43acc1887ef9b7e517b7..f9237097f5a840105e597f57b7739734e5ec499d 100644 --- a/modules/net/dap_chain_node_ping.c +++ b/modules/net/dap_chain_node_ping.c @@ -24,12 +24,14 @@ //#include <sys/socket.h> #include <time.h> #include <errno.h> +#ifndef _GNU_SOURCE #define _GNU_SOURCE +#endif #define __USE_GNU /* See feature_test_macros(7) */ #include <pthread.h> -#include "dap_common.h" #include "dap_client.h" +#include "dap_common.h" #include "dap_strfuncs.h" #include "dap_list.h" #include "dap_chain_common.h" @@ -77,7 +79,7 @@ static void* node_ping_proc(void *a_arg) { - struct in_addr l_addr = { 0 }; + struct in_addr l_addr = {}; int l_port = 0; int l_count; if(!a_arg) @@ -150,7 +152,7 @@ static void* node_ping_proc(void *a_arg) DAP_DELETE(host4); closesocket(l_socket); } - return (void*) res; + return (void*)(size_t)res; } // start sending ping diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index ad6475656fd92064aedf39b4d6575657eeec38b8..bb7fe912de58ebdae8c405072b70b057d41b271f 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -27,9 +27,9 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include <stdint.h> #include <string.h> +#include "dap_net.h" #include "dap_strfuncs.h" #include "dap_string.h" -#include "dap_net.h" #include "dap_chain_common.h" #include "dap_chain_node.h" #include "dap_chain.h" diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h index 9d84beabcc2a289a3024f185ffea98de15c43d8a..216d6a4261c130a77397d44fc5eecd8cc75856af 100644 --- a/modules/net/include/dap_chain_node.h +++ b/modules/net/include/dap_chain_node.h @@ -132,7 +132,7 @@ dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_t * l_net,dap_chain bool dap_chain_node_check_addr(dap_chain_net_t * l_net,dap_chain_node_addr_t *addr, dap_chain_cell_id_t *a_cell_id); dap_chain_node_addr_t * dap_chain_node_alias_find(dap_chain_net_t * l_net,const char *alias); -bool dap_chain_node_alias_register(dap_chain_net_t * l_net,const char *alias, dap_chain_node_addr_t *addr); +bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias, dap_chain_node_addr_t *a_addr); bool dap_chain_node_alias_delete(dap_chain_net_t * l_net,const char *alias); int dap_chain_node_info_save(dap_chain_net_t * l_net,dap_chain_node_info_t *node_info); diff --git a/modules/net/include/dap_chain_node_cli.h b/modules/net/include/dap_chain_node_cli.h index 361a0e3846884ea8ce23f95effceca21577ff9ab..12b1c7daaac19a8be04d2123cbdfcfcdc69aea21 100644 --- a/modules/net/include/dap_chain_node_cli.h +++ b/modules/net/include/dap_chain_node_cli.h @@ -25,13 +25,13 @@ #pragma once +#include "dap_events_socket.h" #include "dap_common.h" #include "dap_config.h" #include "uthash.h" -#include "dap_events_socket.h" - -typedef int cmdfunc_t(int argc, char ** argv, void *arg_func, char **str_reply); +typedef int cmdfunc_ex_t(int argc, char ** argv, void *arg_func, char **str_reply); +typedef int cmdfunc_t(int argc, char ** argv, char **str_reply); typedef void cmd_item_func_override_log_cmd_call(const char*); @@ -42,7 +42,10 @@ typedef struct dap_chain_node_cmd_item_func_overrides{ typedef struct dap_chain_node_cmd_item{ char name[32]; /* User printable name of the function. */ - cmdfunc_t *func; /* Function to call to do the job. */ + union { + cmdfunc_t *func; /* Function to call to do the job. */ + cmdfunc_ex_t *func_ex; /* Function with additional arg to call to do the job. */ + }; void *arg_func; /* additional argument of function*/ char *doc; /* Documentation for this function. */ char *doc_ex; /* Full documentation for this function. */ @@ -60,7 +63,11 @@ long s_recv(SOCKET sock, unsigned char *buf, size_t bufsize, int timeout); */ dap_chain_node_cmd_item_t* dap_chain_node_cli_cmd_get_first(); dap_chain_node_cmd_item_t* dap_chain_node_cli_cmd_find(const char *a_name); -void dap_chain_node_cli_cmd_item_create(const char * a_name, cmdfunc_t *a_func, void *a_arg_func, const char *a_doc, const char *a_doc_ex); +void dap_chain_node_cli_cmd_item_create_ex(const char * a_name, cmdfunc_ex_t *a_func, void *a_arg_func, const char *a_doc, const char *a_doc_ex); +DAP_STATIC_INLINE void dap_chain_node_cli_cmd_item_create(const char * a_name, cmdfunc_t *a_func, const char *a_doc, const char *a_doc_ex) +{ + dap_chain_node_cli_cmd_item_create_ex(a_name, (cmdfunc_ex_t *)(void *)a_func, NULL, a_doc, a_doc_ex); +} void dap_chain_node_cli_cmd_item_apply_overrides(const char * a_name, const dap_chain_node_cmd_item_func_overrides_t * a_overrides); void dap_chain_node_cli_set_reply_text(char **str_reply, const char *str, ...); diff --git a/modules/net/include/dap_chain_node_cli_cmd.h b/modules/net/include/dap_chain_node_cli_cmd.h index 2e2b11b845adb549724d984fdfd86bfa1622c9c6..3c50d18e3cf46c7ee876bace88ced160ac5a2dab 100644 --- a/modules/net/include/dap_chain_node_cli_cmd.h +++ b/modules/net/include/dap_chain_node_cli_cmd.h @@ -44,57 +44,57 @@ int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index,int argc, cha /** * global_db command */ -int com_global_db(int argc, char ** argv, void *arg_func, char **str_reply); +int com_global_db(int argc, char ** argv, char **str_reply); /** * Node command */ -int com_node(int argc, char ** argv, void *arg_func, char **str_reply); +int com_node(int argc, char ** argv, char **str_reply); /** * Traceroute command * * return 0 OK, -1 Err */ -int com_traceroute(int argc, char** argv, void *arg_func, char **str_reply); +int com_traceroute(int argc, char** argv, char **str_reply); /** * Tracepath command * * return 0 OK, -1 Err */ -int com_tracepath(int argc, char** argv, void *arg_func, char **str_reply); +int com_tracepath(int argc, char** argv, char **str_reply); /** * Ping command * * return 0 OK, -1 Err */ -int com_ping(int argc, char** argv, void *arg_func, char **str_reply); +int com_ping(int argc, char** argv, char **str_reply); /** * Help command */ -int com_help(int argc, char ** argv, void *arg_func, char **str_reply); +int com_help(int argc, char ** argv, char **str_reply); -int com_version(int argc, char ** argv, void *arg_func, char **str_reply); +int com_version(int argc, char ** argv, char **str_reply); /** * Token declaration */ -int com_token_decl ( int argc, char ** argv, void *arg_func, char ** str_reply); +int com_token_decl ( int argc, char ** argv, char ** str_reply); -int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply); +int com_token_update(int argc, char ** argv, char ** a_str_reply); /** * Token declaration add sign */ -int com_token_decl_sign ( int argc, char ** argv, void *arg_func, char ** str_reply); +int com_token_decl_sign ( int argc, char ** argv, char ** str_reply); /** * Token emission */ -int com_token_emit (int argc, char ** argv, void *arg_func, char ** str_reply); +int com_token_emit (int argc, char ** argv, char ** str_reply); /** @@ -102,45 +102,45 @@ int com_token_emit (int argc, char ** argv, void *arg_func, char ** str_reply); * * Wallet info */ -int com_tx_wallet(int argc, char ** argv, void *arg_func, char **str_reply); +int com_tx_wallet(int argc, char ** argv, char **str_reply); /** * com_tx_create command * * Create transaction */ -int com_tx_create(int argc, char ** argv, void *arg_func, char **str_reply); -int com_tx_cond_create(int argc, char ** argv, void *arg_func, char **str_reply); +int com_tx_create(int argc, char ** argv, char **str_reply); +int com_tx_cond_create(int argc, char ** argv, char **str_reply); /** * tx_verify command * * Verifing transaction */ -int com_tx_verify(int argc, char ** argv, void *arg_func, char **str_reply); +int com_tx_verify(int argc, char ** argv, char **str_reply); /** * tx_history command * * Transaction history for an address */ -int com_tx_history(int argc, char ** argv, void *arg_func, char **str_reply); +int com_tx_history(int argc, char ** argv, char **str_reply); // Print log info -int com_print_log(int argc, char ** argv, void *arg_func, char **str_reply); +int com_print_log(int argc, char ** argv, char **str_reply); // Print statistics -int com_stats(int argc, char ** argv, void *arg_func, char **str_reply); +int com_stats(int argc, char ** argv, char **str_reply); -int com_exit(int argc, char ** argv, void *arg_func, char **str_reply); +int com_exit(int argc, char ** argv, char **str_reply); -int cmd_gdb_import(int argc, char ** argv, void *arg_func, char ** a_str_reply); -int cmd_gdb_export(int argc, char ** argv, void *arg_func, char ** a_str_reply); +int cmd_gdb_import(int argc, char ** argv, char ** a_str_reply); +int cmd_gdb_export(int argc, char ** argv, char ** a_str_reply); -int com_mempool_delete(int argc, char ** argv, void *arg_func, char ** a_str_reply); -int com_mempool_list(int argc, char ** argv, void *arg_func, char ** a_str_reply); -int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply); +int com_mempool_delete(int argc, char ** argv, char ** a_str_reply); +int com_mempool_list(int argc, char ** argv, char ** a_str_reply); +int com_mempool_proc(int argc, char ** argv, char ** a_str_reply); /** * Place public CA into the mempool */ -int com_mempool_add_ca( int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_reply); +int com_mempool_add_ca( int a_argc, char ** a_argv, char ** a_str_reply); diff --git a/modules/net/include/dap_chain_node_cli_cmd_tx.h b/modules/net/include/dap_chain_node_cli_cmd_tx.h index a7a1a4a317cd9bd34e74e437e3d28771e03c0499..b421eb9746df807871f40ccc7ce035fc7545e5c2 100644 --- a/modules/net/include/dap_chain_node_cli_cmd_tx.h +++ b/modules/net/include/dap_chain_node_cli_cmd_tx.h @@ -36,11 +36,11 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons * ledger command * */ -int com_ledger(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply); +int com_ledger(int a_argc, char ** a_argv, char **a_str_reply); /** * token command * */ -int com_token(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply); +int com_token(int a_argc, char ** a_argv, char **a_str_reply); diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index 2776ffc375fce58efb22973364bac68d1da3a12b..3b0ed4b3657700c2e8bdc0ff28a551d4e87304b5 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -82,7 +82,7 @@ typedef struct service_list { static service_list_t *s_srv_list = NULL; // for separate access to s_srv_list static pthread_mutex_t s_srv_list_mutex = PTHREAD_MUTEX_INITIALIZER; -static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_reply); +static int s_cli_net_srv(int argc, char **argv, char **a_str_reply); static void s_load(const char * a_path); static void s_load_all(void); @@ -98,22 +98,23 @@ int dap_chain_net_srv_init(dap_config_t * a_cfg) if( dap_chain_net_srv_order_init() != 0 ) return -1; - dap_chain_node_cli_cmd_item_create ("net_srv", s_cli_net_srv, NULL, "Network services managment", - "net_srv -net <chain net name> order find [-direction <sell|buy>][-srv_uid <Service UID>] [-price_unit <price unit>]\\\n" + dap_chain_node_cli_cmd_item_create ("net_srv", s_cli_net_srv, "Network services managment", + "net_srv -net <chain net name> order find [-direction {sell | buy}] [-srv_uid <Service UID>] [-price_unit <price unit>]\n" " [-price_token <Token ticker>] [-price_min <Price minimum>] [-price_max <Price maximum>]\n" "\tOrders list, all or by UID and/or class\n" "net_srv -net <chain net name> order delete -hash <Order hash>\n" "\tOrder delete\n" "net_srv -net <chain net name> order dump -hash <Order hash>\n" "\tOrder dump info\n" - "net_srv -net <chain net name> order create -direction <sell|buy> -srv_uid <Service UID> -price <Price>\\\n" - " -price_unit <Price Unit> -price_token <Token ticker> [-node_addr <Node Address>] [-tx_cond <TX Cond Hash>] \\\n" - " [-expires <Unix time when expires>] [-ext <Extension with params>]\\\n" - " [-cert <cert name to sign order>]\\\n" + "net_srv -net <chain net name> order create -direction <sell | buy> -srv_uid <Service UID> -price <Price>\n" + " -price_unit <Price Unit> -price_token <Token ticker> [-node_addr <Node Address>] [-tx_cond <TX Cond Hash>]\n" + " [-expires <Unix time when expires>] [-cert <cert name to sign order>]\n" + " [{-ext <Extension with params> | -region <Region name> -continent <Continent name>}]\n" + "\tOrder create\n" - "net_srv -net <chain net name> order static [save | delete]\\\n" + "net_srv -net <chain net name> order static [save | delete]\n" "\tStatic nodelist create/delete\n" - "net_srv -net <chain net name> order recheck\\\n" + "net_srv -net <chain net name> order recheck\n" "\tCheck the availability of orders\n" ); @@ -188,9 +189,8 @@ void dap_chain_net_srv_deinit(void) * @param a_str_reply * @return */ -static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_reply) +static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) { - UNUSED(arg_func); int arg_index = 1; dap_chain_net_t * l_net = NULL; @@ -388,7 +388,7 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re dap_chain_net_srv_order_t * l_orders; size_t l_orders_num = 0; if( dap_chain_net_srv_order_find_all_by( l_net, l_direction,l_srv_uid,l_price_unit,l_price_token_str,l_price_min, l_price_max,&l_orders,&l_orders_num) == 0 ){ - dap_string_append_printf(l_string_ret,"Found %u orders:\n",l_orders_num); + dap_string_append_printf(l_string_ret, "Found %zu orders:\n", l_orders_num); size_t l_orders_size = 0; for (size_t i = 0; i< l_orders_num; i++){ dap_chain_net_srv_order_t *l_order =(dap_chain_net_srv_order_t *) (((byte_t*) l_orders) + l_orders_size); @@ -397,12 +397,12 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re dap_string_append(l_string_ret,"\n"); } ret = 0; - }else{ + if (l_orders_num) + DAP_DELETE(l_orders); + }else{ ret = -5 ; dap_string_append(l_string_ret,"Can't get orders: some internal error or wrong params\n"); } - DAP_DELETE(l_orders); - }else if( dap_strcmp( l_order_str, "dump" ) == 0 ){ // Select with specified service uid if ( l_order_hash_str ){ @@ -498,7 +498,7 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re if (dap_chain_node_addr_from_str( &l_node_addr, l_node_addr_str ) == 0 ) log_it( L_DEBUG, "node addr " NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_node_addr) ); else - log_it( L_ERROR, "Can't parse \"%s\" as node addr"); + log_it( L_ERROR, "Can't parse \"%s\" as node addr", l_node_addr_str); } if (l_tx_cond_hash_str) dap_chain_hash_fast_from_str (l_tx_cond_hash_str, &l_tx_cond_hash); @@ -584,7 +584,7 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re } #endif else { - dap_string_append_printf(l_string_ret, "Unknown subcommand '%s'\n", l_order_str); + dap_string_append_printf(l_string_ret, "Command 'net_srv' requires subcommand 'order'"); ret = -3; } dap_chain_node_cli_set_reply_text(a_str_reply, l_string_ret->str); @@ -625,7 +625,7 @@ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid,dap_cha l_sdata->srv = l_srv; HASH_ADD(hh, s_srv_list, uid, sizeof(l_srv->uid), l_sdata); }else{ - log_it(L_ERROR, "Already present service with 0x%016llX ", a_uid.uint64); + log_it(L_ERROR, "Already present service with 0x%016"DAP_UINT64_FORMAT_X, a_uid.uint64); //l_srv = l_sdata->srv; } pthread_mutex_unlock(&s_srv_list_mutex); @@ -662,7 +662,7 @@ int dap_chain_net_srv_set_ch_callbacks(dap_chain_net_srv_uid_t a_uid, l_srv->callback_stream_ch_write = a_callback_stream_ch_write; l_srv->callback_stream_ch_closed = a_callback_stream_ch_closed; }else{ - log_it(L_ERROR, "Can't find service with 0x%016llX", a_uid.uint64); + log_it(L_ERROR, "Can't find service with 0x%016"DAP_UINT64_FORMAT_X, a_uid.uint64); l_ret= -1; } pthread_mutex_unlock(&s_srv_list_mutex); diff --git a/modules/net/srv/dap_chain_net_srv_client.c b/modules/net/srv/dap_chain_net_srv_client.c index 595a2802107b989c6d0c02a0a9c5a4d27b07934e..09ad3a42c8a8694da4e9614e050278aeea0fdaf5 100644 --- a/modules/net/srv/dap_chain_net_srv_client.c +++ b/modules/net/srv/dap_chain_net_srv_client.c @@ -22,11 +22,9 @@ You should have received a copy of the GNU General Public License along with any CellFrame SDK based project. If not, see <http://www.gnu.org/licenses/>. */ -#include "dap_common.h" - #include "dap_chain_net_srv.h" #include "dap_chain_net_srv_client.h" - +#include "dap_common.h" #define LOG_TAG "dap_chain_net_srv_client" diff --git a/modules/net/srv/dap_chain_net_srv_geoip.c b/modules/net/srv/dap_chain_net_srv_geoip.c index 70247873cc22c7f493e208f0cea677c98107df86..f174bb026a21fe4abc361096232ca6b375747751 100644 --- a/modules/net/srv/dap_chain_net_srv_geoip.c +++ b/modules/net/srv/dap_chain_net_srv_geoip.c @@ -25,12 +25,12 @@ #include <stdio.h> #include <stddef.h> +#include "dap_client_http.h" #include "dap_common.h" #include "dap_strfuncs.h" #include "dap_file_utils.h" #include "dap_enc_key.h" #include "dap_enc_base64.h" -#include "dap_client_http.h" #include "dap_chain_net_srv_geoip.h" #include "libmaxminddb/maxminddb.h" diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index a85237c4dff4d9a925832785a942e9c12986b03a..b8d0e53fdbe66523ea9f90cac4cdf865886eba6b 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -26,7 +26,6 @@ #include <strings.h> #include "dap_chain_net_srv_order.h" - #include "dap_hash.h" #include "dap_enc_base58.h" #include "dap_chain_global_db.h" @@ -369,13 +368,17 @@ int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_ dap_global_db_obj_t * l_orders = dap_chain_global_db_gr_load(l_gdb_group_str,&l_orders_count); log_it( L_DEBUG ,"Loaded %zd orders", l_orders_count); bool l_order_pass_first=true; - size_t l_order_passed_index = 0; - size_t l_orders_size = 0; + size_t l_order_passed_index; + size_t l_orders_size; lb_order_pass: l_order_passed_index = 0; l_orders_size = 0; for (size_t i=0; i< l_orders_count; i++){ dap_chain_net_srv_order_t * l_order = (dap_chain_net_srv_order_t *) l_orders[i].value; + if (l_order->version > 2 || l_order->direction > SERV_DIR_SELL || + dap_chain_net_srv_order_get_size(l_order) != l_orders[i].value_len) { + continue; // order is corrupted + } // Check direction if (a_direction != SERV_DIR_UNDEFINED ) if ( l_order->direction != a_direction ) @@ -474,8 +477,8 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d case SERV_DIR_BUY: dap_string_append_printf(a_str_out, " direction: SERV_DIR_BUY\n" ); break; } - dap_string_append_printf(a_str_out, " srv_uid: 0x%016llX\n", a_order->srv_uid.uint64 ); - dap_string_append_printf(a_str_out, " price: \xA0""%.7Lf (%"DAP_UINT64_FORMAT_U")\n", dap_chain_datoshi_to_coins(a_order->price) , a_order->price); + dap_string_append_printf(a_str_out, " srv_uid: 0x%016"DAP_UINT64_FORMAT_X"\n", a_order->srv_uid.uint64 ); + dap_string_append_printf(a_str_out, " price: %.7Lf (%"DAP_UINT64_FORMAT_U")\n", dap_chain_datoshi_to_coins(a_order->price) , a_order->price); if( a_order->price_unit.uint32 ) dap_string_append_printf(a_str_out, " price_unit: %s\n", dap_chain_net_srv_price_unit_uid_to_str(a_order->price_unit) ); if ( a_order->node_addr.uint64) diff --git a/modules/net/srv/dap_chain_net_srv_stream_session.c b/modules/net/srv/dap_chain_net_srv_stream_session.c index d5a20c27358fd4bc42af90c283ecc85aa18d4c37..e90ba9ddd7ded40c1017f7fb39a85b8c3afda630 100644 --- a/modules/net/srv/dap_chain_net_srv_stream_session.c +++ b/modules/net/srv/dap_chain_net_srv_stream_session.c @@ -22,9 +22,9 @@ You should have received a copy of the GNU General Public License along with any CellFrame SDK based project. If not, see <http://www.gnu.org/licenses/>. */ +#include "dap_chain_net_srv.h" #include "dap_common.h" #include "rand/dap_rand.h" -#include "dap_chain_net_srv.h" #include "dap_chain_net_srv_stream_session.h" #define LOG_TAG "dap_stream_ch_chain_net_srv_session" @@ -67,7 +67,7 @@ dap_chain_net_srv_usage_t* dap_chain_net_srv_usage_add (dap_chain_net_srv_stream pthread_mutex_lock(&a_srv_session->parent->mutex); HASH_ADD_INT( a_srv_session->usages, id,l_ret ); pthread_mutex_unlock(&a_srv_session->parent->mutex); - log_it( L_NOTICE, "Added service %s:0x%016llX , usage id: %d", l_ret->net->pub.name, a_srv->uid.uint64, l_ret->id); + log_it( L_NOTICE, "Added service %s:0x%016"DAP_UINT64_FORMAT_X" , usage id: %d", l_ret->net->pub.name, a_srv->uid.uint64, l_ret->id); return l_ret; }else{ log_it( L_ERROR, "Some NULLs was in input"); diff --git a/modules/net/srv/include/dap_chain_net_srv_common.h b/modules/net/srv/include/dap_chain_net_srv_common.h index cfad3553bc5790b235021f9ad27daf21816ea48d..a6ab4bf0838149ef687ecf8428623b05e75f979a 100755 --- a/modules/net/srv/include/dap_chain_net_srv_common.h +++ b/modules/net/srv/include/dap_chain_net_srv_common.h @@ -25,9 +25,9 @@ #pragma once #include <stdint.h> #include <stdbool.h> +#include "dap_server.h" #include "dap_common.h" #include "dap_math_ops.h" -#include "dap_server.h" #include "dap_stream_ch.h" #include "dap_chain_common.h" #include "dap_chain_ledger.h" diff --git a/modules/net/srv/include/dap_chain_net_srv_order.h b/modules/net/srv/include/dap_chain_net_srv_order.h index a39ef94d3bd625beebecb770cf2b883458c6b720..809305a7cfe03d28ee240ca2f710f6b12ec51e2e 100644 --- a/modules/net/srv/include/dap_chain_net_srv_order.h +++ b/modules/net/srv/include/dap_chain_net_srv_order.h @@ -23,10 +23,10 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic */ #pragma once +#include "dap_chain_net.h" #include "dap_common.h" #include "dap_string.h" #include "dap_chain_common.h" -#include "dap_chain_net.h" #include "dap_chain_net_srv_common.h" typedef struct dap_chain_net_srv_order diff --git a/modules/net/srv/libmaxminddb/maxminddb.c b/modules/net/srv/libmaxminddb/maxminddb.c index e7c9d3b921d2b3a431b0017c92fb5a2f26aed396..21c18f2b621555f33e5e0e2837ed29f16f661277 100644 --- a/modules/net/srv/libmaxminddb/maxminddb.c +++ b/modules/net/srv/libmaxminddb/maxminddb.c @@ -343,7 +343,7 @@ LOCAL int map_file(MMDB_s *const mmdb) status = MMDB_FILE_OPEN_ERROR; goto cleanup; } - fd = CreateFile(utf16_filename, GENERIC_READ, FILE_SHARE_READ, NULL, + fd = CreateFileW(utf16_filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (fd == INVALID_HANDLE_VALUE) { status = MMDB_FILE_OPEN_ERROR; diff --git a/modules/net/srv/libmaxminddb/mmdblookup.c b/modules/net/srv/libmaxminddb/mmdblookup.c index 66e9ef178e9d8e2913b78e2a60d274096788fde5..359a812eebfa37a4560232951c244c35522ac946 100644 --- a/modules/net/srv/libmaxminddb/mmdblookup.c +++ b/modules/net/srv/libmaxminddb/mmdblookup.c @@ -75,7 +75,7 @@ int wmain(int argc, wchar_t **wargv) utf8_width = WideCharToMultiByte(CP_UTF8, 0, wargv[i], -1, NULL, 0, NULL, NULL); if (utf8_width < 1) { - fprintf(stderr, "WideCharToMultiByte() failed: %d\n", + fprintf(stderr, "WideCharToMultiByte() failed: %ld\n", GetLastError()); exit(1); } @@ -86,7 +86,7 @@ int wmain(int argc, wchar_t **wargv) } if (WideCharToMultiByte(CP_UTF8, 0, wargv[i], -1, utf8_string, utf8_width, NULL, NULL) < 1) { - fprintf(stderr, "WideCharToMultiByte() failed: %d\n", + fprintf(stderr, "WideCharToMultiByte() failed: %ld\n", GetLastError()); exit(1); } @@ -340,8 +340,14 @@ LOCAL void dump_meta(MMDB_s *mmdb) char date[40]; const time_t epoch = (const time_t)mmdb->metadata.build_epoch; +#ifdef DAP_OS_WINDOWS +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat" +#endif strftime(date, 40, "%F %T UTC", gmtime(&epoch)); - +#ifdef DAP_OS_WINDOWS +#pragma GCC diagnostic pop +#endif fprintf(stdout, meta_dump, mmdb->metadata.node_count, mmdb->metadata.record_size, diff --git a/modules/service/stake/dap_chain_net_srv_stake.c b/modules/service/stake/dap_chain_net_srv_stake.c index b5cd774ea8dc3069f380d9d70385c18386f0a4d1..31a05d446cc7980f4aff9c7f2121cf544d53f7e1 100644 --- a/modules/service/stake/dap_chain_net_srv_stake.c +++ b/modules/service/stake/dap_chain_net_srv_stake.c @@ -23,17 +23,17 @@ */ #include <math.h> +#include "dap_chain_node_cli.h" #include "dap_string.h" #include "dap_enc_base58.h" #include "dap_chain_common.h" -#include "dap_chain_node_cli.h" #include "dap_chain_mempool.h" #include "dap_chain_net_srv_common.h" #include "dap_chain_net_srv_stake.h" #define LOG_TAG "dap_chain_net_srv_stake" -static int s_cli_srv_stake(int a_argc, char **a_argv, void *a_arg_func, char **a_str_reply); +static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply); static dap_chain_net_srv_stake_t *s_srv_stake; @@ -45,7 +45,7 @@ static dap_chain_net_srv_stake_t *s_srv_stake; */ int dap_chain_net_srv_stake_init() { - dap_chain_node_cli_cmd_item_create("srv_stake", s_cli_srv_stake, NULL, "Delegated stake service commands", + dap_chain_node_cli_cmd_item_create("srv_stake", s_cli_srv_stake, "Delegated stake service commands", "srv_stake order create -net <net name> -from_addr <addr> -token <ticker> -coins <value> -cert <name> -fee_percent <value>\n" "\tCreate a new order with specified amount of datoshi to delegate it to the specified address." "The fee with specified percent with this delagation will be returned to the fee address pointed by delegator\n" @@ -69,7 +69,7 @@ int dap_chain_net_srv_stake_init() for (uint16_t i = 0; i < l_net_count; i++) { dap_ledger_t *l_ledger = l_net_list[i]->pub.ledger; dap_chain_datum_tx_t *l_tx_tmp; - dap_chain_hash_fast_t l_tx_cur_hash = { 0 }; // start hash + dap_chain_hash_fast_t l_tx_cur_hash = {}; // start hash dap_chain_tx_out_cond_t *l_out_cond; int l_out_cond_idx; char l_token[DAP_CHAIN_TICKER_SIZE_MAX]; @@ -278,7 +278,7 @@ static bool s_stake_tx_put(dap_chain_datum_tx_t *a_tx, dap_chain_net_t *a_net) return false; } // Processing will be made according to autoprocess policy - if (dap_chain_mempool_datum_add(l_datum, l_chain)) { + if (!dap_chain_mempool_datum_add(l_datum, l_chain)) { DAP_DELETE(l_datum); return false; } @@ -355,8 +355,25 @@ char *s_stake_order_create(dap_chain_net_srv_stake_item_t *a_item, dap_enc_key_t dap_chain_net_srv_stake_item_t *s_stake_item_from_order(dap_chain_net_t *a_net, dap_chain_net_srv_order_t *a_order) { - dap_chain_net_srv_stake_item_t *l_item = DAP_NEW_Z(dap_chain_net_srv_stake_item_t); + if (a_order->version < 2) { + log_it(L_WARNING, "Order is unsigned"); + return NULL; + } dap_srv_stake_order_ext_t *l_ext = (dap_srv_stake_order_ext_t *)a_order->ext; + dap_sign_t *l_sign = (dap_sign_t *)(&a_order->ext[a_order->ext_size]); + if (!dap_sign_verify(l_sign, a_order, dap_chain_net_srv_order_get_size(a_order))) { + log_it(L_WARNING, "Order sign is invalid"); + return NULL; + } + dap_hash_fast_t l_pkey_hash; + dap_sign_get_pkey_hash(l_sign, &l_pkey_hash); + dap_chain_addr_t l_cert_addr; + dap_chain_addr_fill(&l_cert_addr, l_sign->header.type, &l_pkey_hash, a_net->pub.id); + dap_chain_net_srv_stake_item_t *l_item = DAP_NEW_Z(dap_chain_net_srv_stake_item_t); + if (memcmp(&l_cert_addr, &l_ext->addr_to, sizeof(dap_chain_addr_t))) { + log_it(L_WARNING, "Order sign addr & addr_to are different"); + return NULL; + } memcpy(&l_item->addr_from, &l_ext->addr_from, sizeof(dap_chain_addr_t)); memcpy(&l_item->addr_to, &l_ext->addr_to, sizeof(dap_chain_addr_t)); l_item->fee_value = l_ext->fee_value; @@ -646,7 +663,7 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha // TODO add filters to list (token, address, etc.) l_stake = s_stake_item_from_order(l_net, l_order); char *l_addr = dap_chain_addr_to_str(&l_stake->addr_to); - dap_string_append_printf(l_reply_str, "%s %lu %s %s %llf\n", l_orders[i].key, l_stake->value, l_stake->token, + dap_string_append_printf(l_reply_str, "%s %"DAP_UINT64_FORMAT_U" %s %s %Lf\n", l_orders[i].key, l_stake->value, l_stake->token, l_addr, l_stake->fee_value); DAP_DELETE(l_addr); DAP_DELETE(l_stake); @@ -666,9 +683,8 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha return 0; } -static int s_cli_srv_stake(int a_argc, char **a_argv, void *a_arg_func, char **a_str_reply) +static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) { - UNUSED(a_arg_func); enum { CMD_NONE, CMD_ORDER, CMD_DELEGATE, CMD_TX, CMD_INVALIDATE }; @@ -740,6 +756,12 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void *a_arg_func, char **a dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_find_by_hash_str(l_net, l_order_hash_str); if (l_order) { dap_chain_net_srv_stake_item_t *l_stake = s_stake_item_from_order(l_net, l_order); + if (!l_stake) { + DAP_DELETE(l_order); + DAP_DELETE(l_addr_fee); + dap_chain_node_cli_set_reply_text(a_str_reply, "Specified order is invalid"); + return -22; + } memcpy(&l_stake->addr_fee, l_addr_fee, sizeof(dap_chain_addr_t)); DAP_DELETE(l_addr_fee); // Create conditional transaction @@ -789,7 +811,7 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void *a_arg_func, char **a char *l_addr_from_str = dap_chain_addr_to_str(&l_stake->addr_from); char *l_addr_to_str = dap_chain_addr_to_str(&l_stake->addr_to); char *l_addr_fee_str = dap_chain_addr_to_str(&l_stake->addr_fee); - dap_string_append_printf(l_reply_str, "%s %s %lu %s %s %s %llf\n", l_tx_hash_str, l_stake->token, + dap_string_append_printf(l_reply_str, "%s %s %"DAP_UINT64_FORMAT_U" %s %s %s %Lf\n", l_tx_hash_str, l_stake->token, l_stake->value, l_addr_from_str, l_addr_to_str, l_addr_fee_str, l_stake->fee_value); DAP_DELETE(l_tx_hash_str); diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c index c653df47a16de9735a236c415e021433ab92208c..5c280e7e697c21e01d0aff944d401f2d0228166e 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn.c @@ -380,7 +380,7 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void if(s_debug_more){ char l_addrbuf[INET_ADDRSTRLEN]= { [0]='\0'}; inet_ntop(AF_INET,&l_msg->ip_assigment.addr, l_addrbuf, sizeof (l_addrbuf)); - log_it(L_DEBUG, "Tun:%u message: send %zd bytes for ch vpn protocol",a_esocket_queue->worker->id, + log_it(L_DEBUG, "Tun:%u message: send %u bytes for ch vpn protocol",a_esocket_queue->worker->id, l_msg->ch_vpn_send.pkt->header.op_data.data_size ); } if(dap_worker_esocket_find_uuid( a_esocket_queue->worker, l_msg->esocket_uuid )== l_msg->esocket ){ @@ -682,7 +682,7 @@ static int s_vpn_tun_create(dap_config_t * g_config) s_raw_server->ipv4_lease_last.s_addr = s_raw_server->ipv4_gw.s_addr; s_raw_server->auto_cpu_reassignment = dap_config_get_item_bool_default(g_config, "srv_vpn", "auto_cpu_reassignment", false); - log_it(L_NOTICE,"auto cpu reassignment is set to '%s'", s_raw_server->auto_cpu_reassignment); + log_it(L_NOTICE, "Auto cpu reassignment is set to '%s'", s_raw_server->auto_cpu_reassignment ? "true" : "false"); memset(&s_raw_server->ifr, 0, sizeof(s_raw_server->ifr)); s_raw_server->ifr.ifr_flags = IFF_TUN | IFF_MULTI_QUEUE| IFF_NO_PI; @@ -882,7 +882,7 @@ int dap_chain_net_srv_vpn_init(dap_config_t * g_config) { s_ch_packet_out); // add console command to display vpn statistics - dap_chain_node_cli_cmd_item_create ("vpn_stat", com_vpn_statistics, NULL, "VPN statistics", + dap_chain_node_cli_cmd_item_create ("vpn_stat", com_vpn_statistics, "VPN statistics", "vpn_stat -net <net name> [-full]\n" ); return 0; @@ -1646,7 +1646,7 @@ static void s_es_tun_error(dap_events_socket_t * a_es, int a_error) { if (! a_es->_inheritor) return; - log_it(L_ERROR,"%s: error %d in socket %u (socket type %d)", a_error, __PRETTY_FUNCTION__, a_es->socket, a_es->type); + log_it(L_ERROR,"%s: error %d in socket %"DAP_FORMAT_SOCKET" (socket type %d)", __PRETTY_FUNCTION__, a_error, a_es->socket, a_es->type); } /** diff --git a/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c b/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c index c8328f2c066e59a4276483dd1ad3527084d0a5e7..d8e943f77d94b9742c3182f5fcea002538a86492 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c @@ -30,7 +30,7 @@ static void add_value_text(dap_string_t *l_str, char *l_addstr, uintmax_t a_valu * * VPN statistics */ -int com_vpn_statistics(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply) +int com_vpn_statistics(int a_argc, char ** a_argv, char **a_str_reply) { dap_stream_ch_t* a_ch; dap_stream_t * stream; @@ -48,10 +48,10 @@ int com_vpn_statistics(int a_argc, char ** a_argv, void *arg_func, char **a_str_ dap_string_append_printf(l_str, "VPN connection %d\n", l_conn); l_conn++; // time start/length - time_t l_time_len_sec = time(NULL) - l_session->time_created; + uint32_t l_time_len_sec = time(NULL) - l_session->time_created; char l_buf[1024]; if(dap_time_to_str_rfc822(l_buf, sizeof(l_buf), l_session->time_created) > 0) - dap_string_append_printf(l_str, " start at %s (length %02d:%02d:%02d)\n", l_buf, + dap_string_append_printf(l_str, " start at %s (length %02u:%02u:%02u)\n", l_buf, l_time_len_sec / 3600, (l_time_len_sec % 3600) / 60, l_time_len_sec % 60); // client ip const int l_tun_client_addr_str_len = 128; @@ -64,10 +64,10 @@ int com_vpn_statistics(int a_argc, char ** a_argv, void *arg_func, char **a_str_ add_value_text(l_str, " recv lost.........", l_stats.bytes_recv_lost); add_value_text(l_str, " send..............", l_stats.bytes_sent); add_value_text(l_str, " send lost.........", l_stats.bytes_sent_lost); - dap_string_append_printf(l_str, " packets recv.......%d\n", l_stats.packets_recv); - dap_string_append_printf(l_str, " packets recv lost..%d\n", l_stats.packets_recv_lost); - dap_string_append_printf(l_str, " packets send.......%d\n", l_stats.packets_sent); - dap_string_append_printf(l_str, " packets send lost..%d\n", l_stats.packets_sent_lost); + dap_string_append_printf(l_str, " packets recv.......%ld\n", l_stats.packets_recv); + dap_string_append_printf(l_str, " packets recv lost..%ld\n", l_stats.packets_recv_lost); + dap_string_append_printf(l_str, " packets send.......%ld\n", l_stats.packets_sent); + dap_string_append_printf(l_str, " packets send lost..%ld\n", l_stats.packets_sent_lost); // average bitrate double l_bitrate = (l_stats.bytes_recv - l_stats.bytes_recv_lost + l_stats.bytes_sent - l_stats.bytes_sent_lost) * 1. / l_time_len_sec; @@ -95,7 +95,7 @@ int com_vpn_statistics(int a_argc, char ** a_argv, void *arg_func, char **a_str_ * * VPN client control */ -int com_vpn_client(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply) +int com_vpn_client(int a_argc, char ** a_argv, char **a_str_reply) { #ifndef _WIN32 enum { diff --git a/modules/service/vpn/dap_chain_net_srv_vpn_cmd.h b/modules/service/vpn/dap_chain_net_srv_vpn_cmd.h index 0a70e7791c640db79c8f12b506425c10efa1bdbe..e0048f944d583e84e6cdd1e126d47e5112de864e 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn_cmd.h +++ b/modules/service/vpn/dap_chain_net_srv_vpn_cmd.h @@ -1,6 +1,6 @@ #pragma once // VPN statistics -int com_vpn_statistics(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply); +int com_vpn_statistics(int a_argc, char ** a_argv, char **a_str_reply); // vpn_client command -int com_vpn_client(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply); +int com_vpn_client(int a_argc, char ** a_argv, char **a_str_reply); diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c index d7f3a180174e12eff5fda443ca7cb7cc338624c8..8383b3203c0535bf3af4f7d90b6e755a08f8b88e 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client.c +++ b/modules/service/vpn/dap_chain_net_vpn_client.c @@ -160,7 +160,7 @@ static dap_chain_hash_fast_t* dap_chain_net_vpn_client_tx_cond_hash(dap_chain_ne } // If loaded lets check is it spent or not if(l_tx_cond_hash) { - log_it(L_DEBUG, "2791: Search for unspent tx, net %s", a_net); + log_it(L_DEBUG, "2791: Search for unspent tx, net %s", a_net->pub.name); dap_chain_datum_tx_t *l_tx = dap_chain_net_get_tx_by_hash(a_net, l_tx_cond_hash, TX_SEARCH_TYPE_NET_UNSPENT); if(!l_tx) { // If not found - all outs are used. Create new one // pass all chains @@ -169,7 +169,7 @@ static dap_chain_hash_fast_t* dap_chain_net_vpn_client_tx_cond_hash(dap_chain_ne l_tx_cond_hash = NULL; if(l_tx) { l_tx_cond_ts = (time_t) l_tx->header.ts_created; - log_it(L_DEBUG, "2791: got some tx, created %d", l_tx->header.ts_created); + log_it(L_DEBUG, "2791: got some tx, created %"DAP_UINT64_FORMAT_U, l_tx->header.ts_created); } } } @@ -248,13 +248,12 @@ static dap_chain_hash_fast_t* dap_chain_net_vpn_client_tx_cond_hash(dap_chain_ne log_it(L_ERROR, "Can't create condition for user"); } else { // save transaction for login - dap_chain_global_db_gr_set("client_tx_cond_hash", l_tx_cond_hash, sizeof(dap_chain_hash_fast_t), + dap_chain_global_db_gr_set(dap_strdup("client_tx_cond_hash"), l_tx_cond_hash, sizeof(dap_chain_hash_fast_t), l_gdb_group); } //DAP_DELETE(l_addr_from_str); DAP_DELETE(l_pub_key_data); } - DAP_DELETE(l_tx_cond_hash); dap_enc_key_delete(l_enc_key); DAP_DELETE(l_gdb_group); return l_tx_cond_hash; @@ -682,7 +681,7 @@ int dap_chain_net_vpn_client_init(dap_config_t * g_config) pthread_mutex_init(&sf_socks_mutex, NULL); // vpn client command - dap_chain_node_cli_cmd_item_create ("vpn_client", com_vpn_client, NULL, "VPN client control", + dap_chain_node_cli_cmd_item_create ("vpn_client", com_vpn_client, "VPN client control", "vpn_client [start -addr <server address> -port <server port>| stop | status] -net <net name>\n" "vpn_client init -w <wallet name> -token <token name> -value <value> -net <net name>\n" "vpn_client stop -net <net name>\n" diff --git a/modules/service/vpn/dap_chain_net_vpn_client_tun.c b/modules/service/vpn/dap_chain_net_vpn_client_tun.c index a2e8370e1ef9b060c79bda5863110798224e2815..296a02586cd4d0969a92be0dbde69d6175c9a26b 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client_tun.c +++ b/modules/service/vpn/dap_chain_net_vpn_client_tun.c @@ -625,8 +625,7 @@ int ch_sf_tun_addr_leased(dap_chain_net_srv_ch_vpn_t * a_sf, ch_vpn_pkt_t * a_pk size_t l_route_net_count = 0; if(a_pkt_data_size < (sizeof(l_addr) + sizeof(l_gw))) { - log_it(L_ERROR, "Too small ADDR_REPLY packet (%u bytes, need at least %u" - , a_pkt_data_size, sizeof(l_addr)); + log_it(L_ERROR, "Too small ADDR_REPLY packet (%zu bytes, need at least %zu", a_pkt_data_size, sizeof(l_addr)); return -1; } @@ -640,7 +639,7 @@ int ch_sf_tun_addr_leased(dap_chain_net_srv_ch_vpn_t * a_sf, ch_vpn_pkt_t * a_pk char l_gw_buf[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &l_addr, l_addr_buf, sizeof(l_addr_buf)); inet_ntop(AF_INET, &l_gw, l_gw_buf, sizeof(l_gw_buf)); - log_it(L_INFO,"Leased address %s with gateway %s", l_addr, l_gw_buf); + log_it(L_INFO, "Leased address %s with gateway %s", l_addr_buf, l_gw_buf); // start new tun connection with vpn address and vpn gateway int l_res = dap_chain_net_vpn_client_tun_create(l_addr_buf, l_gw_buf); diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c index eb27c36403b75a9f9fb4ef68f03dcfd41248d5e8..d36662f7279e17bc15040a9c3c2d7862ea42a898 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -23,16 +23,16 @@ */ #include <math.h> +#include "dap_chain_node_cli.h" #include "dap_string.h" #include "dap_chain_common.h" -#include "dap_chain_node_cli.h" #include "dap_chain_mempool.h" #include "dap_chain_net_srv_common.h" #include "dap_chain_net_srv_xchange.h" #define LOG_TAG "dap_chain_net_srv_xchange" -static int s_cli_srv_xchange(int a_argc, char **a_argv, void *a_arg_func, char **a_str_reply); +static int s_cli_srv_xchange(int a_argc, char **a_argv, char **a_str_reply); static int s_callback_requested(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_t *a_srv_client, const void *a_data, size_t a_data_size); static int s_callback_response_success(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_t *a_srv_client, const void *a_data, size_t a_data_size); static int s_callback_response_error(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_t *a_srv_client, const void *a_data, size_t a_data_size); @@ -49,7 +49,7 @@ static dap_chain_net_srv_xchange_t *s_srv_xchange; */ int dap_chain_net_srv_xchange_init() { - dap_chain_node_cli_cmd_item_create("srv_xchange", s_cli_srv_xchange, NULL, "eXchange service commands", + dap_chain_node_cli_cmd_item_create("srv_xchange", s_cli_srv_xchange, "eXchange service commands", "srv_xchange price create -net_sell <net name> -token_sell <token ticker> -net_buy <net_name> -token_buy <token ticker>" "-wallet <name> -coins <value> -rate <value>\n" "\tCreate a new price with specified amount of datoshi to exchange with specified rate (sell : buy)\n" @@ -327,7 +327,7 @@ static bool s_xchange_tx_put(dap_chain_datum_tx_t *a_tx, dap_chain_net_t *a_net) return false; } // Processing will be made according to autoprocess policy - if (dap_chain_mempool_datum_add(l_datum, l_chain)) { + if (!dap_chain_mempool_datum_add(l_datum, l_chain)) { DAP_DELETE(l_datum); return false; } @@ -765,7 +765,7 @@ static int s_cli_srv_xchange_price(int a_argc, char **a_argv, int a_arg_index, c dap_string_t *l_reply_str = dap_string_new(""); HASH_ITER(hh, s_srv_xchange->pricelist, l_price, l_tmp) { char *l_order_hash_str = dap_chain_hash_fast_to_str_new(&l_price->order_hash); - dap_string_append_printf(l_reply_str, "%s %s %s %s %s %lu %llf %s\n", l_order_hash_str, l_price->token_sell, + dap_string_append_printf(l_reply_str, "%s %s %s %s %s %"DAP_UINT64_FORMAT_U" %Lf %s\n", l_order_hash_str, l_price->token_sell, l_price->net_sell->pub.name, l_price->token_buy, l_price->net_buy->pub.name, l_price->datoshi_sell, l_price->rate, l_price->wallet_str); DAP_DELETE(l_order_hash_str); @@ -783,9 +783,8 @@ static int s_cli_srv_xchange_price(int a_argc, char **a_argv, int a_arg_index, c return 0; } -static int s_cli_srv_xchange(int a_argc, char **a_argv, void *a_arg_func, char **a_str_reply) +static int s_cli_srv_xchange(int a_argc, char **a_argv, char **a_str_reply) { - UNUSED(a_arg_func); enum { CMD_NONE, CMD_PRICE, CMD_ORDERS, CMD_PURCHASE, CMD_ENABLE, CMD_DISABLE }; @@ -833,7 +832,7 @@ static int s_cli_srv_xchange(int a_argc, char **a_argv, void *a_arg_func, char * continue; // TODO add filters to list (tokens, network, etc.) l_price = s_xchange_price_from_order(l_net, l_order); - dap_string_append_printf(l_reply_str, "%s %s %s %s %s %lu %llf\n", l_orders[i].key, l_price->token_sell, + dap_string_append_printf(l_reply_str, "%s %s %s %s %s %"DAP_UINT64_FORMAT_U" %Lf\n", l_orders[i].key, l_price->token_sell, l_price->net_sell->pub.name, l_price->token_buy, l_price->net_buy->pub.name, l_price->datoshi_sell, l_price->rate); DAP_DELETE(l_price); diff --git a/modules/type/blocks/dap_chain_block.c b/modules/type/blocks/dap_chain_block.c index 643bb69c8fd61a0bc3c8b97b3293b41230fc30a5..e9a6836f5f1f3b59eab751fe1a38c93505be62e4 100644 --- a/modules/type/blocks/dap_chain_block.c +++ b/modules/type/blocks/dap_chain_block.c @@ -128,11 +128,11 @@ size_t dap_chain_block_meta_add(dap_chain_block_t ** a_block_ptr, size_t a_block return 0; } if(l_block->hdr.meta_count == UINT16_MAX){ - log_it(L_ERROR,"Meta add: Can't add more, maximum meta count %u is achieved", UINT16_MAX); + log_it(L_ERROR,"Meta add: Can't add more, maximum meta count %hu is achieved", UINT16_MAX); return 0; } if( UINT32_MAX - l_block->hdr.meta_n_datum_n_signs_size < a_data_size + sizeof (l_meta->hdr) ){ - log_it(L_ERROR,"Meta add: Can't add more, maximum block data section size %zd achieved", UINT32_MAX); + log_it(L_ERROR,"Meta add: Can't add more, maximum block data section size %u achieved", UINT32_MAX); return 0; } @@ -187,7 +187,7 @@ size_t dap_chain_block_datum_add(dap_chain_block_t ** a_block_ptr, size_t a_bloc } // Check if size of of block size if (l_datum_size+l_offset >(a_block_size-sizeof (l_block->hdr))){ - log_it(L_ERROR,"Datum size is too big %zf thats with offset %zd is bigger than block size %zd (without header)", l_datum_size, l_offset, + log_it(L_ERROR,"Datum size is too big %zu thats with offset %zu is bigger than block size %zu (without header)", l_datum_size, l_offset, (a_block_size-sizeof (l_block->hdr))); return a_block_size; } @@ -208,7 +208,7 @@ size_t dap_chain_block_datum_add(dap_chain_block_t ** a_block_ptr, size_t a_bloc l_block->hdr.meta_n_datum_n_signs_size = l_offset; return l_offset+sizeof (l_block->hdr); }else{ - log_it(L_ERROR,""); + //log_it(L_ERROR,""); return a_block_size; } } @@ -243,7 +243,7 @@ size_t dap_chain_block_datum_del_by_hash(dap_chain_block_t ** a_block_ptr, size_ } // Check if size of of block size if (l_datum_size+l_offset >(a_block_size-sizeof (l_block->hdr))){ - log_it(L_ERROR,"Datum size is too big %zf thats with offset %zd is bigger than block size %zd(without hdr)", l_datum_size, l_offset, + log_it(L_ERROR,"Datum size is too big %zu thats with offset %zu is bigger than block size %zu(without hdr)", l_datum_size, l_offset, (a_block_size-sizeof (l_block->hdr))); return a_block_size; } @@ -301,7 +301,7 @@ static size_t s_block_get_sign_offset(dap_chain_block_t * a_block, size_t a_bloc } // Check if size of of block size if ( (l_datum_size+l_offset) > (a_block_size-sizeof (a_block->hdr)) ){ - log_it(L_ERROR,"Datum size is too big %zf thats with offset %zd is bigger than block size %zd", l_datum_size, l_offset, a_block_size); + log_it(L_ERROR,"Datum size is too big %zu thats with offset %zu is bigger than block size %zu", l_datum_size, l_offset, a_block_size); return a_block_size; } l_offset += l_datum_size; @@ -400,7 +400,7 @@ dap_chain_datum_t** dap_chain_block_get_datums(dap_chain_block_t * a_block, size } // Check if size of of block size if (l_datum_size+l_offset >(a_block_size-sizeof (a_block->hdr))){ - log_it(L_ERROR,"Datum size is too big %zf thats with offset %zd is bigger than block size %zd (without header)", l_datum_size, l_offset, + log_it(L_ERROR,"Datum size is too big %zu thats with offset %zu is bigger than block size %zu (without header)", l_datum_size, l_offset, (a_block_size-sizeof (a_block->hdr))); return l_ret; } @@ -428,7 +428,7 @@ dap_chain_datum_t** dap_chain_block_get_datums(dap_chain_block_t * a_block, size dap_chain_block_meta_t** dap_chain_block_get_meta(dap_chain_block_t * a_block, size_t a_block_size,size_t * a_meta_count ) { if( a_block_size < sizeof(a_block->hdr) ){ - log_it(L_ERROR,"Meta add: Corrupted block size %zd thats smaller then block header size %zd ", a_block_size, sizeof (a_block->hdr)); + log_it(L_ERROR,"Meta add: Corrupted block size %zu thats smaller then block header size %zu ", a_block_size, sizeof (a_block->hdr)); } *a_meta_count = a_block->hdr.meta_count; if (a_block->hdr.meta_count ==0) // no meta - nothing to return @@ -489,7 +489,7 @@ void dap_chain_block_meta_extract(dap_chain_block_meta_t ** a_meta, size_t a_met switch (l_meta->hdr.type) { case DAP_CHAIN_BLOCK_META_GENESIS: if(l_was_genesis){ - log_it(L_WARNING, "Genesis meta could be only one in the block, meta #%u is ignored ", i); + log_it(L_WARNING, "Genesis meta could be only one in the block, meta #%zu is ignored ", i); break; } l_was_genesis = true; @@ -498,7 +498,7 @@ void dap_chain_block_meta_extract(dap_chain_block_meta_t ** a_meta, size_t a_met break; case DAP_CHAIN_BLOCK_META_PREV: if(l_was_prev){ - log_it(L_WARNING, "Prev meta could be only one in the block, meta #%u is ignored ", i); + log_it(L_WARNING, "Prev meta could be only one in the block, meta #%zu is ignored ", i); break; } l_was_prev = true; @@ -506,12 +506,12 @@ void dap_chain_block_meta_extract(dap_chain_block_meta_t ** a_meta, size_t a_met if (l_meta->hdr.data_size == sizeof (*a_block_prev_hash) ) memcpy(a_block_prev_hash, l_meta->data, l_meta->hdr.data_size); else - log_it(L_WARNING, "Meta #%zd PREV has wrong size %zd when expecting %zd",i, l_meta->hdr.data_size, sizeof (*a_block_prev_hash)); + log_it(L_WARNING, "Meta #%zu PREV has wrong size %hu when expecting %zu",i, l_meta->hdr.data_size, sizeof (*a_block_prev_hash)); } break; case DAP_CHAIN_BLOCK_META_ANCHOR: if(l_was_anchor){ - log_it(L_WARNING, "Anchor meta could be only one in the block, meta #%u is ignored ", i); + log_it(L_WARNING, "Anchor meta could be only one in the block, meta #%zu is ignored ", i); break; } l_was_anchor = true; @@ -519,7 +519,7 @@ void dap_chain_block_meta_extract(dap_chain_block_meta_t ** a_meta, size_t a_met if (l_meta->hdr.data_size == sizeof (*a_block_anchor_hash) ) memcpy(a_block_anchor_hash, l_meta->data, l_meta->hdr.data_size); else - log_it(L_WARNING, "Anchor meta #%zd has wrong size %zd when expecting %zd",i, l_meta->hdr.data_size, sizeof (*a_block_prev_hash)); + log_it(L_WARNING, "Anchor meta #%zu has wrong size %hu when expecting %zu",i, l_meta->hdr.data_size, sizeof (*a_block_prev_hash)); } break; case DAP_CHAIN_BLOCK_META_LINK: @@ -536,12 +536,12 @@ void dap_chain_block_meta_extract(dap_chain_block_meta_t ** a_meta, size_t a_met memcpy(&a_block_links[*a_block_links_count], l_meta->data, l_meta->hdr.data_size); (*a_block_links_count)++; }else - log_it(L_WARNING, "Link meta #%zd has wrong size %zd when expecting %zd", i, l_meta->hdr.data_size, sizeof (*a_block_prev_hash)); + log_it(L_WARNING, "Link meta #%zu has wrong size %hu when expecting %zu", i, l_meta->hdr.data_size, sizeof (*a_block_prev_hash)); } break; case DAP_CHAIN_BLOCK_META_NONCE: if(l_was_nonce){ - log_it(L_WARNING, "NONCE could be only one in the block, meta #%u is ignored ", i); + log_it(L_WARNING, "NONCE could be only one in the block, meta #%zu is ignored ", i); break; } l_was_nonce = true; @@ -550,12 +550,12 @@ void dap_chain_block_meta_extract(dap_chain_block_meta_t ** a_meta, size_t a_met if (l_meta->hdr.data_size == sizeof (*a_nonce ) ) memcpy(a_nonce, l_meta->data, l_meta->hdr.data_size); else - log_it(L_WARNING, "NONCE meta #%zd has wrong size %zd when expecting %zd",i, l_meta->hdr.data_size, sizeof (*a_nonce)); + log_it(L_WARNING, "NONCE meta #%zu has wrong size %hu when expecting %zu",i, l_meta->hdr.data_size, sizeof (*a_nonce)); } break; case DAP_CHAIN_BLOCK_META_NONCE2: if(l_was_nonce2){ - log_it(L_WARNING, "NONCE2 could be only one in the block, meta #%u is ignored ", i); + log_it(L_WARNING, "NONCE2 could be only one in the block, meta #%zu is ignored ", i); break; } l_was_nonce2 = true; @@ -563,10 +563,10 @@ void dap_chain_block_meta_extract(dap_chain_block_meta_t ** a_meta, size_t a_met if (l_meta->hdr.data_size == sizeof (*a_nonce2 ) ) memcpy(a_nonce2, l_meta->data, l_meta->hdr.data_size); else - log_it(L_WARNING, "NONCE2 meta #%zd has wrong size %zd when expecting %zd",i, l_meta->hdr.data_size, sizeof (*a_nonce2)); + log_it(L_WARNING, "NONCE2 meta #%zd has wrong size %hu when expecting %zu",i, l_meta->hdr.data_size, sizeof (*a_nonce2)); } break; - default: { log_it(L_WARNING, "Unknown meta #%zd type 0x%02x (size %zd), possible corrupted block or you need to upgrade your software", + default: { log_it(L_WARNING, "Unknown meta #%zu type 0x%02hx (size %hu), possible corrupted block or you need to upgrade your software", i, l_meta->hdr.type, l_meta->hdr.type); } } } diff --git a/modules/type/blocks/dap_chain_block_chunk.c b/modules/type/blocks/dap_chain_block_chunk.c index 6f39238f6cc58d4a86c420309cc467657da3aae8..4661144d4cee82461ff92dd7e30e642f65beff43 100644 --- a/modules/type/blocks/dap_chain_block_chunk.c +++ b/modules/type/blocks/dap_chain_block_chunk.c @@ -20,9 +20,9 @@ You should have received a copy of the GNU General Public License along with any DAP SDK based project. If not, see <http://www.gnu.org/licenses/>. */ +#include "dap_chain_net.h" #include "dap_common.h" #include "dap_strfuncs.h" -#include "dap_chain_net.h" #include "dap_chain_global_db.h" #include "dap_chain_block_chunk.h" diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 19a46d4e4d4b8e24e1d635d57a7dbe5a540ece30..7829cd030c77be64574593ee7eb9b40dddac3ca4 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -22,10 +22,10 @@ */ #include <pthread.h> +#include "dap_chain_net.h" #include "dap_common.h" #include "dap_enc_base58.h" #include "dap_chain.h" -#include "dap_chain_net.h" #include "dap_chain_cs.h" #include "dap_chain_cs_blocks.h" #include "dap_chain_block.h" @@ -85,7 +85,7 @@ typedef struct dap_chain_cs_blocks_iter static int s_cli_parse_cmd_hash(char ** a_argv, int a_arg_index, int a_argc, char **a_str_reply,const char * a_param, dap_chain_hash_fast_t * a_datum_hash); static void s_cli_meta_hash_print( dap_string_t * a_str_tmp, const char * a_meta_title, dap_chain_block_meta_t * a_meta); -static int s_cli_blocks(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply); +static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply); // Setup BFT consensus and select the longest chunk static void s_bft_consensus_setup(dap_chain_cs_blocks_t * a_blocks); @@ -135,7 +135,7 @@ int dap_chain_cs_blocks_init() { dap_chain_cs_type_add("blocks", dap_chain_cs_blocks_new ); s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false); - dap_chain_node_cli_cmd_item_create ("block", s_cli_blocks, NULL, "Create and explore blockchains", + dap_chain_node_cli_cmd_item_create ("block", s_cli_blocks, "Create and explore blockchains", "New block create, fill and complete commands:" "\tblock -net <chain net name> -chain <chain name> new\n" "\t\tCreate new block and flush memory if was smth formed before\n\n" @@ -290,7 +290,7 @@ static void s_cli_meta_hash_print( dap_string_t * a_str_tmp, const char * a_met { if(a_meta->hdr.data_size == sizeof (dap_chain_hash_fast_t) ){ char * l_hash_str = dap_chain_hash_fast_to_str_new( (dap_chain_hash_fast_t *) a_meta->data); - dap_string_append_printf(a_str_tmp,"\t\tPREV: \"%s\"\n", a_meta_title,l_hash_str); + dap_string_append_printf(a_str_tmp,"\t\tPREV: \"%s\": 0x%s\n", a_meta_title,l_hash_str); DAP_DELETE(l_hash_str); }else{ char * l_data_hex = DAP_NEW_Z_SIZE(char,a_meta->hdr.data_size*2+3); @@ -320,9 +320,8 @@ static void s_cli_meta_hex_print( dap_string_t * a_str_tmp, const char * a_meta * @param a_str_reply * @return */ -static int s_cli_blocks(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) +static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply) { - (void) a_arg_func; enum { SUBCMD_UNDEFINED =0, SUBCMD_NEW_FLUSH, @@ -465,10 +464,11 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void *a_arg_func, char **a_s time_t l_ts_reated = (time_t) l_block->hdr.ts_created; // Header dap_string_append_printf(l_str_tmp,"Block %s:\n", l_subcmd_str_arg); - dap_string_append_printf(l_str_tmp,"\t\t\tversion: 0x%04sX\n",l_block->hdr.version); - dap_string_append_printf(l_str_tmp,"\t\t\tcell_id: 0x%016llX\n",l_block->hdr.cell_id.uint64); - dap_string_append_printf(l_str_tmp,"\t\t\tchain_id: 0x%016llX\n",l_block->hdr.chain_id.uint64); - dap_string_append_printf(l_str_tmp,"\t\t\tts_created: %s\n",ctime_r(&l_ts_reated, buf) ); + dap_string_append_printf(l_str_tmp,"\t\t\tversion: 0x%04hX\n",l_block->hdr.version); + dap_string_append_printf(l_str_tmp,"\t\t\tcell_id: 0x%016"DAP_UINT64_FORMAT_X"\n",l_block->hdr.cell_id.uint64); + dap_string_append_printf(l_str_tmp,"\t\t\tchain_id: 0x%016"DAP_UINT64_FORMAT_X"\n",l_block->hdr.chain_id.uint64); + ctime_r(&l_ts_reated, buf); + dap_string_append_printf(l_str_tmp,"\t\t\tts_created: %s\n", buf); // Dump Metadata dap_string_append_printf(l_str_tmp,"\tMetadata. Count: %us\n",l_block->hdr.meta_count ); @@ -496,32 +496,34 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void *a_arg_func, char **a_s default:{ char * l_data_hex = DAP_NEW_Z_SIZE(char,l_meta->hdr.data_size*2+3); dap_bin2hex(l_data_hex, l_meta->data, l_meta->hdr.data_size); - dap_string_append_printf(l_str_tmp,"\t\t\0x%0X: 0x%s\n", l_data_hex ); + dap_string_append_printf(l_str_tmp, "\t\t 0x%0X: 0x%s\n", i, l_data_hex ); + DAP_DELETE(l_data_hex); } } } - dap_string_append_printf(l_str_tmp,"\t\tdatums:\tcount: %uz\n",l_block_cache->datum_count); + dap_string_append_printf(l_str_tmp,"\t\tdatums:\tcount: %zu\n",l_block_cache->datum_count); for (uint32_t i=0; i < l_block_cache->datum_count ; i++){ dap_chain_datum_t * l_datum = l_block_cache->datum[i]; size_t l_datum_size = dap_chain_datum_size(l_datum); - dap_string_append_printf(l_str_tmp,"\t\t\tdatum:\tdatum_size: %u\n",l_datum_size); + dap_string_append_printf(l_str_tmp,"\t\t\tdatum:\tdatum_size: %zu\n",l_datum_size); if (l_datum_size < sizeof (l_datum->header) ){ - dap_string_append_printf(l_str_tmp,"\t\t\tERROR: datum size %zd is smaller than header size %zd \n",l_datum_size, + dap_string_append_printf(l_str_tmp,"\t\t\tERROR: datum size %zu is smaller than header size %zu \n",l_datum_size, sizeof (l_datum->header)); break; } time_t l_datum_ts_create = (time_t) l_datum->header.ts_create; // Nested datums dap_string_append_printf(l_str_tmp,"\t\t\t\tversion:=0x%02X\n", l_datum->header.version_id); - const char * l_datum_type_str="UNKNOWN"; - DAP_DATUM_TYPE_STR(l_datum->header.type_id, l_datum_type_str); + const char * l_datum_type_str="UNKNOWN"; + DAP_DATUM_TYPE_STR(l_datum->header.type_id, l_datum_type_str); dap_string_append_printf(l_str_tmp,"\t\t\t\ttype_id:=%s\n", l_datum_type_str); - dap_string_append_printf(l_str_tmp,"\t\t\t\tts_create=%s\n",ctime_r( &l_datum_ts_create,buf )); + ctime_r(&l_datum_ts_create, buf); + dap_string_append_printf(l_str_tmp,"\t\t\t\tts_create=%s\n", buf); dap_string_append_printf(l_str_tmp,"\t\t\t\tdata_size=%u\n", l_datum->header.data_size); dap_chain_net_dump_datum(l_str_tmp, l_datum, "hex" ); } // Signatures - dap_string_append_printf(l_str_tmp,"\t\tsignatures:\tcount: %u\n",l_block_cache->sign_count ); + dap_string_append_printf(l_str_tmp,"\t\tsignatures:\tcount: %zu\n",l_block_cache->sign_count ); for (uint32_t i=0; i < l_block_cache->sign_count ; i++){ dap_sign_t * l_sign =l_block_cache->sign[i]; size_t l_sign_size = dap_sign_get_size(l_sign); @@ -547,14 +549,15 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void *a_arg_func, char **a_s pthread_rwlock_rdlock(&PVT(l_blocks)->rwlock); dap_string_t * l_str_tmp = dap_string_new(NULL); - dap_string_append_printf(l_str_tmp,"%s.%s: Have %u blocks :\n", + dap_string_append_printf(l_str_tmp,"%s.%s: Have %"DAP_UINT64_FORMAT_U" blocks :\n", l_net->pub.name,l_chain->name,PVT(l_blocks)->blocks_count); dap_chain_block_cache_t * l_block_cache = NULL,*l_block_cache_tmp = NULL; HASH_ITER(hh,PVT(l_blocks)->block_cache_first,l_block_cache, l_block_cache_tmp ) { - char l_buf[50]; + char l_buf[50]; + ctime_r(&l_block_cache->ts_created, l_buf); dap_string_append_printf(l_str_tmp,"\t%s: ts_create=%s", - l_block_cache->block_hash_str, ctime_r( &l_block_cache->ts_created,l_buf ) ); + l_block_cache->block_hash_str, l_buf); } pthread_rwlock_unlock(&PVT(l_blocks)->rwlock); @@ -647,7 +650,7 @@ static int s_add_atom_to_ledger(dap_chain_cs_blocks_t * a_blocks, dap_ledger_t l_ret=-1; } if (l_ret != 0 ){ - log_it(L_WARNING, "Can't load datum #%d (%s) from block %s to ledger: code %d", i, + log_it(L_WARNING, "Can't load datum #%zu (%s) from block %s to ledger: code %d", i, dap_chain_datum_type_id_to_str(l_datum->header.type_id), a_block_cache->block_hash_str, l_ret); break; diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index c6a8b7dc737ba494970d5b867d97493a937ecfc2..04436de8ec656feee813ec830455537640348c5a 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -120,7 +120,7 @@ static dap_chain_datum_t* s_chain_callback_datum_iter_get_first( dap_chain_datum static dap_chain_datum_t* s_chain_callback_datum_iter_get_next( dap_chain_datum_iter_t * a_datum_iter ); // Get the next datum from dag */ -static int s_cli_dag(int argc, char ** argv, void *arg_func, char **str_reply); +static int s_cli_dag(int argc, char ** argv, char **str_reply); void s_dag_events_lasts_process_new_last_event(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_item_t * a_event_item); static bool s_seed_mode = false; @@ -136,7 +136,7 @@ int dap_chain_cs_dag_init(void) s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false); s_debug_more = dap_config_get_item_bool_default(g_config,"dag","debug_more",false); - dap_chain_node_cli_cmd_item_create ("dag", s_cli_dag, NULL, "DAG commands", + dap_chain_node_cli_cmd_item_create ("dag", s_cli_dag, "DAG commands", "dag -net <chain net name> -chain <chain name> event create -datum <datum hash> [-H hex|base58(default)]\n" "\tCreate event from datum mempool element\n\n" "dag -net <chain net name> -chain <chain name> event cancel -event <event hash>\n" @@ -335,22 +335,15 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger static int s_dap_chain_add_atom_to_events_table(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item ) { - int res = a_dag->callback_cs_verify(a_dag,a_event_item->event, a_event_item->event_size); - - char l_buf_hash[128] = {'\0'}; - dap_chain_hash_fast_to_str(&a_event_item->hash,l_buf_hash,sizeof(l_buf_hash)-1); - if (res == 0 || memcmp( &a_event_item->hash, &a_dag->static_genesis_event_hash, sizeof(a_event_item->hash) ) == 0) { - if(s_debug_more) - log_it(L_DEBUG,"Dag event %s checked, add it to ledger", l_buf_hash); - int l_ledger_res = s_dap_chain_add_atom_to_ledger(a_dag, a_ledger, a_event_item); - if ( l_ledger_res != 0) { - if(s_debug_more) - log_it(L_WARNING,"Dag event %s checked, but ledger declined: code %d", l_buf_hash, l_ledger_res); - } - } else { - log_it(L_WARNING,"Dag event %s check failed: code %d", l_buf_hash, res ); + int l_ledger_res = s_dap_chain_add_atom_to_ledger(a_dag, a_ledger, a_event_item); + if (s_debug_more) { + char l_buf_hash[128] = {'\0'}; + dap_chain_hash_fast_to_str(&a_event_item->hash,l_buf_hash,sizeof(l_buf_hash)-1); + log_it(L_DEBUG,"Dag event %s checked, add it to ledger", l_buf_hash); + if (l_ledger_res != 0) + log_it(L_WARNING,"Dag event %s checked, but ledger declined: code %d", l_buf_hash, l_ledger_res); } - return res; + return l_ledger_res; } static bool s_dap_chain_check_if_event_is_present(dap_chain_cs_dag_event_item_t * a_hash_table, const dap_chain_hash_fast_t * hash) { @@ -423,17 +416,17 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha break; case ATOM_ACCEPT: { int l_consensus_check = s_dap_chain_add_atom_to_events_table(l_dag, a_chain->ledger, l_event_item); - //All correct, no matter for result - pthread_rwlock_wrlock(l_events_rwlock); - HASH_ADD(hh, PVT(l_dag)->events,hash,sizeof (l_event_item->hash), l_event_item); - s_dag_events_lasts_process_new_last_event(l_dag, l_event_item); - pthread_rwlock_unlock(l_events_rwlock); switch (l_consensus_check) { case 0: + pthread_rwlock_wrlock(l_events_rwlock); + HASH_ADD(hh, PVT(l_dag)->events,hash,sizeof (l_event_item->hash), l_event_item); + s_dag_events_lasts_process_new_last_event(l_dag, l_event_item); + pthread_rwlock_unlock(l_events_rwlock); if(s_debug_more) log_it(L_DEBUG, "... added"); break; case DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS: + case DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION: pthread_rwlock_wrlock(l_events_rwlock); HASH_ADD(hh, PVT(l_dag)->events_treshold, hash, sizeof(l_event_item->hash), l_event_item); pthread_rwlock_unlock(l_events_rwlock); @@ -442,8 +435,10 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha ret = ATOM_MOVE_TO_THRESHOLD; break; default: - l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_item->hash); - log_it(L_WARNING, "Atom %s (size %zd) error adding (code %d)", l_event_hash_str, a_atom_size, l_consensus_check); + if (s_debug_more) { + l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_item->hash); + log_it(L_WARNING, "Atom %s (size %zd) error adding (code %d)", l_event_hash_str, a_atom_size, l_consensus_check); + } ret = ATOM_REJECT; break; } @@ -586,7 +581,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain if (s_chain_callback_atom_add(a_chain, l_event, l_event_size) == ATOM_ACCEPT) { // add events to file if (!l_cell) { - dap_chain_cell_create_fill(a_chain, l_cell_id); + l_cell = dap_chain_cell_create_fill(a_chain, l_cell_id); } if (dap_chain_cell_file_append(l_cell, l_event, l_event_size ) < 0) { log_it(L_ERROR, "Can't add new event to the file '%s'", l_cell->file_storage_path); @@ -603,7 +598,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain if(l_atom_treshold) { int l_res = dap_chain_cell_file_append(l_cell, l_atom_treshold, l_atom_treshold_size); if(l_res < 0) { - log_it(L_ERROR, "Can't save event 0x%x from treshold to the file '%s'", + log_it(L_ERROR, "Can't save event %p from treshold to the file '%s'", l_atom_treshold, l_cell ? l_cell->file_storage_path : "[null]"); } } @@ -636,6 +631,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain memcpy(&l_event_unlinked_item->hash, &l_event_ext_item->hash, sizeof(l_event_ext_item->hash)); l_event_unlinked_item->event = l_event; + l_event_unlinked_item->event_size = l_event_size; l_event_unlinked_item->ts_added = (time_t) l_event->header.ts_created; pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock); HASH_ADD(hh, PVT(l_dag)->events_lasts_unlinked, hash, sizeof(l_event_unlinked_item->hash), @@ -683,6 +679,22 @@ dap_chain_cs_dag_event_t* dap_chain_cs_dag_find_event_by_hash(dap_chain_cs_dag_t return l_event; } +static bool s_event_verify_size(dap_chain_cs_dag_event_t *a_event, size_t a_event_size) +{ + if (sizeof(a_event->header) >= a_event_size) { + log_it(L_WARNING, "Size of atom is %zd that is equal or less then header %zd", a_event_size, sizeof(a_event->header)); + return false; + } + size_t l_sign_offset = dap_chain_cs_dag_event_calc_size_excl_signs(a_event, a_event_size); + if (l_sign_offset >= a_event_size) + return false; + for (int i = 0; i < a_event->header.signs_count; i++) { + dap_sign_t *l_sign = (dap_sign_t *)((uint8_t *)a_event + l_sign_offset); + l_sign_offset += dap_sign_get_size(l_sign); + } + return l_sign_offset == a_event_size; +} + /** @@ -697,8 +709,19 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_ dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) a_atom; dap_chain_atom_verify_res_t res = ATOM_ACCEPT; pthread_rwlock_t *l_events_rwlock = &PVT(l_dag)->events_rwlock; - if(sizeof (l_event->header) >= a_atom_size){ - log_it(L_WARNING,"Size of atom is %zd that is equal or less then header %zd",a_atom_size,sizeof (l_event->header)); + if (l_event->header.version) { + if (s_debug_more) + log_it(L_WARNING, "Unsupported event version, possible corrupted event"); + return ATOM_REJECT; + } + if (l_event->header.chain_id.uint64 != a_chain->id.uint64) { + if (s_debug_more) + log_it(L_WARNING, "Event from another chain, possible corrupted event"); + return ATOM_REJECT; + } + if (!s_event_verify_size(l_event, a_atom_size)) { + if (s_debug_more) + log_it(L_WARNING,"Event size not equal to expected"); return ATOM_REJECT; } // Hard accept list @@ -832,7 +855,7 @@ int dap_chain_cs_dag_event_verify_hashes_with_treshold(dap_chain_cs_dag_t * a_da //looks like an alternative genesis event return DAP_THRESHOLD_CONFLICTING; } - dap_dag_threshold_verification_res_t ret; + dap_dag_threshold_verification_res_t ret = DAP_THRESHOLD_OK; for (size_t i = 0; i< a_event->header.hash_count; i++) { dap_chain_hash_fast_t * l_hash = ((dap_chain_hash_fast_t *) a_event->hashes_n_datum_n_signs) + i; dap_chain_cs_dag_event_item_t * l_event_search = NULL; @@ -881,24 +904,23 @@ dap_chain_cs_dag_event_item_t* dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t HASH_DEL(PVT(a_dag)->events_treshold,l_event_item); if(ret == DAP_THRESHOLD_OK){ - char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_item->hash); - if(s_debug_more) + if(s_debug_more) { + char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_item->hash); log_it(L_DEBUG, "Processing event (threshold): %s...", l_event_hash_str); - int l_add_res = s_dap_chain_add_atom_to_events_table(a_dag, a_ledger, l_event_item); + DAP_DELETE(l_event_hash_str); + } int l_add_res = s_dap_chain_add_atom_to_events_table(a_dag, a_ledger, l_event_item); HASH_ADD(hh, PVT(a_dag)->events,hash,sizeof (l_event_item->hash), l_event_item); s_dag_events_lasts_process_new_last_event(a_dag, l_event_item); if(! l_add_res){ if(s_debug_more) - log_it(L_INFO, "... moved from treshold to main chains", l_event_hash_str); - DAP_DELETE(l_event_hash_str); + log_it(L_INFO, "... moved from treshold to main chains"); res = true; break; }else{ if(s_debug_more) - log_it(L_WARNING, "... error adding", l_event_hash_str); + log_it(L_WARNING, "... error adding"); //todo: delete event } - DAP_DELETE(l_event_hash_str); //res = true; }else if(ret == DAP_THRESHOLD_CONFLICTING) HASH_ADD(hh, PVT(a_dag)->events_treshold_conflicted, hash,sizeof (l_event_item->hash), l_event_item); @@ -957,7 +979,7 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_ l_atom_iter->chain = a_chain; pthread_rwlock_rdlock(&a_chain->atoms_rwlock); #ifdef WIN32 - log_it(L_DEBUG, "! Create caller id %d", GetThreadId(GetCurrentThread())); + log_it(L_DEBUG, "! Create caller id %lu", GetThreadId(GetCurrentThread())); #endif return l_atom_iter; } @@ -1172,7 +1194,7 @@ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_ite { pthread_rwlock_unlock(&a_atom_iter->chain->atoms_rwlock); #ifdef WIN32 - log_it(L_DEBUG, "! Delete caller id %d", GetThreadId(GetCurrentThread())); + log_it(L_DEBUG, "! Delete caller id %lu", GetThreadId(GetCurrentThread())); #endif DAP_DELETE(a_atom_iter); } @@ -1185,9 +1207,8 @@ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_ite * @param str_reply * @return */ -static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) +static int s_cli_dag(int argc, char ** argv, char **a_str_reply) { - (void) arg_func; enum { SUBCMD_EVENT_CREATE, SUBCMD_EVENT_CANCEL, @@ -1552,8 +1573,8 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) // Header dap_string_append_printf(l_str_tmp,"Event %s:\n", l_event_hash_str); dap_string_append_printf(l_str_tmp,"\t\t\t\tversion: 0x%02X\n",l_event->header.version); - dap_string_append_printf(l_str_tmp,"\t\t\t\tcell_id: 0x%016llX\n",l_event->header.cell_id.uint64); - dap_string_append_printf(l_str_tmp,"\t\t\t\tchain_id: 0x%016llX\n",l_event->header.chain_id.uint64); + dap_string_append_printf(l_str_tmp,"\t\t\t\tcell_id: 0x%016"DAP_UINT64_FORMAT_x"\n",l_event->header.cell_id.uint64); + dap_string_append_printf(l_str_tmp,"\t\t\t\tchain_id: 0x%016"DAP_UINT64_FORMAT_X"\n",l_event->header.chain_id.uint64); dap_string_append_printf(l_str_tmp,"\t\t\t\tts_created: %s\n", dap_ctime_r(&l_ts_reated, buf) ); // Hash links @@ -1573,8 +1594,8 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) // Nested datum const char *l_datum_type = NULL; DAP_DATUM_TYPE_STR(l_datum->header.type_id, l_datum_type) - dap_string_append_printf(l_str_tmp,"\t\t\t\tdatum:\tdatum_size: %u\n",l_datum_size); - dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tversion:=0x%02X\n", l_datum->header.version_id); + dap_string_append_printf(l_str_tmp,"\t\t\t\tdatum:\tdatum_size: %zu\n",l_datum_size); + dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tversion:=0x%02hhX\n", l_datum->header.version_id); dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\ttype_id:=%s\n", l_datum_type); dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tts_create=%s\n", dap_ctime_r( &l_datum_ts_create,buf )); dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tdata_size=%u\n", l_datum->header.data_size); @@ -1621,7 +1642,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) dap_global_db_obj_t * l_objs; size_t l_objs_count = 0; l_objs = dap_chain_global_db_gr_load(l_gdb_group_events,&l_objs_count); - dap_string_append_printf(l_str_tmp,"%s.%s: Found %u records :\n",l_net->pub.name,l_chain->name,l_objs_count); + dap_string_append_printf(l_str_tmp,"%s.%s: Found %zu records :\n",l_net->pub.name,l_chain->name,l_objs_count); for (size_t i = 0; i< l_objs_count; i++){ dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) l_objs[i].value; @@ -1647,7 +1668,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) dap_string_t * l_str_tmp = dap_string_new(NULL); pthread_rwlock_rdlock(&PVT(l_dag)->events_rwlock); size_t l_events_count = HASH_COUNT(PVT(l_dag)->events); - dap_string_append_printf(l_str_tmp,"%s.%s: Have %u events :\n", + dap_string_append_printf(l_str_tmp,"%s.%s: Have %zu events :\n", l_net->pub.name,l_chain->name,l_events_count); dap_chain_cs_dag_event_item_t * l_event_item = NULL,*l_event_item_tmp = NULL; HASH_ITER(hh,PVT(l_dag)->events,l_event_item, l_event_item_tmp ) { diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c index 3b39ba72c0c4cff5530c11a0b2f8e1c3e1325bb3..c5de53eb92da0d92ca87ebcdc75ab7842d5c850d 100644 --- a/modules/type/dag/dap_chain_cs_dag_event.c +++ b/modules/type/dag/dap_chain_cs_dag_event.c @@ -43,9 +43,8 @@ * @param a_hashes_count * @return */ -dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t * a_datum - ,dap_enc_key_t * a_key , - dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t * a_event_size) +dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t * a_datum, + dap_enc_key_t * a_key, dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t * a_event_size) { assert(a_event_size); size_t l_hashes_size = sizeof(*a_hashes)*a_hashes_count; @@ -59,26 +58,24 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, l_event_new->header.cell_id.uint64 = a_cell_id.uint64; l_event_new->header.chain_id.uint64 = a_chain_id.uint64; l_event_new->header.hash_count = a_hashes_count; - *a_event_size = sizeof (l_event_new->header); if ( l_hashes_size ){ memcpy(l_event_new->hashes_n_datum_n_signs, a_hashes, l_hashes_size ); - *a_event_size += l_hashes_size; } memcpy(l_event_new->hashes_n_datum_n_signs+l_hashes_size, a_datum,l_datum_size ); - *a_event_size += l_datum_size; if ( a_key ){ - dap_sign_t * l_sign = dap_sign_create(a_key,l_event_new, - l_hashes_size+ sizeof(l_event_new->header) - + l_datum_size ,0); + dap_sign_t * l_sign = dap_sign_create(a_key, l_event_new, l_event_size, 0); if ( l_sign ){ size_t l_sign_size = dap_sign_get_size(l_sign); - l_event_new = (dap_chain_cs_dag_event_t* )DAP_REALLOC(l_event_new,l_event_size+l_sign_size ); + l_event_new = (dap_chain_cs_dag_event_t *)DAP_REALLOC(l_event_new, l_event_size + l_sign_size ); memcpy(l_event_new->hashes_n_datum_n_signs + l_hashes_size + l_datum_size, l_sign, l_sign_size); l_event_size += l_sign_size; - *a_event_size = l_event_size; + if (a_event_size) + *a_event_size = l_event_size; + l_event_new = (dap_chain_cs_dag_event_t* )DAP_REALLOC(l_event_new, l_event_size); + memcpy(l_event_new->hashes_n_datum_n_signs + l_hashes_size + l_datum_size, l_sign, l_sign_size); l_event_new->header.signs_count++; log_it(L_INFO,"Created event size %zd, signed with sign size %zd", l_event_size, l_sign_size); DAP_DELETE(l_sign); diff --git a/modules/type/dag/include/dap_chain_cs_dag_event.h b/modules/type/dag/include/dap_chain_cs_dag_event.h index 02203ef78792c8d7ec2a4e2b48d974c4692bc661..8065ea0eb34b6f1d3449647a29a8b456dbcc66e8 100644 --- a/modules/type/dag/include/dap_chain_cs_dag_event.h +++ b/modules/type/dag/include/dap_chain_cs_dag_event.h @@ -103,12 +103,14 @@ static inline size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t * */ static inline ssize_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_dag_event_t * a_event,size_t a_event_size) { - if (a_event_size< sizeof (a_event->header)) + if (a_event_size < sizeof(a_event->header)) return -1; size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t); + if (l_hashes_size > a_event_size) + return -1; dap_chain_datum_t * l_datum = (dap_chain_datum_t*) (a_event->hashes_n_datum_n_signs + l_hashes_size); size_t l_datum_size = dap_chain_datum_size(l_datum); - return l_hashes_size + sizeof (a_event->header)+l_datum_size; + return l_hashes_size + sizeof (a_event->header) + l_datum_size; } /** @@ -119,5 +121,5 @@ static inline ssize_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_d */ static inline void dap_chain_cs_dag_event_calc_hash(dap_chain_cs_dag_event_t * a_event,size_t a_event_size, dap_chain_hash_fast_t * a_event_hash) { - dap_hash_fast(a_event, a_event_size , a_event_hash); + dap_hash_fast(a_event, a_event_size, a_event_hash); } diff --git a/modules/wallet/dap_chain_wallet.c b/modules/wallet/dap_chain_wallet.c index 0cf200873b149659ee100d1fa9e6e0498692cdc0..aca3c351158194545b7512780b5b9913b728ea28 100644 --- a/modules/wallet/dap_chain_wallet.c +++ b/modules/wallet/dap_chain_wallet.c @@ -131,7 +131,7 @@ dap_chain_wallet_t * dap_chain_wallet_create_with_seed(const char * a_wallet_nam DAP_CHAIN_WALLET_INTERNAL_LOCAL_NEW(l_wallet); l_wallet->name = strdup(a_wallet_name); l_wallet_internal->certs_count = 1; - l_wallet_internal->certs = DAP_NEW_Z_SIZE(dap_cert_t *,l_wallet_internal->certs_count); + l_wallet_internal->certs = DAP_NEW_Z_SIZE(dap_cert_t *,l_wallet_internal->certs_count * sizeof(dap_cert_t *)); size_t l_file_name_size = strlen(a_wallet_name)+strlen(a_wallets_path)+13; l_wallet_internal->file_name = DAP_NEW_Z_SIZE (char, l_file_name_size); @@ -230,7 +230,7 @@ dap_pkey_t* dap_chain_wallet_get_pkey( dap_chain_wallet_t * a_wallet,uint32_t a_ if( l_wallet_internal->certs_count > a_pkey_idx ){ return dap_cert_to_pkey(l_wallet_internal->certs[a_pkey_idx]); }else{ - log_it( L_WARNING, "No pkey with index %u in the wallet (total size %u)",a_pkey_idx,l_wallet_internal->certs_count); + log_it( L_WARNING, "No pkey with index %u in the wallet (total size %zu)",a_pkey_idx,l_wallet_internal->certs_count); return 0; } } @@ -264,7 +264,7 @@ dap_enc_key_t* dap_chain_wallet_get_key( dap_chain_wallet_t * a_wallet,uint32_t l_wallet_internal->certs[a_pkey_idx]->enc_key : NULL; }else{ - log_it( L_WARNING, "No key with index %u in the wallet (total size %u)",a_pkey_idx,l_wallet_internal->certs_count); + log_it( L_WARNING, "No key with index %u in the wallet (total size %zu)",a_pkey_idx,l_wallet_internal->certs_count); return 0; } } @@ -299,8 +299,6 @@ int dap_chain_wallet_save(dap_chain_wallet_t * a_wallet) uint32_t l_cert_raw_size=0; uint8_t * l_buf = dap_cert_mem_save(l_wallet_internal->certs[i], &l_cert_raw_size); l_wallet_cert_hdr.cert_raw_size= l_cert_raw_size; - //l_wallet_cert_hdr.cert_raw_size = dap_cert_save_mem_size( l_wallet_internal->certs[i] ); - //uint8_t * l_buf = DAP_NEW_SIZE (uint8_t, l_wallet_cert_hdr.cert_raw_size); fwrite( &l_wallet_cert_hdr,1, sizeof (l_wallet_cert_hdr), l_file); if ( l_buf ){ fwrite( l_buf, 1, l_wallet_cert_hdr.cert_raw_size, l_file); diff --git a/modules/wallet/include/dap_chain_wallet.h b/modules/wallet/include/dap_chain_wallet.h index dc056103af0e5d6c16bb1b98c5aec53c23d21c27..f1b3e81e59162a3c0c2156e2e5f5baffb0f2bbc4 100644 --- a/modules/wallet/include/dap_chain_wallet.h +++ b/modules/wallet/include/dap_chain_wallet.h @@ -23,12 +23,12 @@ */ #pragma once +#include "dap_chain_net.h" #include "dap_chain_common.h" #include "dap_enc_key.h" #include "dap_pkey.h" #include "dap_sign.h" #include "dap_cert.h" -#include "dap_chain_net.h" typedef struct dap_chain_wallet{ char * name;