diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f39fae0270e87948077680944c78f7bbf23fa2a..b02e90542e7f106fc08f385c56d4f6c8dc7f7ee4 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,7 +33,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRCS} ${DAP_CHAIN_NET_HEADERS find_package(PkgConfig REQUIRED) pkg_search_module(GLIB REQUIRED glib-2.0) -target_link_libraries(dap_chain_net dap_core dap_crypto dap_chain dap_chain_crypto dap_chain_wallet dap_chain_mempool dap_chain_global_db -lresolv ${GLIB_LDFLAGS}) +target_link_libraries(dap_chain_net dap_core dap_crypto dap_stream_ch_chain dap_stream_ch_chain_net dap_chain dap_chain_crypto dap_chain_wallet dap_chain_mempool dap_chain_global_db -lresolv ${GLIB_LDFLAGS}) target_include_directories(dap_chain_net INTERFACE . PUBLIC ${GLIB_INCLUDE_DIRS} ${IPUTILS_INCLUDE_DIRS}) set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE) diff --git a/dap_chain_node_cli.c b/dap_chain_node_cli.c index 11b6405c511f6a77ca3e1e1d0a755dc76e5ac799..4efe82a53ba64bccab20b14b706cf8657a06433f 100644 --- a/dap_chain_node_cli.c +++ b/dap_chain_node_cli.c @@ -76,6 +76,7 @@ static const COMMAND commands[] = "tracepath host" }, { "help", com_help, "Description of command parameters", "" }, { "?", com_help, "Synonym for 'help'", "" }, + { "wallet", com_tx_wallet, "Wallet info", "wallet [list | info -addr <addr> -w <wallet_name>]" }, { "tx_create", com_tx_create, "Make transaction", "tx_create from <addr> to <addr> value <val> [fee <addr> value_fee <val>]" }, { "tx_verify", com_tx_verify, "Verifing transaction", diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c index b9949e13d57abb8c77852306f1a567607d57d588..2ddfdd6d2ee82167747a9b28c0d020a54c53b779 100644 --- a/dap_chain_node_cli_cmd.c +++ b/dap_chain_node_cli_cmd.c @@ -46,6 +46,8 @@ #include "dap_chain_datum_tx_items.h" #include "dap_chain_datum_tx_cache.h" +#include "dap_stream_ch_chain_net.h" + // Max and min macros #define max(a,b) ((a) > (b) ? (a) : (b)) #define min(a,b) ((a) < (b) ? (a) : (b)) @@ -668,7 +670,7 @@ int com_global_db(int argc, const char ** argv, char **str_reply) int com_node(int argc, const char ** argv, char **str_reply) { enum { - CMD_NONE, CMD_ALIAS, CMD_HANDSHAKE + CMD_NONE, CMD_ALIAS, CMD_HANDSHAKE, CMD_CONNECT }; int arg_index = 1; int cmd_num = CMD_NONE; @@ -677,6 +679,9 @@ int com_node(int argc, const char ** argv, char **str_reply) if(find_option_val(argv, arg_index, min(argc, arg_index + 1), "handshake", NULL)) { cmd_num = CMD_HANDSHAKE; } + else if(find_option_val(argv, arg_index, min(argc, arg_index + 1), "connect", NULL)) { + cmd_num = CMD_CONNECT; + } else if(find_option_val(argv, arg_index, min(argc, arg_index + 1), "alias", NULL)) { cmd_num = CMD_ALIAS; } @@ -718,9 +723,70 @@ int com_node(int argc, const char ** argv, char **str_reply) } break; + // make connect + case CMD_CONNECT: { + // get address from alias if addr not defined + if(alias_str && !address.uint64) { + dap_chain_node_addr_t *address_tmp = get_name_by_alias(alias_str); + if(address_tmp) { + memcpy(&address, address_tmp, sizeof(address_tmp)); + DAP_DELETE(address_tmp); + } + else { + set_reply_text(str_reply, "no address found by alias"); + return -1; + } + } + if(!address.uint64) { + set_reply_text(str_reply, "addr not found"); + return -1; + } + + dap_chain_node_info_t *node_info = dap_chain_node_info_read(&address, str_reply); + if(!node_info) { + set_reply_text(str_reply, "node by addr not found"); + return -1; + } + int timeout_ms = 1000000; //10 sec = 10000 ms + // start connect + dap_chain_node_client_t *client = dap_chain_node_client_connect(node_info); + if(!client) { + set_reply_text(str_reply, "can't connect"); + DAP_DELETE(node_info); + return -1; + } + // wait connected + int res = chain_node_client_wait(client, NODE_CLIENT_STATE_CONNECTED, timeout_ms); + if(res != 1) { + set_reply_text(str_reply, "no response from node"); + // clean client struct + dap_chain_node_client_close(client); + DAP_DELETE(node_info); + return -1; + } + + // send request + uint8_t l_ch_id = dap_stream_ch_chain_net_get_id(); // Channel id for global_db sync + res = dap_chain_node_client_send_chain_request(client, l_ch_id, "start", 5); //, NULL); + if(res != 1) { + set_reply_text(str_reply, "no response from node(send request)"); + // clean client struct + dap_chain_node_client_close(client); + DAP_DELETE(node_info); + return -1; + } + + // wait for finishing of request + res = chain_node_client_wait(client, NODE_CLIENT_STATE_PONG, timeout_ms); + DAP_DELETE(node_info); + dap_client_disconnect(client->client); + dap_chain_node_client_close(client); + set_reply_text(str_reply, "getting pong"); + } + break; // make handshake - case CMD_HANDSHAKE: + case CMD_HANDSHAKE: { // get address from alias if addr not defined if(alias_str && !address.uint64) { dap_chain_node_addr_t *address_tmp = get_name_by_alias(alias_str); @@ -740,9 +806,10 @@ int com_node(int argc, const char ** argv, char **str_reply) dap_chain_node_info_t *node_info = dap_chain_node_info_read(&address, str_reply); if(!node_info) { + set_reply_text(str_reply, "node by addr not found"); return -1; } - int timeout_ms = 10000; //10 sec. + int timeout_ms = 10000; //10 sec = 10000 ms // start handshake dap_chain_node_client_t *client = dap_chain_node_client_connect(node_info); if(!client) { @@ -775,6 +842,7 @@ int com_node(int argc, const char ** argv, char **str_reply) return -1; } set_reply_text(str_reply, "connection established"); + } break; } return 0; @@ -919,17 +987,29 @@ int com_tracepath(int argc, const char** argv, char **str_reply) */ int com_ping(int argc, const char** argv, char **str_reply) { - const char *addr = NULL; int n = 4; - if(argc > 1) - addr = argv[1]; + if(argc < 2) { + set_reply_text(str_reply, "host not specified"); + return -1; + } const char *n_str = NULL; - if(find_option_val(argv, 2, argc, "-n", &n_str)) - n = (n_str) ? atoi(n_str) : 4; - else if(find_option_val(argv, 2, argc, "-c", &n_str)) + int argc_host = 1; + int argc_start = 1; + argc_start = find_option_val(argv, argc_start, argc, "-n", &n_str); + if(argc_start) { + argc_host = argc_start + 1; n = (n_str) ? atoi(n_str) : 4; + } + else { + argc_start = find_option_val(argv, argc_start, argc, "-c", &n_str); + if(argc_start) { + argc_host = argc_start + 1; + n = (n_str) ? atoi(n_str) : 4; + } + } if(n <= 1) n = 1; + const char *addr = argv[argc_host]; iputils_set_verbose(); int res = (addr) ? ping_util(addr, n) : -EADDRNOTAVAIL; if(res >= 0) { @@ -984,7 +1064,103 @@ int com_help(int argc, const char ** argv, char **str_reply) /** * com_tx_create command * - * Signing transaction + * Wallet info + */ +int com_tx_wallet(int argc, const char ** argv, char **str_reply) +{ + const char *c_wallets_path = "/opt/kelvin-node/etc"; + // Get address of wallet + enum { + CMD_NONE, CMD_WALLET_LIST, CMD_WALLET_INFO + }; + int arg_index = 1; + int cmd_num = CMD_NONE; + const char *cmd_str = NULL; + // find add parameter ('alias' or 'handshake') + if(find_option_val(argv, arg_index, min(argc, arg_index + 1), "list", NULL)) { + cmd_num = CMD_WALLET_LIST; + } + else if(find_option_val(argv, arg_index, min(argc, arg_index + 1), "info", NULL)) { + cmd_num = CMD_WALLET_INFO; + } + arg_index++; + if(cmd_num == CMD_NONE) { + set_reply_text(str_reply, "format of command: wallet [list | info -addr <addr> -w <wallet_name>]"); + return -1; + } + + dap_chain_node_addr_t address; + memset(&address, 0, sizeof(dap_chain_node_addr_t)); + const char *addr_str = NULL, *wallet_name = NULL; + // find wallet addr + find_option_val(argv, arg_index, argc, "-addr", &addr_str); + find_option_val(argv, arg_index, argc, "-w", &wallet_name); + + GString *l_string_ret = g_string_new(NULL); + switch (cmd_num) { + // wallet list + case CMD_WALLET_LIST: { + GDir *l_dir = g_dir_open(c_wallets_path, 0, NULL); + if(l_dir) { + const char *l_file = NULL; + do { + l_file = g_dir_read_name(l_dir); + int l_file_len = (l_file) ? strlen(l_file) : 0; + if(l_file_len > 8 && !g_strcmp0(l_file + l_file_len - 8, ".dwallet")) { + char *l_file_path_tmp = g_strdup_printf("%s/%s", c_wallets_path, l_file); + dap_chain_wallet_t *l_wallet = dap_chain_wallet_open_file(l_file_path_tmp); + if(l_wallet) { + dap_chain_addr_t *l_addr = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet); + char *l_addr_str = dap_chain_addr_to_str((dap_chain_addr_t*) l_addr); + g_string_append_printf(l_string_ret, "\nwallet: %s\n", l_wallet->name); + g_string_append_printf(l_string_ret, "addr: %s\n", (l_addr_str) ? l_addr_str : "-"); + DAP_DELETE(l_addr_str); + dap_chain_wallet_close(l_wallet); + } + g_free(l_file_path_tmp); + } + } + while(l_file); + g_dir_close(l_dir); + } + } + break; + + // wallet info + case CMD_WALLET_INFO: { + dap_chain_wallet_t *l_wallet = NULL; + if(wallet_name) + l_wallet = dap_chain_wallet_open(wallet_name, c_wallets_path); + if(l_wallet) { + dap_chain_addr_t *l_addr = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet); + char *l_addr_str = dap_chain_addr_to_str((dap_chain_addr_t*) l_addr); + uint64_t balance = dap_chain_datum_tx_cache_calc_balance(l_addr); + g_string_append_printf(l_string_ret, "\nwallet: %s\n", l_wallet->name); + g_string_append_printf(l_string_ret, "addr: %s\n", (l_addr_str) ? l_addr_str : "-"); + g_string_append_printf(l_string_ret, "balance: %lld\n", balance); + DAP_DELETE(l_addr_str); + dap_chain_wallet_close(l_wallet); + } + else { + g_string_free(l_string_ret, TRUE); + set_reply_text(str_reply, "wallet not found"); + return -1; + } + } + break; + } + + char *l_str_ret_tmp = g_string_free(l_string_ret, FALSE); + char *str_ret = strdup(l_str_ret_tmp); + set_reply_text(str_reply, str_ret); + g_free(l_str_ret_tmp); + return 0; +} + +/** + * com_tx_create command + * + * Create transaction */ int com_tx_create(int argc, const char ** argv, char **str_reply) { @@ -1024,27 +1200,32 @@ int com_tx_create(int argc, const char ** argv, char **str_reply) return -1; } - const char *a_wallets_path = "/opt/kelvin-node/etc"; + const char *c_wallets_path = "/opt/kelvin-node/etc"; const char *a_wallet_name_bliss = "w_bliss"; const char *a_wallet_name_bliss2 = "w_bliss2"; const char *a_wallet_name_picnic = "w_picnic"; const char *a_wallet_name_tesla = "w_tesla"; - dap_chain_wallet_t *wallet_bliss = dap_chain_wallet_open(a_wallet_name_bliss, a_wallets_path); - dap_chain_wallet_t *wallet_bliss2 = dap_chain_wallet_open(a_wallet_name_bliss2, a_wallets_path); - dap_chain_wallet_t *wallet_picnic = dap_chain_wallet_open(a_wallet_name_picnic, a_wallets_path); - //dap_chain_wallet_t *wallet_tesla = dap_chain_wallet_open(a_wallet_name_tesla, a_wallets_path); + dap_chain_wallet_t *wallet_bliss = dap_chain_wallet_open(a_wallet_name_bliss, c_wallets_path); + dap_chain_wallet_t *wallet_bliss2 = dap_chain_wallet_open(a_wallet_name_bliss2, c_wallets_path); + dap_chain_wallet_t *wallet_picnic = dap_chain_wallet_open(a_wallet_name_picnic, c_wallets_path); + dap_chain_wallet_t *wallet_tesla = dap_chain_wallet_open(a_wallet_name_tesla, c_wallets_path); dap_enc_key_t *l_key_bliss = dap_chain_wallet_get_key(wallet_bliss, 0); dap_enc_key_t *l_key_bliss2 = dap_chain_wallet_get_key(wallet_bliss2, 0); dap_enc_key_t *l_key_picnic = dap_chain_wallet_get_key(wallet_picnic, 0); - //dap_enc_key_t *l_key_tesla = dap_chain_wallet_get_key(wallet_tesla, 0); + dap_enc_key_t *l_key_tesla = dap_chain_wallet_get_key(wallet_tesla, 0); char *addr_w_bliss = - "EXh66KVCxChbKHQcTWKYJXhua6HVZecpxuTTmWGuqm1V4vy5mVq52wD8rMQvfUnmJHsL4MuoJ7YVSFqn2RrdoN19mqHP1aQXSQPnXDR6oP9vsBPwYC9PhSvAxFystX"; + //"EXh66KVCxChbKHQcTWKYJXhua6HVZecpxuTTmWGuqm1V4vy5mVq52wD8rMQvfUnmJHsL4MuoJ7YVSFqn2RrdoN19mqHP1aQXSQPnXDR6oP9vsBPwYC9PhSvAxFystX"; + "EXh66KVCxChbKHQcSCRnMTByuFRDU2UsZUViPz2BoUAEYYWPfu8WhHhqX9HSyL3U3Q54JvJoKRZhRtumsAVNV6j8pzgtZDkkwzLgHBCAQHcG2FaSwCxESjkCYkgHUo"; char *addr_w_bliss2 = - "EXh66KVCxChbKHQcTeGf8TT7KhcCiiQ9TrPn6rcbNoNKuhAyJ4T9zr5yMfMCXGLVHmxVKZ6J4E9Zc7pNmAa4yrKNb3DkS34jxD6Q4MCXbHJMAPFEVtMoDdFMtCysE2"; + //"EXh66KVCxChbKHQcTeGf8TT7KhcCiiQ9TrPn6rcbNoNKuhAyJ4T9zr5yMfMCXGLVHmxVKZ6J4E9Zc7pNmAa4yrKNb3DkS34jxD6Q4MCXbHJMAPFEVtMoDdFMtCysE2"; + "EXh66KVCxChbKHQcSx27VwwbUnT2rRGNDBJm6zdC3DQw8XWtHqHrpoc9NEVd6Ub5rdFosQiXgWc5VhiNoySB6T4E49LMhMnLhr9sMSVqRr7Mix4bPrPEZXsYnNLzeX"; char *addr_w_picnic = - "EXh66KVCxChbKJLxZbyNJLxfF8CfGZmdenQWuqtr8MnXavhJaLo6vckjpYgpcevBo3zB65sAGQJT3ctYVwQnASc6sYyaawFHnacsrcP47PB4XfLYiEDZvwog4AVdbC"; + //"EXh66KVCxChbKJLxZbyNJLxfF8CfGZmdenQWuqtr8MnXavhJaLo6vckjpYgpcevBo3zB65sAGQJT3ctYVwQnASc6sYyaawFHnacsrcP47PB4XfLYiEDZvwog4AVdbC"; + "EXh66KVCxChbKJLxXTwipYMooUpoGvpwpkcjpmGLbubwzqR2vVsH9HEgT2LcU2hDs2BTFkaNC8itE8nuCWxskVtRJG4iaubBDcRWAt2awtCVHAULffQGrwe8ocRCzS"; + char *addr_w_tesla = + "EXh66KVCxChbTZ9umzb4Y6nJcMti8DPUdrsE1V4adjoKyPG3VvyrzHh6wrP6wGERLq9Qj5qK4hMEjd6uidcbsSSpzKQuADC2g1DzYkCCcitAs2Nsxk4dhespDdximc"; dap_chain_wallet_t *l_wallet; dap_enc_key_t *l_key; @@ -1057,7 +1238,7 @@ int com_tx_create(int argc, const char ** argv, char **str_reply) l_key = l_key_bliss2; } else if(!strcmp(addr_base58_from, addr_w_picnic)) { - l_wallet = l_key_picnic; + l_wallet = wallet_picnic; l_key = l_key_picnic; } if(!l_wallet || !l_key) { @@ -1069,6 +1250,33 @@ int com_tx_create(int argc, const char ** argv, char **str_reply) dap_chain_addr_t *addr_to = dap_chain_str_to_addr(addr_base58_to); dap_chain_addr_t *addr_fee = dap_chain_str_to_addr(addr_base58_fee); + if(!addr_from) { + set_reply_text(str_reply, "source address is invalid"); + return -1; + } + if(!addr_to) { + set_reply_text(str_reply, "destination address is invalid"); + return -1; + } + if(addr_base58_fee && !addr_fee) { + set_reply_text(str_reply, "fee address is invalid"); + return -1; + } + /* dap_chain_addr_t *addr_b2 = (dap_chain_addr_t *) dap_chain_wallet_get_addr(wallet_bliss2); + dap_chain_addr_t *addr_p = (dap_chain_addr_t *) dap_chain_wallet_get_addr(wallet_picnic); + dap_chain_addr_t *addr_t = (dap_chain_addr_t *) dap_chain_wallet_get_addr(wallet_tesla); + + char *addr_str_b2 = dap_chain_addr_to_str((dap_chain_addr_t*) addr_b2); + char *addr_str_p = dap_chain_addr_to_str((dap_chain_addr_t*) addr_p); + char *addr_str_t = dap_chain_addr_to_str((dap_chain_addr_t*) addr_t); + + char *addr_str = dap_chain_addr_to_str((dap_chain_addr_t*) addr_from); + const dap_chain_addr_t *addr2 = dap_chain_str_to_addr(addr_str); + char *addr_str2 = dap_chain_addr_to_str(addr2); + int a1 = strcmp(addr_str, addr_str2); + int a2 = strcmp(addr_str, addr_w_bliss); + int a3 = strcmp(addr_str, addr_w_bliss2);*/ + static bool l_first_start = true; if(l_first_start) { @@ -1085,7 +1293,8 @@ int com_tx_create(int argc, const char ** argv, char **str_reply) uint64_t balance2 = dap_chain_datum_tx_cache_calc_balance(addr_to); uint64_t balance3 = dap_chain_datum_tx_cache_calc_balance(addr_fee); uint64_t balance1 = dap_chain_datum_tx_cache_calc_balance(addr_from); - g_string_append_printf(string_ret, "balance w1=%lld w2=%lld w3=%lld\n", + g_string_append_printf(string_ret, "transactions in cache=%d balance w_from=%lld w_to=%lld w_feee=%lld\n", + dap_chain_node_datum_tx_cache_count(), balance1, balance2, balance3); int res = dap_chain_datum_tx_ctrl_create_transfer(l_key, addr_from, addr_to, addr_fee, value, value_fee); @@ -1095,18 +1304,22 @@ int com_tx_create(int argc, const char ** argv, char **str_reply) uint64_t balance1 = dap_chain_datum_tx_cache_calc_balance(addr_from); uint64_t balance2 = dap_chain_datum_tx_cache_calc_balance(addr_to); uint64_t balance3 = dap_chain_datum_tx_cache_calc_balance(addr_fee); - g_string_append_printf(string_ret, "balance w1=%lld w2=%lld w3=%lld\n", + g_string_append_printf(string_ret, "transactions in cache=%d balance w_from=%lld w_to=%lld w_feee=%lld\n", + dap_chain_node_datum_tx_cache_count(), balance1, balance2, balance3); } char *str_ret_tmp = g_string_free(string_ret, FALSE); char *str_ret = strdup(str_ret_tmp); set_reply_text(str_reply, str_ret); + g_free(str_ret_tmp); + DAP_DELETE(addr_to); + DAP_DELETE(addr_fee); dap_chain_wallet_close(wallet_bliss); dap_chain_wallet_close(wallet_bliss2); dap_chain_wallet_close(wallet_picnic); - //dap_chain_wallet_close(wallet_tesla); + dap_chain_wallet_close(wallet_tesla); return 0; } diff --git a/dap_chain_node_cli_cmd.h b/dap_chain_node_cli_cmd.h index 61f9e4484e0700b846c583238b64ac625a994e09..59c0e0dec64bd169ad16ad38e6e1750097068efb 100644 --- a/dap_chain_node_cli_cmd.h +++ b/dap_chain_node_cli_cmd.h @@ -76,7 +76,14 @@ int com_help(int argc, const char ** argv, char **str_reply); /** * com_tx_create command * - * Signing transaction + * Wallet info + */ +int com_tx_wallet(int argc, const char ** argv, char **str_reply); + +/** + * com_tx_create command + * + * Create transaction */ int com_tx_create(int argc, const char ** argv, char **str_reply); diff --git a/dap_chain_node_client.c b/dap_chain_node_client.c index c6c2c16ea9035a6a6b192b897fd20334a8eefc7d..e7ef53cfc906c0fdde49767862dec8ecba4f5ff9 100644 --- a/dap_chain_node_client.c +++ b/dap_chain_node_client.c @@ -32,6 +32,11 @@ #include "dap_config.h" #include "dap_events.h" #include "dap_http_client_simple.h" +#include "dap_client_pvt.h" +#include "dap_stream_ch_pkt.h" +#include "dap_stream_ch_chain_net.h" +#include "dap_stream_ch_chain_net_pkt.h" +#include "dap_stream_pkt.h" #include "dap_chain_node_client.h" #define LOG_TAG "dap_chain_node_client" @@ -78,14 +83,14 @@ static void stage_status_error_callback(dap_client_t *a_client, void *a_arg) //printf("* tage_status_error_callback client=%x data=%x\n", a_client, a_arg); } -// callback for the end of handshake in dap_client_go_stage() / chain_node_client_connect() +// callback for the end of connection in dap_chain_node_client_connect()->dap_client_go_stage() static void a_stage_end_callback(dap_client_t *a_client, void *a_arg) { dap_chain_node_client_t *client = a_client->_inheritor; assert(client); if(client) { pthread_mutex_lock(&client->wait_mutex); - client->state = NODE_CLIENT_STATE_CONNECT; + client->state = NODE_CLIENT_STATE_CONNECTED; pthread_cond_signal(&client->wait_cond); pthread_mutex_unlock(&client->wait_mutex); } @@ -107,7 +112,7 @@ dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_node_info_t *no pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); pthread_cond_init(&l_node_client->wait_cond, &attr); pthread_mutex_init(&l_node_client->wait_mutex, NULL); - l_node_client->events = dap_events_new(); + l_node_client->events = NULL; //dap_events_new(); l_node_client->client = dap_client_new(l_node_client->events, stage_status_callback, stage_status_error_callback); l_node_client->client->_inheritor = l_node_client; @@ -128,17 +133,16 @@ dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_node_info_t *no dap_chain_node_client_close(l_node_client); return NULL; } - dap_client_set_uplink( l_node_client->client, strdup(host), listen_port_tcp ); + dap_client_set_uplink(l_node_client->client, strdup(host), listen_port_tcp); // dap_client_stage_t a_stage_target = STAGE_ENC_INIT; dap_client_stage_t a_stage_target = STAGE_STREAM_STREAMING; l_node_client->state = NODE_CLIENT_STATE_CONNECT; - // Handshake + // Handshake & connect dap_client_go_stage(l_node_client->client, a_stage_target, a_stage_end_callback); return l_node_client; } - /** * Close connection to server, delete chain_node_client_t *client */ @@ -154,6 +158,94 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client) } } +/* +// callback for dap_client_request_enc() in client_mempool_send_datum() +static void s_response_proc(dap_client_t *a_client, void *str, size_t str_len) +{ + printf("* s_response_proc a_client=%x str=%s str_len=%d\n", a_client, str, str_len); + dap_chain_node_client_t *l_client = a_client->_inheritor; + assert(l_client); + if(l_client) { + if(str_len > 0) { +// l_client->read_data_t.data = DAP_NEW_Z_SIZE(uint8_t, str_len + 1); +// if(l_client->read_data_t.data) { +// memcpy(l_client->read_data_t.data, str, str_len); +// l_client->read_data_t.data_len = str_len; + } + } + pthread_mutex_lock(&l_client->wait_mutex); + l_client->state = NODE_CLIENT_STATE_SENDED; + pthread_cond_signal(&l_client->wait_cond); + pthread_mutex_unlock(&l_client->wait_mutex); +} +*/ + +/*// callback for dap_client_request_enc() in client_mempool_send_datum() + static void s_response_error(dap_client_t *a_client, int val) + { + printf("* s_response_error a_client=%x val=%d\n", a_client, val); + client_mempool_t *mempool = a_client->_inheritor; + assert(mempool); + if(mempool) { + pthread_mutex_lock(&mempool->wait_mutex); + mempool->state = CLIENT_MEMPOOL_ERROR; + pthread_cond_signal(&mempool->wait_cond); + pthread_mutex_unlock(&mempool->wait_mutex); + } + } + + // set new state and delete previous read data + static void dap_chain_node_client_reset(dap_chain_node_client_t *a_client, int new_state) + { + if(!a_client) + return; + pthread_mutex_lock(&a_client->wait_mutex); + //a_client->read_data_t.data_len = 0; + //DAP_DELETE(a_client->read_data_t.data); + //a_client->read_data_t.data = NULL; + a_client->state = new_state; + pthread_mutex_unlock(&a_client->wait_mutex); + }*/ + +static void dap_chain_node_client_callback(dap_stream_ch_chain_net_pkt_t *a_ch_chain_net, void *a_arg) +{ + dap_chain_node_client_t *client = (dap_chain_node_client_t*)a_arg; + assert(client); + if(a_ch_chain_net->hdr.type==STREAM_CH_CHAIN_NET_PKT_TYPE_PONG) { + pthread_mutex_lock(&client->wait_mutex); + client->state = NODE_CLIENT_STATE_PONG; + pthread_cond_signal(&client->wait_cond); + pthread_mutex_unlock(&client->wait_mutex); + } +} + +/** + * Send stream request to server + */ +int dap_chain_node_client_send_chain_request(dap_chain_node_client_t *a_client, uint8_t a_ch_id, + char *a_buf, size_t a_buf_size) +{ + if(!a_client || a_client->state < NODE_CLIENT_STATE_CONNECTED) + return -1; + dap_stream_t *l_stream = dap_client_get_stream(a_client->client); + dap_stream_ch_t * l_ch = dap_client_get_stream_ch(a_client->client, a_ch_id); + if(l_ch) + { + dap_stream_ch_chain_net_t * l_ch_chain = DAP_STREAM_CH_CHAIN_NET(l_ch); + l_ch_chain->notify_callback = dap_chain_node_client_callback; + l_ch_chain->notify_callback_arg = a_client; + int l_res = dap_stream_ch_chain_net_pkt_write(l_ch, STREAM_CH_CHAIN_NET_PKT_TYPE_PING, a_buf, a_buf_size); + if(l_res <=0) + return -1; + bool is_ready = true; + dap_events_socket_set_writable(l_ch->stream->events_socket, is_ready); + //dap_stream_ch_ready_to_write(ch, true); + } + else + return -1; + return 1; +} + /** * wait for the complete of request * @@ -161,15 +253,15 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client) * waited_state state which we will wait, sample NODE_CLIENT_STATE_CONNECT or NODE_CLIENT_STATE_SENDED * return -1 false, 0 timeout, 1 end of connection or sending data */ -int chain_node_client_wait(dap_chain_node_client_t *client, int waited_state, int timeout_ms) +int chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_state, int timeout_ms) { int ret = -1; - if(!client) + if(!a_client) return -1; - pthread_mutex_lock(&client->wait_mutex); + pthread_mutex_lock(&a_client->wait_mutex); // have waited - if(client->state == waited_state) { - pthread_mutex_unlock(&client->wait_mutex); + if(a_client->state == a_waited_state) { + pthread_mutex_unlock(&a_client->wait_mutex); return 1; } // prepare for signal waiting @@ -184,11 +276,11 @@ int chain_node_client_wait(dap_chain_node_client_t *client, int waited_state, in else to.tv_nsec = (long) nsec_new; // signal waiting - int wait = pthread_cond_timedwait(&client->wait_cond, &client->wait_mutex, &to); + int wait = pthread_cond_timedwait(&a_client->wait_cond, &a_client->wait_mutex, &to); if(wait == 0) //0 ret = 1; else if(wait == ETIMEDOUT) // 110 260 ret = 0; - pthread_mutex_unlock(&client->wait_mutex); + pthread_mutex_unlock(&a_client->wait_mutex); return ret; } diff --git a/dap_chain_node_client.h b/dap_chain_node_client.h index d6b86bfd6bc1f3f79ea7951a3235a7c04d5ac13f..5f2a0e88cff2c8af1e2230fac8b147127a42e816 100644 --- a/dap_chain_node_client.h +++ b/dap_chain_node_client.h @@ -33,8 +33,10 @@ enum { NODE_CLIENT_STATE_INIT, NODE_CLIENT_STATE_CONNECT, NODE_CLIENT_STATE_CONNECTED, - NODE_CLIENT_STATE_SEND, - NODE_CLIENT_STATE_SENDED, + //NODE_CLIENT_STATE_SEND, + //NODE_CLIENT_STATE_SENDED, + NODE_CLIENT_STATE_PING, + NODE_CLIENT_STATE_PONG, NODE_CLIENT_STATE_END }; @@ -72,6 +74,12 @@ dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_node_info_t *no */ void dap_chain_node_client_close(dap_chain_node_client_t *client); +/** + * Send stream request to server + */ +int dap_chain_node_client_send_chain_request(dap_chain_node_client_t *a_client, uint8_t a_ch_id, + char *a_buf, size_t a_buf_size); + /** * wait for the complete of request * diff --git a/iputils/ping_common.c b/iputils/ping_common.c index a7d257082e121c60a47ab98ea83421b6d61a53f9..15eddebc098579e168f75c8bf6cb3f956d63a69f 100755 --- a/iputils/ping_common.c +++ b/iputils/ping_common.c @@ -145,7 +145,7 @@ void usage(void) " -N <nodeinfo opt> use icmp6 node info query, try <help> as argument\n" "\nFor more details see ping(8).\n" ); - exit(2); + //exit(2); } void limit_capabilities(void)