diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e4c57375cd92d2df401df5eb521412b5f6bc3e4..78194004f5e31009da94205f9c409c8e6dda86a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 2.8) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "2.6-29") +set(CELLFRAME_SDK_NATIVE_VERSION "2.6-33") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") diff --git a/dap-sdk/core/include/dap_common.h b/dap-sdk/core/include/dap_common.h index 430c7af50758794b0b12d60d3264dfebd2301d71..5ed8b225adb934e433294c0f5159be5f65777aed 100755 --- a/dap-sdk/core/include/dap_common.h +++ b/dap-sdk/core/include/dap_common.h @@ -33,6 +33,10 @@ #include <stdlib.h> #include <stdio.h> #include <time.h> +#ifdef DAP_OS_WINDOWS +#include <fcntl.h> +#define pipe(pfds) _pipe(pfds, 4096, _O_BINARY) +#endif #ifdef __MACH__ #include <dispatch/dispatch.h> #endif diff --git a/dap-sdk/core/src/dap_common.c b/dap-sdk/core/src/dap_common.c index f5565971c805da8c02ad1956bee975ad40bdced5..1be7ab9cf73fdb860ddac198b68d03a3f91ed4ab 100755 --- a/dap-sdk/core/src/dap_common.c +++ b/dap-sdk/core/src/dap_common.c @@ -55,8 +55,6 @@ #define popen _popen #define pclose _pclose - #define pipe(pfds) _pipe(pfds, 4096, 0x8000) - #endif #include "dap_common.h" diff --git a/dap-sdk/crypto/include/dap_sign.h b/dap-sdk/crypto/include/dap_sign.h index 9aa808415455bd2a4dc257fffcaff2e8f9e3b4fa..9182a7e10ba067e1c8e91394c99d601df78f3823 100755 --- a/dap-sdk/crypto/include/dap_sign.h +++ b/dap-sdk/crypto/include/dap_sign.h @@ -43,13 +43,13 @@ typedef enum { } dap_sign_type_enum_t; typedef union dap_sign_type { - dap_sign_type_enum_t type: 16; - uint16_t raw; -} dap_sign_type_t; + dap_sign_type_enum_t type: 32; + uint32_t raw; +} DAP_ALIGN_PACKED dap_sign_type_t; typedef struct dap_sign_hdr { dap_sign_type_t type; /// Signature type - uint8_t padding[2]; /// Padding for better aligmnent + uint16_t padding; uint32_t sign_size; /// Signature size uint32_t sign_pkey_size; /// Signature serialized public key size } DAP_ALIGN_PACKED dap_sign_hdr_t; diff --git a/dap-sdk/crypto/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h b/dap-sdk/crypto/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h index 1713a46e7197e5b2094b9ca735758217105a312d..d1b7ef3920d1a0ce87b5efd9bcedeb417dfffa11 100644 --- a/dap-sdk/crypto/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h +++ b/dap-sdk/crypto/src/XKCP/lib/high/Keccak/FIPS202/SimpleFIPS202.h @@ -84,4 +84,4 @@ int SHA3_512(unsigned char *output, const unsigned char *input, size_t inputByte } #endif -#endif +#endif \ No newline at end of file diff --git a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-200/Compact/KeccakP-200-SnP.h b/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-200/Compact/KeccakP-200-SnP.h deleted file mode 100755 index 1ad16097cd9109e9df6802558c0496f559e4d989..0000000000000000000000000000000000000000 --- a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-200/Compact/KeccakP-200-SnP.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -Implementation by Ronny Van Keer, hereby denoted as "the implementer". - -For more information, feedback or questions, please refer to our website: -https://keccak.team/ - -To the extent possible under law, the implementer has waived all copyright -and related or neighboring rights to the source code in this file. -http://creativecommons.org/publicdomain/zero/1.0/ - ---- - -Please refer to SnP-documentation.h for more details. -*/ - -#ifndef _KeccakP_200_SnP_h_ -#define _KeccakP_200_SnP_h_ - -#define KeccakP200_implementation "8-bit compact implementation" -#define KeccakP200_stateSizeInBytes 25 -#define KeccakP200_stateAlignment 1 - -#define KeccakP200_StaticInitialize() -void KeccakP200_Initialize(void *state); -void KeccakP200_AddByte(void *state, unsigned char data, unsigned int offset); -void KeccakP200_AddBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length); -void KeccakP200_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length); -void KeccakP200_OverwriteWithZeroes(void *state, unsigned int byteCount); -void KeccakP200_Permute_Nrounds(void *state, unsigned int nrounds); -void KeccakP200_Permute_18rounds(void *state); -void KeccakP200_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length); -void KeccakP200_ExtractAndAddBytes(const void *state, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length); - -#endif diff --git a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-200/Compact/KeccakP-200-compact.c b/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-200/Compact/KeccakP-200-compact.c deleted file mode 100755 index ea47b55257fe5fb28aa5c07a86b68804e57aa169..0000000000000000000000000000000000000000 --- a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-200/Compact/KeccakP-200-compact.c +++ /dev/null @@ -1,185 +0,0 @@ -/* -Implementation by Ronny Van Keer, hereby denoted as "the implementer". - -For more information, feedback or questions, please refer to our website: -https://keccak.team/ - -To the extent possible under law, the implementer has waived all copyright -and related or neighboring rights to the source code in this file. -http://creativecommons.org/publicdomain/zero/1.0/ - ---- - -This file implements Keccak-p[200] in a SnP-compatible way. -Please refer to SnP-documentation.h for more details. - -This implementation comes with KeccakP-200-SnP.h in the same folder. -Please refer to LowLevel.build for the exact list of other files it must be combined with. -*/ - -#include <string.h> -#include <stdlib.h> -#include "KeccakP-200-SnP.h" - -/* #define DIVISION_INSTRUCTION /* comment if no division instruction or more compact when not using division */ -#define UNROLL_CHILOOP /* comment if more compact using for loop */ - -typedef unsigned char UINT8; -typedef unsigned int tSmallUInt; /*INFO It could be more optimized to use "unsigned char" on an 8-bit CPU */ -typedef UINT8 tKeccakLane; - -#define ROL8(a, offset) (UINT8)((((UINT8)a) << (offset&7)) ^ (((UINT8)a) >> (8-(offset&7)))) - -const UINT8 KeccakP200_RotationConstants[25] = -{ - 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44 -}; - -const UINT8 KeccakP200_PiLane[25] = -{ - 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1 -}; - -#if defined(DIVISION_INSTRUCTION) -#define MOD5(argValue) ((argValue) % 5) -#else -const UINT8 KeccakP200_Mod5[10] = -{ - 0, 1, 2, 3, 4, 0, 1, 2, 3, 4 -}; -#define MOD5(argValue) KeccakP200_Mod5[argValue] -#endif - -const UINT8 KeccakF200_RoundConstants[] = -{ - 0x01, 0x82, 0x8a, 0x00, 0x8b, 0x01, 0x81, 0x09, 0x8a, 0x88, 0x09, 0x0a, 0x8b, 0x8b, 0x89, 0x03, 0x02, 0x80 -}; - -/* ---------------------------------------------------------------- */ - -void KeccakP200_Initialize(void *argState) -{ - memset( argState, 0, 25 * sizeof(tKeccakLane) ); -} - -/* ---------------------------------------------------------------- */ - -void KeccakP200_AddByte(void *argState, unsigned char byte, unsigned int offset) -{ - ((tKeccakLane*)argState)[offset] ^= byte; -} - -/* ---------------------------------------------------------------- */ - -void KeccakP200_AddBytes(void *argState, const unsigned char *data, unsigned int offset, unsigned int length) -{ - tSmallUInt i; - tKeccakLane * state = (tKeccakLane*)argState + offset; - for(i=0; i<length; i++) - state[i] ^= data[i]; -} - -/* ---------------------------------------------------------------- */ - -void KeccakP200_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length) -{ - memcpy((unsigned char*)state+offset, data, length); -} - -/* ---------------------------------------------------------------- */ - -void KeccakP200_OverwriteWithZeroes(void *state, unsigned int byteCount) -{ - memset(state, 0, byteCount); -} - -/* ---------------------------------------------------------------- */ - -void KeccakP200_Permute_Nrounds(void *argState, unsigned int nr) -{ - tSmallUInt x, y; - tKeccakLane temp; - tKeccakLane BC[5]; - tKeccakLane *state; - const tKeccakLane *rc; - - state = (tKeccakLane*)argState; - rc = KeccakF200_RoundConstants + 18 - nr; - do - { - /* Theta */ - for ( x = 0; x < 5; ++x ) - { - BC[x] = state[x] ^ state[5 + x] ^ state[10 + x] ^ state[15 + x] ^ state[20 + x]; - } - for ( x = 0; x < 5; ++x ) - { - temp = BC[MOD5(x+4)] ^ ROL8(BC[MOD5(x+1)], 1); - for ( y = 0; y < 25; y += 5 ) - { - state[y + x] ^= temp; - } - } - - /* Rho Pi */ - temp = state[1]; - for ( x = 0; x < 24; ++x ) - { - BC[0] = state[KeccakP200_PiLane[x]]; - state[KeccakP200_PiLane[x]] = ROL8( temp, KeccakP200_RotationConstants[x] ); - temp = BC[0]; - } - - /* Chi */ - for ( y = 0; y < 25; y += 5 ) - { -#if defined(UNROLL_CHILOOP) - BC[0] = state[y + 0]; - BC[1] = state[y + 1]; - BC[2] = state[y + 2]; - BC[3] = state[y + 3]; - BC[4] = state[y + 4]; -#else - for ( x = 0; x < 5; ++x ) - { - BC[x] = state[y + x]; - } -#endif - for ( x = 0; x < 5; ++x ) - { - state[y + x] = BC[x] ^((~BC[MOD5(x+1)]) & BC[MOD5(x+2)]); - } - } - - /* Iota */ - temp = *(rc++); - state[0] ^= temp; - } - while( temp != 0x80 ); -} - -/* ---------------------------------------------------------------- */ - -void KeccakP200_Permute_18rounds(void *argState) -{ - KeccakP200_Permute_Nrounds(argState, 18); -} - -/* ---------------------------------------------------------------- */ - -void KeccakP200_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length) -{ - memcpy(data, (UINT8*)state+offset, length); -} - -/* ---------------------------------------------------------------- */ - -void KeccakP200_ExtractAndAddBytes(const void *argState, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length) -{ - unsigned int i; - tKeccakLane * state = (tKeccakLane*)argState + offset; - for(i=0; i<length; i++) - output[i] = input[i] ^ state[i]; -} - -/* ---------------------------------------------------------------- */ diff --git a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-800/Compact/KeccakP-800-SnP.h b/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-800/Compact/KeccakP-800-SnP.h deleted file mode 100755 index 599a8b94caa5ee6d80d671e40b4112cb539cc529..0000000000000000000000000000000000000000 --- a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-800/Compact/KeccakP-800-SnP.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -Implementation by Ronny Van Keer, hereby denoted as "the implementer". - -For more information, feedback or questions, please refer to our website: -https://keccak.team/ - -To the extent possible under law, the implementer has waived all copyright -and related or neighboring rights to the source code in this file. -http://creativecommons.org/publicdomain/zero/1.0/ - ---- - -Please refer to SnP-documentation.h for more details. -*/ - -#ifndef _KeccakP_800_SnP_h_ -#define _KeccakP_800_SnP_h_ - -#define KeccakP800_implementation "32-bit compact implementation" -#define KeccakP800_stateSizeInBytes 100 -#define KeccakP800_stateAlignment 4 - -#define KeccakP800_StaticInitialize() -void KeccakP800_Initialize(void *state); -void KeccakP800_AddByte(void *state, unsigned char data, unsigned int offset); -void KeccakP800_AddBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length); -void KeccakP800_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length); -void KeccakP800_OverwriteWithZeroes(void *state, unsigned int byteCount); -void KeccakP800_Permute_Nrounds(void *state, unsigned int nrounds); -void KeccakP800_Permute_12rounds(void *state); -void KeccakP800_Permute_22rounds(void *state); -void KeccakP800_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length); -void KeccakP800_ExtractAndAddBytes(const void *state, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length); - -#endif diff --git a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-800/Compact/KeccakP-800-compact.c b/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-800/Compact/KeccakP-800-compact.c deleted file mode 100755 index 0d9bfa3aac73f828337fe58b019340754fd1ef60..0000000000000000000000000000000000000000 --- a/dap-sdk/crypto/src/XKCP/lib/low/KeccakP-800/Compact/KeccakP-800-compact.c +++ /dev/null @@ -1,241 +0,0 @@ -/* -Implementation by Ronny Van Keer, hereby denoted as "the implementer". - -For more information, feedback or questions, please refer to our website: -https://keccak.team/ - -To the extent possible under law, the implementer has waived all copyright -and related or neighboring rights to the source code in this file. -http://creativecommons.org/publicdomain/zero/1.0/ - ---- - -This file implements Keccak-p[800] in a SnP-compatible way. -Please refer to SnP-documentation.h for more details. - -This implementation comes with KeccakP-800-SnP.h in the same folder. -Please refer to LowLevel.build for the exact list of other files it must be combined with. -*/ - -#include <stdint.h> -#include <string.h> -#include <stdlib.h> -#include "brg_endian.h" -#include "KeccakP-800-SnP.h" - -#if (PLATFORM_BYTE_ORDER != IS_LITTLE_ENDIAN) -#error Not yet implemented -#endif - -#define USE_MEMSET -/* #define DIVISION_INSTRUCTION /* comment if no division instruction or more compact when not using division */ -#define UNROLL_CHILOOP /* comment more compact using for loop */ - -typedef unsigned char UINT8; -typedef uint32_t UINT32; -typedef unsigned int tSmallUInt; /*INFO It could be more optimized to use "unsigned char" on an 8-bit CPU */ -typedef UINT32 tKeccakLane; - -#if defined (__arm__) && !defined(__GNUC__) -#define ROL32(a, offset) __ror(a, 32-(offset)) -#elif defined(_MSC_VER) -#define ROL32(a, offset) _rotl(a, offset) -#else -#define ROL32(a, offset) ((((UINT32)a) << offset) ^ (((UINT32)a) >> (32-offset))) -#endif - -#define cKeccakNumberOfRounds 22 - -const UINT8 KeccakP800_RotationConstants[25] = -{ - 1, 3, 6, 10, 15, 21, 28, 4, 13, 23, 2, 14, 27, 9, 24, 8, 25, 11, 30, 18, 7, 29, 20, 12 -}; - -const UINT8 KeccakP800_PiLane[25] = -{ - 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1 -}; - -#if defined(DIVISION_INSTRUCTION) -#define MOD5(argValue) ((argValue) % 5) -#else -const UINT8 KeccakP800_Mod5[10] = -{ - 0, 1, 2, 3, 4, 0, 1, 2, 3, 4 -}; -#define MOD5(argValue) KeccakP800_Mod5[argValue] -#endif - -/* ---------------------------------------------------------------- */ - -void KeccakP800_Initialize(void *argState) -{ - #if defined(USE_MEMSET) - memset( argState, 0, 25 * sizeof(tKeccakLane) ); - #else - tSmallUInt i; - tKeccakLane *state; - - state = (tKeccakLane*)argState; - i = 25; - do - { - *(state++) = 0; - } - while ( --i != 0 ); - #endif -} - -/* ---------------------------------------------------------------- */ - -void KeccakP800_AddByte(void *state, unsigned char data, unsigned int offset) -{ - ((unsigned char *)state)[offset] ^= data; -} - -/* ---------------------------------------------------------------- */ - -void KeccakP800_AddBytes(void *argState, const unsigned char *data, unsigned int offset, unsigned int length) -{ - tSmallUInt i; - unsigned char * state = (unsigned char*)argState + offset; - - for(i=0; i<length; i++) - ((unsigned char *)state)[i] ^= data[i]; -} - -/* ---------------------------------------------------------------- */ - -void KeccakP800_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length) -{ - memcpy((unsigned char*)state+offset, data, length); -} - -/* ---------------------------------------------------------------- */ - -void KeccakP800_OverwriteWithZeroes(void *state, unsigned int byteCount) -{ - memset(state, 0, byteCount); -} - -/* ---------------------------------------------------------------- */ - -void KeccakP800_Permute_Nrounds(void *argState, unsigned int nr) -{ - tSmallUInt x, y; - tKeccakLane temp; - tKeccakLane BC[5]; - tKeccakLane *state; - UINT8 LFSRstate; - - state = (tKeccakLane*)argState; - LFSRstate = 0x01; - for ( y = (tSmallUInt)(cKeccakNumberOfRounds - nr); y != 0; --y ) - { - for( x = 1; x < 128; x <<= 1 ) - { - if ((LFSRstate & 0x80) != 0) - /* Primitive polynomial over GF(2): x^8+x^6+x^5+x^4+1 */ - LFSRstate = (LFSRstate << 1) ^ 0x71; - else - LFSRstate <<= 1; - } - } - - do - { - /* Theta */ - for ( x = 0; x < 5; ++x ) - { - BC[x] = state[x] ^ state[5 + x] ^ state[10 + x] ^ state[15 + x] ^ state[20 + x]; - } - for ( x = 0; x < 5; ++x ) - { - temp = BC[MOD5(x+4)] ^ ROL32(BC[MOD5(x+1)], 1); - for ( y = 0; y < 25; y += 5 ) - { - state[y + x] ^= temp; - } - } - - /* Rho Pi */ - temp = state[1]; - for ( x = 0; x < 24; ++x ) - { - BC[0] = state[KeccakP800_PiLane[x]]; - state[KeccakP800_PiLane[x]] = ROL32( temp, KeccakP800_RotationConstants[x] ); - temp = BC[0]; - } - - /* Chi */ - for ( y = 0; y < 25; y += 5 ) - { -#if defined(UNROLL_CHILOOP) - BC[0] = state[y + 0]; - BC[1] = state[y + 1]; - BC[2] = state[y + 2]; - BC[3] = state[y + 3]; - BC[4] = state[y + 4]; -#else - for ( x = 0; x < 5; ++x ) - { - BC[x] = state[y + x]; - } -#endif - for ( x = 0; x < 5; ++x ) - { - state[y + x] = BC[x] ^((~BC[MOD5(x+1)]) & BC[MOD5(x+2)]); - } - } - - /* Iota */ - temp = 0; - for( x = 1; x < 128; x <<= 1 ) - { - if ( x <= (sizeof(tKeccakLane)*8) ) - temp ^= (tKeccakLane)(LFSRstate & 1) << (x - 1); - - if ((LFSRstate & 0x80) != 0) - /* Primitive polynomial over GF(2): x^8+x^6+x^5+x^4+1 */ - LFSRstate = (LFSRstate << 1) ^ 0x71; - else - LFSRstate <<= 1; - } - state[0] ^= temp; - } - while( --nr != 0 ); -} - -/* ---------------------------------------------------------------- */ - -void KeccakP800_Permute_12rounds(void *argState) -{ - KeccakP800_Permute_Nrounds(argState, 12); -} - -/* ---------------------------------------------------------------- */ - -void KeccakP800_Permute_22rounds(void *argState) -{ - KeccakP800_Permute_Nrounds(argState, 22); -} - -/* ---------------------------------------------------------------- */ - -void KeccakP800_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length) -{ - memcpy(data, (const UINT8*)state+offset, length); -} - -/* ---------------------------------------------------------------- */ - -void KeccakP800_ExtractAndAddBytes(const void *argState, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length) -{ - tSmallUInt i; - const unsigned char * state = (const unsigned char*)argState + offset; - - for(i=0; i<length; i++) - output[i] = input[i] ^ state[i]; -} - -/* ---------------------------------------------------------------- */ diff --git a/dap-sdk/crypto/src/dap_cert.c b/dap-sdk/crypto/src/dap_cert.c index b9bc42688635fe060bd631c36eb9c7d60f9a03d0..67ce81d47a19efc6ed47e5c1095cef4cf064c09d 100755 --- a/dap-sdk/crypto/src/dap_cert.c +++ b/dap-sdk/crypto/src/dap_cert.c @@ -169,8 +169,8 @@ size_t dap_cert_sign_output_size(dap_cert_t * a_cert, size_t a_size_wished) dap_sign_t * dap_cert_sign(dap_cert_t * a_cert, const void * a_data , size_t a_data_size, size_t a_output_size_wished ) { - dap_enc_key_t * l_key = a_cert->enc_key; - dap_sign_t *l_ret = dap_sign_create(l_key, a_data, a_data_size, a_output_size_wished); + dap_sign_t *l_ret = dap_sign_create(a_cert->enc_key, a_data, a_data_size, a_output_size_wished); + log_it(L_INFO, "Sign sizes: %d %d", l_ret->header.sign_size, l_ret->header.sign_pkey_size); return l_ret; } diff --git a/dap-sdk/crypto/src/dap_enc_key.c b/dap-sdk/crypto/src/dap_enc_key.c index d105cb5c14ecb487c84e2b4753fb3352a5bf0b3c..4c82fd3a69b8859e84ef66efc27a3e37b3f5778e 100755 --- a/dap-sdk/crypto/src/dap_enc_key.c +++ b/dap-sdk/crypto/src/dap_enc_key.c @@ -643,7 +643,7 @@ dap_enc_key_t* dap_enc_key_dup(dap_enc_key_t * a_key) return NULL; } dap_enc_key_t *l_ret = dap_enc_key_new(a_key->type); - if (l_ret->priv_key_data_size) { + if (a_key->priv_key_data_size) { l_ret->priv_key_data = DAP_NEW_Z_SIZE(byte_t, a_key->priv_key_data_size); l_ret->priv_key_data_size = a_key->priv_key_data_size; memcpy(l_ret->priv_key_data, a_key->priv_key_data, a_key->priv_key_data_size); diff --git a/dap-sdk/net/client/dap_client_http.c b/dap-sdk/net/client/dap_client_http.c index 444a10b456624425c99f71d564aaf166c131ece8..413631f29d634a0f92562f5ab6991e0827acadaf 100644 --- a/dap-sdk/net/client/dap_client_http.c +++ b/dap-sdk/net/client/dap_client_http.c @@ -418,9 +418,10 @@ static void s_http_connected(dap_events_socket_t * a_esocket) "\r\n", l_http_pvt->method, l_http_pvt->path, l_get_str ? l_get_str : "", l_http_pvt->uplink_addr, l_request_headers->str); // send data for POST request - if(!l_get_str) + if(l_get_str) + DAP_DELETE(l_get_str); + else if ( l_http_pvt->request_size) dap_events_socket_write_unsafe( a_esocket, l_http_pvt->request, l_http_pvt->request_size); - DAP_DELETE(l_get_str); dap_string_free(l_request_headers, true); } diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c index 1985ba99853ce53bf115bf284421beb8971baac2..1d0e361b64abb67a664f4ae66683e33bcb9af99f 100644 --- a/dap-sdk/net/core/dap_events_socket.c +++ b/dap-sdk/net/core/dap_events_socket.c @@ -32,7 +32,6 @@ #include <sys/epoll.h> #include <sys/select.h> #include <unistd.h> -#include <fcntl.h> #else #include <winsock2.h> #include <windows.h> @@ -41,6 +40,7 @@ #include <io.h> #include "wepoll.h" #endif +#include <fcntl.h> #include <pthread.h> #include "dap_common.h" @@ -184,16 +184,23 @@ dap_events_socket_t * s_create_type_pipe(dap_worker_t * a_w, dap_events_socket_c l_errbuf[0]=0; if( pipe(l_pipe) < 0 ){ l_errno = errno; +#if defined DAP_OS_UNIX strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); log_it( L_ERROR, "Error detected, can't create pipe(): '%s' (%d)", l_errbuf, l_errno); +#elif defined DAP_OS_WINDOWS + log_it( L_ERROR, "Can't create pipe, errno: %d", l_errno); +#endif DAP_DELETE(l_es); return NULL; }//else // log_it(L_DEBUG, "Created one-way unnamed bytestream pipe %d->%d", l_pipe[0], l_pipe[1]); l_es->fd = l_pipe[0]; l_es->fd2 = l_pipe[1]; +#if defined DAP_OS_UNIX fcntl( l_pipe[0], F_SETFL, O_NONBLOCK); fcntl( l_pipe[1], F_SETFL, O_NONBLOCK); + // this sort of fd doesn't suit ioctlsocket()... +#endif #else #error "No defined s_create_type_pipe() for your platform" @@ -425,8 +432,20 @@ dap_events_socket_t * s_create_type_event(dap_worker_t * a_w, dap_events_socket_ } DAP_DELETE(l_es); return NULL; - }else + }else { + l_es->fd2 = l_es->fd; log_it(L_DEBUG, "Created eventfd descriptor %d", l_es->fd ); + } +#elif defined DAP_OS_WINDOWS + int l_pipe[2]; + if (pipe(l_pipe) < 0) { + log_it(L_ERROR, "Can't create pipe for event type, error: %d", errno); + DAP_DELETE(l_es); + return NULL; + } + l_es->fd2 = l_pipe[0]; + l_es->fd = l_pipe[1]; + log_it(L_DEBUG, "Created pipe for event type, %d -> %d", l_es->fd2, l_es->fd); #endif return l_es; } @@ -480,11 +499,24 @@ void dap_events_socket_event_proc_input_unsafe(dap_events_socket_t *a_esocket) log_it(L_WARNING, "Can't read packet from event fd: \"%s\"(%d)", l_errbuf, l_errno); }else return; // do nothing +#elif defined DAP_OS_WINDOWS + uint64_t l_value; + int l_ret; + switch (l_ret = read(a_esocket->fd, &l_value, 8)) { + case -1: + log_it(L_CRITICAL, "Can't read from event socket pipe, error: %d", errno); + break; + case 0: + return; + default: + a_esocket->callbacks.event_callback(a_esocket, l_value); + break; + } #else #error "No Queue fetch mechanism implemented on your platform" #endif }else - log_it(L_ERROR, "Queue socket %d accepted data but callback is NULL ", a_esocket->socket); + log_it(L_ERROR, "Event socket %d accepted data but callback is NULL ", a_esocket->socket); } @@ -627,6 +659,13 @@ int dap_events_socket_event_signal( dap_events_socket_t * a_es, uint64_t a_value return l_errno; else return 1; +#elif defined DAP_OS_WINDOWS + byte_t l_bytes[sizeof(void*)] = { 0 }; + if(write(a_es->fd2, l_bytes, sizeof(l_bytes)) == -1) { + return errno; + } else { + return 0; + } #else #error "Not implemented dap_events_socket_event_signal() for this platform" #endif diff --git a/dap-sdk/net/core/dap_proc_thread.c b/dap-sdk/net/core/dap_proc_thread.c index 86afea3b6d3b8f3b5b0bfbc43f5f4b9f6f60e933..1cd2757ba4c14fec8367ef177599e1e838e0a394 100644 --- a/dap-sdk/net/core/dap_proc_thread.c +++ b/dap-sdk/net/core/dap_proc_thread.c @@ -215,7 +215,7 @@ static void * s_proc_thread_function(void * a_arg) #ifdef DAP_EVENTS_CAPS_EPOLL //log_it(L_DEBUG, "Epoll_wait call"); int l_selected_sockets = epoll_wait(l_thread->epoll_ctl, l_epoll_events, DAP_EVENTS_SOCKET_MAX, -1); - size_t l_sockets_max = l_selected_sockets; + size_t l_sockets_max = (size_t)l_selected_sockets; #elif defined (DAP_EVENTS_CAPS_POLL) int l_selected_sockets = poll(l_poll,l_poll_count,-1); size_t l_sockets_max = l_poll_count; @@ -226,10 +226,14 @@ static void * s_proc_thread_function(void * a_arg) if(l_selected_sockets == -1) { if( errno == EINTR) continue; +#if defined DAP_OS_UNIX int l_errno = errno; char l_errbuf[128]; strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); log_it(L_ERROR, "Proc thread #%d got errno:\"%s\" (%d)", l_thread->cpu_id , l_errbuf, l_errno); +#elif DAP_OS_WINDOWS + log_it(L_ERROR, "Error occured on thread #%d, errno: %d", l_thread->cpu_id , errno); +#endif break; } for(size_t n = 0; n < l_sockets_max; n++) { @@ -268,23 +272,29 @@ static void * s_proc_thread_function(void * a_arg) time_t l_cur_time = time( NULL); l_cur->last_time_active = l_cur_time; if (l_flag_error){ +#if defined DAP_OS_UNIX int l_errno = errno; 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); +#elif defined DAP_OS_WINDOWS + log_it(L_ERROR,"Some error occured on thread #%u with socket %d, errno: %d",l_thread->cpu_id, l_cur->socket, errno); +#endif if(l_cur->callbacks.error_callback) - l_cur->callbacks.error_callback(l_cur,errno); + l_cur->callbacks.error_callback(l_cur, errno); } if (l_flag_read ){ switch (l_cur->type) { case DESCRIPTOR_TYPE_QUEUE: - dap_events_socket_queue_proc_input_unsafe(l_cur); - break; + dap_events_socket_queue_proc_input_unsafe(l_cur); + break; case DESCRIPTOR_TYPE_EVENT: - dap_events_socket_event_proc_input_unsafe (l_cur); - break; + dap_events_socket_event_proc_input_unsafe (l_cur); + break; - default:{ log_it(L_ERROR, "Unprocessed descriptor type accepted in proc thread loop"); } + default: + log_it(L_ERROR, "Unprocessed descriptor type accepted in proc thread loop"); + break; } } if(l_cur->flags & DAP_SOCK_SIGNAL_CLOSE){ diff --git a/dap-sdk/net/core/dap_timerfd.c b/dap-sdk/net/core/dap_timerfd.c index d688bb43366c1985d67edd7124868f071634c6b2..00f9ed6c37c6145118d6a73ddfc5b89e79713a80 100644 --- a/dap-sdk/net/core/dap_timerfd.c +++ b/dap-sdk/net/core/dap_timerfd.c @@ -20,17 +20,19 @@ 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/>. */ -#ifdef DAP_OS_UNIX + #include <stdint.h> #include <stdbool.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> -#include <sys/time.h> -#include <sys/timerfd.h> #include <inttypes.h> +#ifdef DAP_OS_WINDOWS +#include <winsock2.h> +#endif + #include "dap_common.h" #include "dap_events.h" #include "dap_worker.h" @@ -62,6 +64,18 @@ dap_timerfd_t* dap_timerfd_start(uint64_t a_timeout_ms, dap_timerfd_callback_t a return dap_timerfd_start_on_worker(dap_events_worker_get_auto(), a_timeout_ms, a_callback, a_callback_arg); } +#ifdef DAP_OS_WINDOWS +void __stdcall TimerAPCb(void* arg, DWORD low, DWORD high) { // Timer high value. + UNREFERENCED_PARAMETER(low) + UNREFERENCED_PARAMETER(high) + dap_timerfd_t *l_timerfd = (dap_timerfd_t *)arg; + byte_t l_bytes[sizeof(void*)] = { 0 }; + if (write(l_timerfd->pipe_in, l_bytes, sizeof(l_bytes)) == -1) { + log_it(L_CRITICAL, "Error occured on writing into pipe from APC, errno: %d", errno); + } +} +#endif + /** * @brief dap_timerfd_start_on_worker * @param a_worker @@ -73,10 +87,13 @@ dap_timerfd_t* dap_timerfd_start(uint64_t a_timeout_ms, dap_timerfd_callback_t a dap_timerfd_t* dap_timerfd_start_on_worker(dap_worker_t * a_worker, uint64_t a_timeout_ms, dap_timerfd_callback_t a_callback, void *a_callback_arg) { + dap_timerfd_t *l_timerfd = DAP_NEW(dap_timerfd_t); +#if defined DAP_OS_UNIX struct itimerspec l_ts; int l_tfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK); if(l_tfd == -1) { log_it(L_WARNING, "dap_timerfd_start() failed: timerfd_create() errno=%d\n", errno); + DAP_DELETE(l_timerfd); return NULL; } // repeat never @@ -88,11 +105,33 @@ dap_timerfd_t* dap_timerfd_start_on_worker(dap_worker_t * a_worker, uint64_t a_t if(timerfd_settime(l_tfd, 0, &l_ts, NULL) < 0) { log_it(L_WARNING, "dap_timerfd_start() failed: timerfd_settime() errno=%d\n", errno); close(l_tfd); + DAP_DELETE(l_timerfd); return NULL; } - - // create dap_timerfd_t structure - dap_timerfd_t *l_timerfd = DAP_NEW(dap_timerfd_t); +#elif defined DAP_OS_WINDOWS + HANDLE l_th = CreateWaitableTimer(NULL, true, NULL); + if (!l_th) { + log_it(L_CRITICAL, "Waitable timer not created, error %d", GetLastError()); + DAP_DELETE(l_timerfd); + return NULL; + } + int l_pipe[2]; + if (pipe(l_pipe) < 0) { + log_it(L_ERROR, "Can't create pipe, error: %d", errno); + DAP_DELETE(l_timerfd); + return NULL; + } + unsigned long l_mode = 0; + int l_tfd = l_pipe[0]; + LARGE_INTEGER l_due_time; + l_due_time.QuadPart = (long long)a_timeout_ms * _MSEC; + if (!SetWaitableTimer(l_th, &l_due_time, 0, TimerAPCb, l_timerfd, false)) { + log_it(L_CRITICAL, "Waitable timer not set, error %d", GetLastError()); + CloseHandle(l_th); + DAP_DELETE(l_timerfd); + return NULL; + } +#endif // create events_socket for timer file descriptor dap_events_socket_callbacks_t l_s_callbacks; @@ -105,13 +144,18 @@ dap_timerfd_t* dap_timerfd_start_on_worker(dap_worker_t * a_worker, uint64_t a_t l_events_socket->_inheritor = l_timerfd; // fill out dap_timerfd_t structure - l_timerfd->timeout_ms = a_timeout_ms; l_timerfd->tfd = l_tfd; l_timerfd->events_socket = l_events_socket; l_timerfd->callback = a_callback; l_timerfd->callback_arg = a_callback_arg; +#ifdef DAP_OS_WINDOWS + l_timerfd->th = l_th; + l_timerfd->pipe_in = l_pipe[1]; + /*ioctlsocket(l_pipe[0], FIONBIO, &l_mode); + l_mode = 0; + ioctlsocket(l_pipe[1], FIONBIO, &l_mode);*/ +#endif dap_worker_add_events_socket(l_events_socket, a_worker); - return l_timerfd; } @@ -125,6 +169,7 @@ static void s_es_callback_timer(struct dap_events_socket *a_event_sock) // run user's callback if(l_timerfd->callback && l_timerfd->callback(l_timerfd->callback_arg)) { //printf("\nread() returned %d, %d\n", l_ptiu64, l_read_ret); +#if defined DAP_OS_UNIX struct itimerspec l_ts; // repeat never l_ts.it_interval.tv_sec = 0; @@ -135,9 +180,20 @@ static void s_es_callback_timer(struct dap_events_socket *a_event_sock) if(timerfd_settime(l_timerfd->tfd, 0, &l_ts, NULL) < 0) { log_it(L_WARNING, "callback_timerfd_read() failed: timerfd_settime() errno=%d\n", errno); } +#elif defined DAP_OS_WINDOWS + LARGE_INTEGER l_due_time; + l_due_time.QuadPart = (long long)l_timerfd->timeout_ms * _MSEC; + if (!SetWaitableTimer(l_timerfd->th, &l_due_time, 0, TimerAPCb, l_timerfd, false)) { + log_it(L_CRITICAL, "Waitable timer not reset, error %d", GetLastError()); + CloseHandle(l_timerfd->th); + } +#endif dap_events_socket_set_readable_unsafe(a_event_sock, true); } else { close(l_timerfd->tfd); +#if defined DAP_OS_WINDOWS + CloseHandle(l_timerfd->th); +#endif dap_events_socket_remove_and_delete_unsafe(l_timerfd->events_socket, false); } } @@ -151,6 +207,3 @@ void dap_timerfd_delete(dap_timerfd_t *l_timerfd) { dap_events_socket_remove_and_delete_mt(l_timerfd->events_socket->worker, l_timerfd->events_socket); } -#else -#error "No dap_timerfd realization for your platform" -#endif diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c index 0635cde1889d917ea2f079788b1593a5453b8650..dc5d93d69c237a47ccdcc0e5a64f1aeab129e112 100644 --- a/dap-sdk/net/core/dap_worker.c +++ b/dap-sdk/net/core/dap_worker.c @@ -521,7 +521,7 @@ static void s_queue_add_es_callback( dap_events_socket_t * a_es, void * a_arg) l_es_new->me = l_es_new; HASH_ADD(hh_worker, w->esockets, me, sizeof(void *), l_es_new ); w->event_sockets_count++; - log_it(L_DEBUG, "Added socket %d on worker %u", l_es_new->socket, w->id); + //log_it(L_DEBUG, "Added socket %d on worker %u", l_es_new->socket, w->id); if (l_es_new->callbacks.worker_assign_callback) l_es_new->callbacks.worker_assign_callback(l_es_new, w); diff --git a/dap-sdk/net/core/include/dap_timerfd.h b/dap-sdk/net/core/include/dap_timerfd.h index 40f29e636afee56e78fb89666bea38ae57a07da8..b578d02ccf884e6bdb5abf27fc4888bd2a53522e 100644 --- a/dap-sdk/net/core/include/dap_timerfd.h +++ b/dap-sdk/net/core/include/dap_timerfd.h @@ -27,14 +27,18 @@ #include <stdio.h> #include <stdlib.h> #include <unistd.h> +#if defined DAP_OS_UNIX #include <sys/time.h> #include <sys/timerfd.h> +#elif defined DAP_OS_WINDOWS +#define _MSEC -10000 +#endif #include <inttypes.h> #include "dap_common.h" #include "dap_events_socket.h" -typedef bool (*dap_timerfd_callback_t)(void* ); // Callback for timer +typedef bool (*dap_timerfd_callback_t)(void* ); // Callback for timer. If return true, it will be called after next timeout typedef struct dap_timerfd { uint64_t timeout_ms; @@ -42,6 +46,10 @@ typedef struct dap_timerfd { dap_events_socket_t *events_socket; dap_timerfd_callback_t callback; void *callback_arg; +#ifdef DAP_OS_WINDOWS + HANDLE th; + int pipe_in; +#endif } dap_timerfd_t; int dap_timerfd_init(); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index c98f27266557d891af8b3a52caa0ae767d45e8fb..075ad8a8a11266981663eaa48849eb87f8ec6dc8 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -490,8 +490,7 @@ static int s_net_states_proc(dap_chain_net_t *a_net) dap_chain_node_client_t *l_node_client = dap_chain_node_client_connect(l_link_info); if (l_node_client) { // wait connected - int timeout_ms = 5000; //5 sec = 5000 ms - int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, timeout_ms); + int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, 10000 ); if (res == 0 ) { log_it(L_DEBUG, "Established connection with "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_link_info->hdr.address)); l_pvt_net->links = dap_list_append(l_pvt_net->links, l_node_client); diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index c8578df1f5d8694343d9ab957faec065f27d3075..ce3d32441e7f634dfe907cb72578f79e7076e4c2 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -1488,6 +1488,10 @@ int com_version(int argc, char ** argv, void *arg_func, 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 +#endif dap_chain_node_cli_set_reply_text(str_reply, "%s version %s\n", dap_get_appname(), DAP_VERSION ); return 0; diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index e0e99708f4028712c9019782e31fe862d4b576c3..497f9280ea22913d3b7aef858253029afa64789b 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -551,9 +551,8 @@ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_s #ifndef _WIN32 // prepare for signal waiting struct timespec l_cond_timeout; - uint32_t l_timeout_s = dap_config_get_item_uint32_default(g_config,"chain_net","status_wait_timeout",10); clock_gettime( CLOCK_MONOTONIC, &l_cond_timeout); - l_cond_timeout.tv_sec += l_timeout_s; + l_cond_timeout.tv_sec += a_timeout_ms/1000; #else pthread_mutex_unlock( &a_client->wait_mutex ); #endif diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index 9c6ca9d747a78730ade949bf700a503b5d9f14ff..3291d75684d76f28804feb03ee2e3415365f78bd 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -37,6 +37,12 @@ #include <io.h> #endif +#ifdef DAP_OS_LINUX +#include <dlfcn.h> +#endif +#include <json-c/json.h> +#include <json-c/json_object.h> + #include <pthread.h> #include <dirent.h> @@ -101,7 +107,13 @@ int dap_chain_net_srv_init(dap_config_t * a_cfg) " -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" - "\tOrder create\n" ); + "\tOrder create\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" + "\tCheck the availability of orders\n" + + ); s_load_all(); return 0; @@ -167,6 +179,28 @@ void dap_chain_net_srv_deinit(void) } +static void* get_cdb_func(const char *func_name) +{ + void *l_ref_func = NULL; + // find func from dynamic library +#if defined (DAP_OS_LINUX) && !defined (__ANDROID__) + const char * s_default_path_modules = "var/modules"; + const char * l_cdb_so_name = "libcellframe-node-cdb.so"; + char *l_lib_path = dap_strdup_printf("%s/%s/%s", g_sys_dir_path, s_default_path_modules, l_cdb_so_name); + void* l_cdb_handle = NULL; + l_cdb_handle = dlopen(l_lib_path, RTLD_NOW); + DAP_DELETE(l_lib_path); + if(!l_cdb_handle) { + log_it(L_ERROR, "Can't load %s module: %s", l_cdb_so_name, dlerror()); + } + else { + l_ref_func = dlsym(l_cdb_handle, func_name); + dlclose(l_cdb_handle); + } +#endif + return l_ref_func; +} + /** * @brief s_cli_net_srv * @param argc @@ -195,7 +229,7 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re dap_string_t *l_string_ret = dap_string_new(""); const char *l_order_str = NULL; - dap_chain_node_cli_find_option_val(argv, arg_index, argc, "order", &l_order_str); + int l_order_arg_pos = dap_chain_node_cli_find_option_val(argv, arg_index, argc, "order", &l_order_str); // Order direction const char *l_direction_str = NULL; @@ -518,9 +552,59 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re dap_string_append_printf( l_string_ret, "Missed some required params\n"); ret=-5; } + }else if( dap_strcmp( l_order_str, "recheck" ) == 0 ){ + //int dap_chain_net_srv_vpn_cdb_server_list_check_orders(dap_chain_net_t *a_net); + int (*dap_chain_net_srv_vpn_cdb_server_list_check_orders)(dap_chain_net_t *a_net) = NULL; + *(void **) (&dap_chain_net_srv_vpn_cdb_server_list_check_orders) = get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_check_orders"); + int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_check_orders ? (*dap_chain_net_srv_vpn_cdb_server_list_check_orders)(l_net) : -5; + //int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_check_orders(l_net); + ret = -10; + + }else if( dap_strcmp( l_order_str, "static" ) == 0 ){ + // find the subcommand directly after the 'order' command + int l_subcmd_save = dap_chain_node_cli_find_option_val(argv, l_order_arg_pos + 1, l_order_arg_pos + 2, "save", NULL); + int l_subcmd_del = dap_chain_node_cli_find_option_val(argv, l_order_arg_pos + 1, l_order_arg_pos + 2, "delete", NULL) | + dap_chain_node_cli_find_option_val(argv, l_order_arg_pos + 1, l_order_arg_pos + 2, "del", NULL); + + int (*dap_chain_net_srv_vpn_cdb_server_list_static_create)(dap_chain_net_t *a_net) = NULL; + int (*dap_chain_net_srv_vpn_cdb_server_list_static_delete)(dap_chain_net_t *a_net) = NULL; + // find func from dinamic library + if(l_subcmd_save || l_subcmd_del) { + *(void **) (&dap_chain_net_srv_vpn_cdb_server_list_static_create) = get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_static_create"); + *(void **) (&dap_chain_net_srv_vpn_cdb_server_list_static_delete) = get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_static_delete"); + } + if(l_subcmd_save) { + int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_create ? (*dap_chain_net_srv_vpn_cdb_server_list_static_create)(l_net) : -5; + //int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_create(l_net); + if(l_init_res >= 0){ + dap_string_append_printf(l_string_ret, "Static node list saved, %d orders in list\n", l_init_res); + ret = 0; + } + else{ + dap_string_append_printf(l_string_ret, "Static node list not saved, error code %d\n", l_init_res); + ret = -11; + } + + } else if(l_subcmd_del) { + int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_delete ? (*dap_chain_net_srv_vpn_cdb_server_list_static_delete)(l_net) : -5; + //int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_delete(l_net); + if(!l_init_res){ + dap_string_append_printf(l_string_ret, "Static node list deleted\n"); + ret = 0; + } + else if(l_init_res > 0){ + dap_string_append_printf(l_string_ret, "Static node list already deleted\n"); + ret = -12; + } + else + dap_string_append_printf(l_string_ret, "Static node list not deleted, error code %d\n", l_init_res); + } else { + dap_string_append(l_string_ret, "not found subcommand 'save' or 'delete'\n"); + ret = -13; + } } else { - dap_string_append_printf( l_string_ret, "Unknown subcommand \n"); - ret=-3; + dap_string_append_printf(l_string_ret, "Unknown subcommand '%s'\n", l_order_str); + ret = -3; } dap_chain_node_cli_set_reply_text(a_str_reply, l_string_ret->str); dap_string_free(l_string_ret, true); diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index 869461dc4f5340562c2a40ee97251d6fa451f224..60be621e94b8cc5d0937a6d05bc9882044300f84 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -134,21 +134,21 @@ bool dap_chain_net_srv_order_set_continent_region(dap_chain_net_srv_order_t **a_ * @param a_continent_num [out] * @param a_region [out] */ -bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_order, uint8_t *a_continent_num, char **a_region) +bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_order_static, uint8_t *a_continent_num, char **a_region) { - if(!a_order || !a_order->ext_size || a_order->ext[0]!=0x52) + if(!a_order_static || !a_order_static->ext_size || a_order_static->ext[0]!=0x52) return false; if(a_continent_num) { - if((uint8_t)a_order->ext[1]!=0xff) - memcpy(a_continent_num, a_order->ext + 1, sizeof(uint8_t)); + if((uint8_t)a_order_static->ext[1]!=0xff) + memcpy(a_continent_num, a_order_static->ext + 1, sizeof(uint8_t)); else a_continent_num = 0; } if(a_region) { - size_t l_size = a_order->ext_size - sizeof(uint8_t) - 1; + size_t l_size = a_order_static->ext_size - sizeof(uint8_t) - 1; if(l_size > 0) { *a_region = DAP_NEW_SIZE(char, l_size); - memcpy(*a_region, a_order->ext + 1 + sizeof(uint8_t), l_size); + memcpy(*a_region, a_order_static->ext + 1 + sizeof(uint8_t), l_size); } else *a_region = NULL; @@ -203,9 +203,12 @@ const char* dap_chain_net_srv_order_continent_to_str(int8_t a_num) int8_t dap_chain_net_srv_order_continent_to_num(const char *a_continent_str) { int8_t l_count = dap_chain_net_srv_order_continents_count(); + // convert to to upper case char *l_continent_str = dap_strup(a_continent_str, -1); for(int8_t i = 1; i < l_count; i++) { + // convert to to upper case char *l_server_continents = dap_strup(s_server_continents[i], -1); + // compare strings in upper case if(!dap_strcmp(l_continent_str, l_server_continents)) { DAP_DELETE(l_server_continents); DAP_DELETE(l_continent_str); @@ -214,7 +217,8 @@ int8_t dap_chain_net_srv_order_continent_to_num(const char *a_continent_str) DAP_DELETE(l_server_continents); } DAP_DELETE(l_continent_str); - return -1; + // none + return 0; } char * dap_chain_net_srv_order_create( 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 f4a65545ea90428e278f79e85c0bdab4fda83b7e..a39ef94d3bd625beebecb770cf2b883458c6b720 100644 --- a/modules/net/srv/include/dap_chain_net_srv_order.h +++ b/modules/net/srv/include/dap_chain_net_srv_order.h @@ -124,3 +124,17 @@ DAP_STATIC_INLINE char * dap_chain_net_srv_order_get_gdb_group(dap_chain_net_t * } return NULL; } + +/** +* @brief dap_chain_net_srv_order_get_gdb_group_mempool +* @param l_chain +* @return +*/ +DAP_STATIC_INLINE char * dap_chain_net_srv_order_get_nodelist_group(dap_chain_net_t * a_net) +{ + if ( a_net ) { + const char c_srv_order_group_str[]="service.orders.static_nodelist"; + return dap_strdup_printf("%s.%s",a_net->pub.gdb_groups_prefix,c_srv_order_group_str); + } + return NULL; +}