diff --git a/dap_chain_net.c b/dap_chain_net.c index a7c325aa7db02ab303da6ee5b99983cfdd4bd419..5aac9b5c47e5f4769f192bad8f7b796f2435d9f8 100644 --- a/dap_chain_net.c +++ b/dap_chain_net.c @@ -845,6 +845,13 @@ void dap_chain_net_load_all() continue; } DAP_DELETE(l_full_path); + // search only ".cfg" files + if(strlen(l_dir_entry->d_name) > 4) { // It has non zero name excluding file extension + if(strncmp(l_dir_entry->d_name + strlen(l_dir_entry->d_name) - 4, ".cfg", 4) != 0) { + // its not .cfg file + continue; + } + } log_it(L_DEBUG,"Network config %s try to load", l_dir_entry->d_name); //char* l_dot_pos = rindex(l_dir_entry->d_name,'.'); char* l_dot_pos = strchr(l_dir_entry->d_name,'.'); @@ -1066,6 +1073,23 @@ static int s_cli_net( int argc, char **argv, char **a_str_reply) return ret; } +// for sequential loading chains +typedef struct list_priority_{ + uint16_t prior; + char * chains_path; +}list_priority; + +static int callback_compare_prioritity_list(const void * a_item1, const void * a_item2) +{ + 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) + return 0; + if(l_item1->prior > l_item2->prior) + return 1; + return -1; +} + /** * @brief s_net_load * @param a_net_name @@ -1312,6 +1336,9 @@ int s_net_load(const char * a_net_name) DIR * l_chains_dir = opendir(l_chains_path); DAP_DELETE (l_chains_path); if ( l_chains_dir ){ + // for sequential loading chains + dap_list_t *l_prior_list = NULL; + struct dirent * l_dir_entry; while ( (l_dir_entry = readdir(l_chains_dir) )!= NULL ){ if (l_dir_entry->d_name[0]=='\0') @@ -1322,20 +1349,48 @@ int s_net_load(const char * a_net_name) l_entry_name [strlen(l_entry_name)-4] = 0; log_it(L_DEBUG,"Open chain config \"%s\"...",l_entry_name); l_chains_path = dap_strdup_printf("network/%s/%s",l_net->pub.name,l_entry_name); - // Create chain object - dap_chain_t * l_chain = dap_chain_load_from_cfg(l_net->pub.ledger, l_net->pub.name, - l_net->pub.id, l_chains_path); - if(l_chain) { - DL_APPEND(l_net->pub.chains, l_chain); - if(l_chain->callback_created) - l_chain->callback_created(l_chain, l_cfg); + dap_config_t * l_cfg = dap_config_open(l_chains_path); + if(l_cfg) { + list_priority *l_chain_prior = DAP_NEW_Z(list_priority); + l_chain_prior->prior = dap_config_get_item_uint16_default(l_cfg, "chain", "load_priority", 100); + l_chain_prior->chains_path = l_chains_path; + // add chain to load list; + l_prior_list = dap_list_append(l_prior_list, l_chain_prior); } - DAP_DELETE (l_chains_path); + // Create chain object +// dap_chain_t * l_chain = dap_chain_load_from_cfg(l_net->pub.ledger, l_net->pub.name, +// l_net->pub.id, l_chains_path); +// if(l_chain) { +// DL_APPEND(l_net->pub.chains, l_chain); +// if(l_chain->callback_created) +// l_chain->callback_created(l_chain, l_cfg); +// } +// DAP_DELETE (l_chains_path); } } DAP_DELETE (l_entry_name); } closedir(l_chains_dir); + + // sort list with chains names by priority + l_prior_list = dap_list_sort(l_prior_list, callback_compare_prioritity_list); + // load chains by priority + dap_list_t *l_list = l_prior_list; + while(l_list){ + list_priority *l_chain_prior = l_list->data; + // Create chain object + dap_chain_t * l_chain = dap_chain_load_from_cfg(l_net->pub.ledger, l_net->pub.name, + l_net->pub.id, l_chain_prior->chains_path); + if(l_chain) { + DL_APPEND(l_net->pub.chains, l_chain); + if(l_chain->callback_created) + l_chain->callback_created(l_chain, l_cfg); + } + DAP_DELETE (l_chain_prior->chains_path); + l_list = dap_list_next(l_list); + } + dap_list_free(l_prior_list); + } else { log_it(L_ERROR,"Can't any chains for network %s",l_net->pub.name); PVT(l_net)->load_mode = false;