From 3ee1901b11b3b083a692217cf37a9f406c8848b3 Mon Sep 17 00:00:00 2001
From: "roman.khlopkov" <roman.khlopkov@demlabs.net>
Date: Wed, 21 Feb 2024 15:46:40 +0300
Subject: [PATCH] [* ] Node add modification for usability improvement

---
 modules/net/dap_chain_node_cli_cmd.c | 56 ++++++++++++----------------
 1 file changed, 23 insertions(+), 33 deletions(-)

diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 330cc816a1..ae5f71922d 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -1122,37 +1122,26 @@ int com_node(int a_argc, char ** a_argv, void **a_str_reply)
     dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-link", &l_link_str);
 
     // struct to write to the global db
-    dap_chain_node_addr_t l_node_addr = { 0 };
-    dap_chain_node_addr_t l_link = { 0 };
-    dap_chain_node_info_t *l_node_info = NULL;
+    dap_chain_node_addr_t l_node_addr, l_link;
+    dap_chain_node_info_t l_node_info;
 
     //TODO need to rework with new node info / alias /links concept
-    size_t l_node_info_size = sizeof(*l_node_info) + sizeof(l_link);
-    if(cmd_num >= CMD_ADD && cmd_num <= CMD_DEL) {
-        l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, l_node_info_size);
-        if (!l_node_info) {
-            log_it(L_CRITICAL, "Memory allocation error");
-            return -1;
-        }
-    }
 
     if(l_addr_str) {
         if(dap_chain_node_addr_from_str(&l_node_addr, l_addr_str) != 0) {
             dap_digit_from_string(l_addr_str, l_node_addr.raw, sizeof(l_node_addr.raw));
         }
-        if(l_node_info)
-            l_node_info->hdr.address = l_node_addr;
+        l_node_info.hdr.address = l_node_addr;
     }
     if(l_port_str) {
         uint16_t l_node_port = 0;
         dap_digit_from_string(l_port_str, &l_node_port, sizeof(uint16_t));
-        if(l_node_info)
-            l_node_info->hdr.ext_port = l_node_port;
+        l_node_info.hdr.ext_port = l_node_port;
     }
-    if(l_cell_str && l_node_info) {
-        dap_digit_from_string(l_cell_str, l_node_info->hdr.cell_id.raw, sizeof(l_node_info->hdr.cell_id.raw)); //DAP_CHAIN_CELL_ID_SIZE);
+    if (l_cell_str) {
+        dap_digit_from_string(l_cell_str, l_node_info.hdr.cell_id.raw, sizeof(l_node_info.hdr.cell_id.raw)); //DAP_CHAIN_CELL_ID_SIZE);
     }
-    if(l_link_str) {
+    if (l_link_str) {   // TODO
         if(dap_chain_node_addr_from_str(&l_link, l_link_str) != 0) {
             dap_digit_from_string(l_link_str, l_link.raw, sizeof(l_link.raw));
         }
@@ -1161,20 +1150,25 @@ int com_node(int a_argc, char ** a_argv, void **a_str_reply)
     switch (cmd_num)
     {    
     case CMD_ADD:
-        if(!l_port_str || !a_ipv4_str)
-        {
+        if(!l_port_str || !a_ipv4_str) {
             dap_cli_server_cmd_set_reply_text(a_str_reply, "node requires parameter -ipv4 and -port");
-            DAP_DELETE(l_node_info);
             return -1;
         }
-        dap_chain_node_info_t *l_link_node_request = DAP_NEW_Z( dap_chain_node_info_t);
-        l_link_node_request->hdr.address.uint64 = dap_chain_net_get_cur_addr_int(l_net);
-        inet_pton(AF_INET, a_ipv4_str, &(l_link_node_request->hdr.ext_addr_v4));
-        uint16_t l_node_port = 0;
-        dap_digit_from_string(l_port_str, &l_node_port, sizeof(uint16_t));
-        l_link_node_request->hdr.ext_port = l_node_port;
+        if (inet_pton(AF_INET, a_ipv4_str, &(l_node_info.hdr.ext_addr_v4)) <= 0) {
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "Incorrect ipv4 string");
+            return -2;
+        }
+        if (l_addr_str) {
+            if (dap_chain_node_info_save(l_net, &l_node_info) == DAP_GLOBAL_DB_RC_SUCCESS) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Node address successfully added to node list");
+                return 0;
+            }
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't add node address to node list");
+            return -3;
+        }
+        l_node_info.hdr.address.uint64 = dap_chain_net_get_cur_addr_int(l_net);
         // Synchronous request, wait for reply
-        int res = dap_chain_net_node_list_request(l_net,l_link_node_request, true);
+        int res = dap_chain_net_node_list_request(l_net, &l_node_info, true);
         switch (res)
         {
             case 0:
@@ -1201,16 +1195,12 @@ int com_node(int a_argc, char ** a_argv, void **a_str_reply)
             default:
                 break;
         }
-        DAP_DELETE(l_link_node_request);
-        DAP_DELETE(l_node_info);
         return l_ret;
         //break;
     case CMD_DEL:
         // handler of command 'node del'
     {
-        int l_ret = node_info_del_with_reply(l_net, l_node_info, alias_str, a_str_reply);
-        DAP_DELETE(l_node_info);
-        return l_ret;
+        return node_info_del_with_reply(l_net, &l_node_info, alias_str, a_str_reply);
     }
 
     case CMD_DUMP: {
-- 
GitLab