diff --git a/dap-sdk b/dap-sdk index d4c78e770b397d62f7ac696d0db3a42439a77ae1..6239e7e3fe508cc8da00fae5ddbf09a0dff3e05e 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit d4c78e770b397d62f7ac696d0db3a42439a77ae1 +Subproject commit 6239e7e3fe508cc8da00fae5ddbf09a0dff3e05e diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index a2f1d10a51483a632bf140d641aaeca93851a354..db4138e4a7c9e4286b244e64f5a56e0fda1f9c15 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -216,13 +216,15 @@ dap_chain_cell_t * dap_chain_cell_create_fill(dap_chain_t * a_chain, dap_chain_c pthread_rwlock_unlock(&a_chain->cell_rwlock); return l_cell; } -#define CLEANUP_AND_RET return ({ fclose(l_file); DAP_DELETE(l_cell); pthread_rwlock_unlock(&a_chain->cell_rwlock); NULL; }) char file_storage_path[MAX_PATH]; snprintf(file_storage_path, MAX_PATH, "%s/%0"DAP_UINT64_FORMAT_x".dchaincell", DAP_CHAIN_PVT(a_chain)->file_storage_dir, a_cell_id.uint64); - - FILE *l_file = fopen(file_storage_path, "a+b"); - if ( !l_file ) { + FILE *l_file = NULL; +#define CLEANUP_AND_RET return ({ if (l_file) fclose(l_file); \ + DAP_DELETE(l_cell); \ + pthread_rwlock_unlock(&a_chain->cell_rwlock); \ + NULL; }) + if ( !(l_file = fopen(file_storage_path, "a+b")) ) { log_it(L_ERROR, "Chain cell \"%s\" 0x%016"DAP_UINT64_FORMAT_X" cannot be opened, error %d", file_storage_path, a_cell_id.uint64, errno); CLEANUP_AND_RET; diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index d8cf287635e09d3650be3ca81fdad18b7b19f911..1ce9248337722e35cdd0c6f1e1961a7a32cb4cb0 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -317,12 +317,9 @@ int dap_chain_net_init() s_net_init(l_dir_entry->d_name, l_acl_idx++); } closedir(l_net_dir); - }else{ - int l_errno = errno; - char l_errbuf[128]; - l_errbuf[0] = 0; - strerror_r(l_errno,l_errbuf,sizeof (l_errbuf)); - log_it(L_WARNING,"Can't open entries on path %s: \"%s\" (code %d)", l_net_dir_str, l_errbuf, l_errno); + } else { + log_it(L_WARNING, "Can't open entries on path %s, error %d: \"%s\"", + l_net_dir_str, errno, dap_strerror(errno)); } DAP_DELETE (l_net_dir_str); @@ -1932,28 +1929,38 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) return -16; } } - uint16_t l_permalink_hosts_count = 0; + uint16_t l_permalink_hosts_count = 0, i, e; char **l_permanent_links_hosts = dap_config_get_array_str(l_cfg, "general", "permanent_nodes_hosts", &l_permalink_hosts_count); - for (uint16_t i = 0; i < dap_min(l_permalink_hosts_count, l_net_pvt->permanent_links_count); ++i) { - uint16_t l_port = 0; - char l_host[DAP_HOSTADDR_STRLEN + 1] = { '\0' }; - if (dap_net_parse_hostname(l_permanent_links_hosts[i], l_host, &l_port) || !l_port) { - log_it(L_ERROR, "Incorrect format of host \"%s\", fix net config or recheck internet connection, and restart node", - l_permanent_links_hosts[i]); - dap_chain_net_delete(l_net); - dap_config_close(l_cfg); - return -16; + for (i = 0, e = 0; i < dap_min(l_permalink_hosts_count, l_net_pvt->permanent_links_count); ++i) { + char l_host[DAP_HOSTADDR_STRLEN + 1] = { '\0' }; uint16_t l_port = 0; + struct sockaddr_storage l_saddr; + if ( dap_net_parse_config_address(l_permanent_links_hosts[i], l_host, &l_port, NULL, NULL) < 0 + || dap_net_resolve_host(l_host, dap_itoa(l_port), false, &l_saddr, NULL) < 0 ) + { + log_it(L_ERROR, "Incorrect address \"%s\", fix \"%s\" network config" + "or check internet connection and restart node", + a_net_name, l_permanent_links_hosts[i]); + ++e; + continue; } l_net_pvt->permanent_links[i]->uplink_port = l_port; dap_strncpy(l_net_pvt->permanent_links[i]->uplink_addr, l_host, DAP_HOSTADDR_STRLEN); } + if ( i && (e == i) ) { + log_it(L_ERROR, "%d / %d permanent links are invalid or can't be accessed, fix \"%s\"" + "network config or check internet connection and restart node", + e, i, a_net_name); + dap_chain_net_delete(l_net); + dap_config_close(l_cfg); + return -16; + } char **l_authorized_nodes_addrs = dap_config_get_array_str(l_cfg, "general", "authorized_nodes_addrs", &l_net_pvt->authorized_nodes_count); if (!l_net_pvt->authorized_nodes_count) log_it(L_WARNING, "Can't read PoA nodes addresses"); else l_net_pvt->authorized_nodes_addrs = DAP_NEW_Z_COUNT(dap_chain_node_addr_t, l_net_pvt->authorized_nodes_count); - for (uint16_t i = 0; i < l_net_pvt->authorized_nodes_count; ++i) { + for (i = 0; i < l_net_pvt->authorized_nodes_count; ++i) { dap_chain_node_addr_t l_addr; if (dap_stream_node_addr_from_str(&l_addr, l_authorized_nodes_addrs[i])) { log_it(L_ERROR, "Incorrect format of node address \"%s\", fix net config and restart node", l_authorized_nodes_addrs[i]); @@ -1974,15 +1981,17 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) dap_config_close(l_cfg); return -4; } - for (uint16_t i = 0; i < l_net_pvt->seed_nodes_count; ++i) { - uint16_t l_port = 0; - char l_host[DAP_HOSTADDR_STRLEN + 1] = { '\0' }; - if (dap_net_parse_hostname(l_seed_nodes_hosts[i], l_host, &l_port) || !l_port) { - log_it(L_ERROR, "Incorrect format of host \"%s\", fix net config or recheck internet connection, and restart node", - l_seed_nodes_hosts[i]); - dap_chain_net_delete(l_net); - dap_config_close(l_cfg); - return -16; + for (i = 0, e = 0; i < l_net_pvt->seed_nodes_count; ++i) { + char l_host[DAP_HOSTADDR_STRLEN + 1] = { '\0' }; uint16_t l_port = 0; + struct sockaddr_storage l_saddr; + if ( dap_net_parse_config_address(l_seed_nodes_hosts[i], l_host, &l_port, NULL, NULL) < 0 + || dap_net_resolve_host(l_host, dap_itoa(l_port), false, &l_saddr, NULL) < 0) + { + log_it(L_ERROR, "Incorrect address \"%s\", fix \"%s\" network config" + "or check internet connection and restart node", + a_net_name, l_seed_nodes_hosts[i]); + ++e; + continue; } l_net_pvt->seed_nodes_info[i] = DAP_NEW_Z(struct request_link_info); if (!l_net_pvt->seed_nodes_info[i]) { @@ -1994,6 +2003,14 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) l_net_pvt->seed_nodes_info[i]->port = l_port; dap_strncpy(l_net_pvt->seed_nodes_info[i]->addr, l_host, DAP_HOSTADDR_STRLEN); } + if ( i && (e == i) ) { + log_it(L_ERROR, "%d / %d seed links are invalid or can't be accessed, fix \"%s\"" + "network config or check internet connection and restart node", + e, i, a_net_name); + dap_chain_net_delete(l_net); + dap_config_close(l_cfg); + return -16; + } /* *** Chains init by configs *** */ char * l_chains_path = dap_strdup_printf("%s/network/%s", dap_config_path(), l_net->pub.name); @@ -2308,7 +2325,8 @@ bool s_net_load(void *a_arg) if (!l_ext_addr) { log_it(L_INFO, "External address is not set, will be detected automatically"); } else { - if ( dap_net_parse_hostname(l_ext_addr, l_host, &l_ext_port) ) + struct sockaddr_storage l_saddr = { }; + if ( 0 > dap_net_parse_config_address(l_ext_addr, l_host, &l_ext_port, &l_saddr, NULL) ) log_it(L_ERROR, "Invalid server address \"%s\", fix config and restart node", l_ext_addr); else { uint8_t l_hostlen = dap_strlen(l_host); @@ -2317,9 +2335,11 @@ bool s_net_load(void *a_arg) } } if ( !l_net_pvt->node_info->ext_port ) { - char **l_listening = dap_config_get_array_str(g_config, "server", "listen_address", NULL); - l_net_pvt->node_info->ext_port = l_listening && !dap_net_parse_hostname(*l_listening, NULL, &l_ext_port) && l_ext_port - ? l_ext_port : 8079; // TODO: default port? + char **l_listening = dap_config_get_array_str(g_config, "server", DAP_CFG_PARAM_LISTEN_ADDRS, NULL); + l_net_pvt->node_info->ext_port = + ( l_listening && dap_net_parse_config_address(*l_listening, NULL, &l_ext_port, NULL, NULL) > 0 && l_ext_port ) + ? l_ext_port + : dap_config_get_item_int16_default(g_config, "server", DAP_CFG_PARAM_LEGACY_PORT, 8079); // TODO: default port? } } // otherwise, we're in seed list - seed config predominates server config thus disambiguating the settings diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index 8098561f30992d687f1df2788ccaadae6275eb26..eee2e5e2a920b000e05260910540251213a87370 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -58,25 +58,11 @@ static bool s_debug_cli = false; */ int dap_chain_node_cli_init(dap_config_t * g_config) { - s_debug_cli = dap_config_get_item_bool_default(g_config,"conserver","debug_cli",false); - - bool l_conserver_enabled = dap_config_get_item_bool_default( g_config, "conserver", "enabled", true ); - - if ( !l_conserver_enabled ) { - - log_it( L_WARNING, "Console Server is dissabled." ); - return 0; - } - - uint16_t l_listen_port = dap_config_get_item_uint16_default( g_config, "conserver", "listen_port_tcp",0); // For backward compatibility - if(l_listen_port == 0) - l_listen_port = dap_config_get_item_uint16_default( g_config, "conserver", "listen_port",0); - - dap_cli_server_init( s_debug_cli, - l_listen_port ? dap_config_get_item_str(g_config, "conserver", "listen_address") - : dap_config_get_item_str( g_config, "conserver", "listen_unix_socket_path"), - l_listen_port, dap_config_get_item_str( g_config, "conserver", "listen_unix_socket_permissions") - ); + if ( !dap_config_get_item_bool_default(g_config, "cli-server", "enabled", true) ) + return log_it( L_WARNING, "CLI server is disabled" ), 0; + s_debug_cli = dap_config_get_item_bool_default(g_config, "cli-server", "debug-cli", false); + if ( dap_cli_server_init(s_debug_cli, "cli-server") ) + return log_it(L_ERROR, "Can't init CLI server!"), -1; dap_cli_server_cmd_add("global_db", com_global_db, "Work with global database", "global_db cells add -cell <cell_id> \n" diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index e88688ca77071f3a9554b459b7d9ebfcebb77a32..2d721f9f6cd99593fac05f75bfe9da5eb220b774 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -922,7 +922,8 @@ int com_node(int a_argc, char ** a_argv, void **a_str_reply) if (l_addr_str && dap_chain_net_is_my_node_authorized(l_net)) { // We're in authorized list, add directly uint16_t l_port = 0; - if (dap_net_parse_hostname(l_hostname, l_node_info->ext_host, &l_port)) { + struct sockaddr_storage l_verifier = { }; + if ( 0 > dap_net_parse_config_address(l_hostname, l_node_info->ext_host, &l_port, &l_verifier, NULL) ) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't parse host string %s", l_hostname); return -6; } diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index 41e93f4a1e2c5dcf7d22f075dc27778153eb8322..548e6fd9850255fdcb6f6c598460c28089d84788 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -415,10 +415,7 @@ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_s ret = -1; break; }else if (l_ret_wait != 0 ){ - char l_errbuf[128]; - l_errbuf[0] = '\0'; - strerror_r(l_ret_wait,l_errbuf,sizeof (l_errbuf)); - log_it(L_ERROR, "Pthread condition timed wait returned \"%s\"(code %d)", l_errbuf, l_ret_wait); + log_it(L_CRITICAL, "pthread_cond_timedwait() error %d:\"%s\"", l_ret_wait, dap_strerror(l_ret_wait)); } } pthread_mutex_unlock(&a_client->wait_mutex); diff --git a/modules/net/dap_chain_node_dns_server.c b/modules/net/dap_chain_node_dns_server.c index f633750b5564c9088197d932a794e2d9b9210115..3a14319538f31be19b0d7eea411959d994184b9e 100644 --- a/modules/net/dap_chain_node_dns_server.c +++ b/modules/net/dap_chain_node_dns_server.c @@ -256,15 +256,14 @@ cleanup: return; } -void dap_dns_server_start(char *a_port) +void dap_dns_server_start(const char *a_cfg_section) { -// memory alloc DAP_NEW_Z_RET(s_dns_server, dap_dns_server_t, NULL); - dap_events_socket_callbacks_t l_cb = {}; - l_cb.read_callback = dap_dns_client_read; - s_dns_server->instance = dap_server_new(&a_port, 1, DAP_SERVER_UDP, &l_cb); + dap_events_socket_callbacks_t l_cb = { .read_callback = dap_dns_client_read }; + s_dns_server->instance = dap_server_new(a_cfg_section, NULL, &l_cb); if (!s_dns_server->instance) { log_it(L_ERROR, "Can't start DNS server"); + DAP_DELETE(s_dns_server); return; } dap_dns_zone_register(&s_root_alias[0], dap_chain_net_balancer_dns_issue_link); // root resolver diff --git a/modules/net/include/dap_chain_node_dns_server.h b/modules/net/include/dap_chain_node_dns_server.h index 4b8d02b3e596b8823dfea50022844e9f7355778f..aa22b05bd3ec02ae7e1469d9780321d9b923f9bf 100644 --- a/modules/net/include/dap_chain_node_dns_server.h +++ b/modules/net/include/dap_chain_node_dns_server.h @@ -117,7 +117,7 @@ typedef struct _dap_dns_server_t { -void dap_dns_server_start(char *a_port); +void dap_dns_server_start(const char* a_cfg_section); void dap_dns_server_stop(); int dap_dns_zone_register(char *zone, dap_dns_zone_callback_t callback); int dap_dns_zone_unregister(char *zone); diff --git a/modules/service/datum/dap_chain_net_srv_datum.c b/modules/service/datum/dap_chain_net_srv_datum.c index edc7d16a3ad40cd7dd9c2a73864f270585d97720..25e4862174418d897f28102f5242d24cb79eed64 100644 --- a/modules/service/datum/dap_chain_net_srv_datum.c +++ b/modules/service/datum/dap_chain_net_srv_datum.c @@ -161,7 +161,8 @@ static int s_srv_datum_cli(int argc, char ** argv, void **a_str_reply) return -4; } }else{ - log_it(L_ERROR, "Can't open file '%s' for write: %s", l_path, strerror(errno)); + log_it(L_ERROR, "Can't open file '%s' for write, error %d: \"%s\"", + l_path, errno, dap_strerror(errno)); return -2; } } diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c index 7ddd013c18eb65d72d8e0b733aac46804a30d525..be273aff004cde2f5ccbbdde96354eaf390cdd1a 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn.c @@ -701,10 +701,8 @@ static int s_vpn_tun_create(dap_config_t * g_config) // Create utun socket int l_tun_fd = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL); if( l_tun_fd < 0){ - int l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Opening utun device control (SYSPROTO_CONTROL) error: '%s' (code %d)", l_errbuf, l_errno); + log_it(L_ERROR, "Opening utun device control (SYSPROTO_CONTROL) error %d: \"%s\"", + errno, dap_strerror(errno)); l_err = -101; goto lb_err; } @@ -713,10 +711,8 @@ static int s_vpn_tun_create(dap_config_t * g_config) // Pass control structure to the utun socket if( ioctl(l_tun_fd, CTLIOCGINFO, &l_ctl_info ) < 0 ){ - int l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Can't execute ioctl(CTLIOCGINFO): '%s' (code %d)", l_errbuf, l_errno); + log_it(L_ERROR, "Can't execute ioctl(CTLIOCGINFO), error %d: \"%s\"", + errno, dap_strerror(errno)); l_err = -102; goto lb_err; @@ -739,10 +735,8 @@ static int s_vpn_tun_create(dap_config_t * g_config) break; } if (l_ret < 0){ - int l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Can't create utun device: '%s' (code %d)", l_errbuf, l_errno); + log_it(L_ERROR, "Can't create utun device, error %d: \"%s\"", + errno, dap_strerror(errno)); l_err = -103; goto lb_err; @@ -753,10 +747,8 @@ static int s_vpn_tun_create(dap_config_t * g_config) char l_utunname[20]; socklen_t l_utunname_len = sizeof(l_utunname); if (getsockopt(l_tun_fd, SYSPROTO_CONTROL, UTUN_OPT_IFNAME, l_utunname, &l_utunname_len) ){ - int l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Can't get utun device name: '%s' (code %d)", l_errbuf, l_errno); + log_it(L_ERROR, "Can't get utun device name, error %d: \"%s\"", + errno, dap_strerror(errno)); l_err = -104; goto lb_err; } @@ -771,13 +763,14 @@ static int s_vpn_tun_create(dap_config_t * g_config) #if !defined(DAP_OS_DARWIN) &&( defined (DAP_OS_LINUX) || defined (DAP_OS_BSD)) int l_tun_fd; if( (l_tun_fd = open("/dev/net/tun", O_RDWR | O_NONBLOCK)) < 0 ) { - log_it(L_ERROR,"Opening /dev/net/tun error: '%s'", strerror(errno)); + log_it(L_ERROR, "Opening /dev/net/tun error %d: \"%s\"", + errno, dap_strerror(errno)); l_err = -100; break; } log_it(L_DEBUG,"Opening /dev/net/tun:%u", i); if( (l_err = ioctl(l_tun_fd, TUNSETIFF, (void *)& s_raw_server->ifr)) < 0 ) { - log_it(L_CRITICAL, "ioctl(TUNSETIFF) error: '%s' ",strerror(errno)); + log_it(L_CRITICAL, "ioctl(TUNSETIFF) error %d: \"%s\"", errno, dap_strerror(errno)); close(l_tun_fd); break; } @@ -1916,12 +1909,11 @@ static bool s_es_tun_write(dap_events_socket_t *a_es, void *arg) l_tun->es->buf_out_size -= l_pkt_size; l_shift += l_pkt_size; break; - default: { - char l_errbuf[128]; - strerror_r(l_errno, l_errbuf, sizeof(l_errbuf)); - log_it(L_ERROR, "Error on writing to tun: \"%s\" code %d", l_errbuf, errno); + default: + log_it(L_ERROR, "Write to tun error %d: \"%s\"", + errno, dap_strerror(errno)); break; - }} + } break; // Finish the buffer processing immediately } } 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 1dfb14c397b8557c7d598b23f86667eeca7f8aa0..f5de32b36fd1feed2f823239d4ade8858b8b51a0 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client_tun.c +++ b/modules/service/vpn/dap_chain_net_vpn_client_tun.c @@ -147,20 +147,14 @@ int tun_device_create(char *dev) // Create utun socket int l_tun_fd = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL); if( l_tun_fd < 0){ - l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Opening utun device control (SYSPROTO_CONTROL) error: '%s' (code %d)", l_errbuf, l_errno); + log_it(L_ERROR,"Opening utun device control (SYSPROTO_CONTROL) error %d: \"%s\"", errno, dap_strerror(errno)); goto lb_err; } log_it(L_INFO, "Utun SYSPROTO_CONTROL descriptor obtained"); // Pass control structure to the utun socket if( ioctl(l_tun_fd, CTLIOCGINFO, &l_ctl_info ) < 0 ){ - l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Can't execute ioctl(CTLIOCGINFO): '%s' (code %d)", l_errbuf, l_errno); + log_it(L_ERROR,"Can't execute ioctl(CTLIOCGINFO) %d: \"%s\"", errno, dap_strerror(errno)); goto lb_err; } @@ -181,11 +175,8 @@ int tun_device_create(char *dev) if(l_ret == 0) break; } - if (l_ret < 0){ - l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Can't create utun device: '%s' (code %d)", l_errbuf, l_errno); + if (l_ret < 0) { + log_it(L_ERROR,"Can't create utun device %d: \"%s\"", errno, dap_strerror(errno)); goto lb_err; } @@ -194,11 +185,8 @@ int tun_device_create(char *dev) log_it(L_NOTICE, "Utun device created"); char l_utunname[20]; socklen_t l_utunname_len = sizeof(l_utunname); - if (getsockopt(l_tun_fd, SYSPROTO_CONTROL, UTUN_OPT_IFNAME, l_utunname, &l_utunname_len) ){ - l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Can't get utun device name: '%s' (code %d)", l_errbuf, l_errno); + if (getsockopt(l_tun_fd, SYSPROTO_CONTROL, UTUN_OPT_IFNAME, l_utunname, &l_utunname_len) ) { + log_it(L_ERROR,"Can't get utun device name %d: \"%s\"", errno, dap_strerror(errno)); goto lb_err; } log_it(L_NOTICE, "Utun device name \"%s\"", l_utunname); @@ -679,7 +667,7 @@ void ch_sf_tun_client_send(dap_chain_net_srv_ch_vpn_t * ch_sf, void * pkt_data, if((ret = /*sendto(ch_sf->raw_l3_sock, pkt_data, pkt_data_size, 0, (struct sockaddr *) &sin, sizeof(sin))*/-1 ) < 0) { // if((ret = write(raw_server->tun_fd, sf_pkt->data, sf_pkt->header.op_data.data_size))<0){ - log_it(L_ERROR, "write() returned error %d : '%s'", ret, strerror(errno)); + log_it(L_ERROR, "write() error %d : \"%s\"", errno, dap_strerror(errno)); //log_it(ERROR,"raw socket ring buffer overflowed"); ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header)); if (!pkt_out) {