@ -312,21 +312,34 @@ void chat_core_update_my_name(const char* name) {
void chat_core_sync_my_addresses ( void ) {
void chat_core_sync_my_addresses ( void ) {
if ( ! g_cc . initialized | | ! g_cc . db | | ! g_cc . inst ) return ;
if ( ! g_cc . initialized | | ! g_cc . db | | ! g_cc . inst ) return ;
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] sync_my_addresses START my_node=0x%016llx " , CC_ID , ( unsigned long long ) g_cc . my_node_id ) ;
sqlite3_stmt * del = NULL ;
sqlite3_stmt * del = NULL ;
sqlite3_prepare_v2 ( g_cc . db , " DELETE FROM node_addresses WHERE node_id=? AND addr_type=0 " , - 1 , & del , NULL ) ;
sqlite3_prepare_v2 ( g_cc . db , " DELETE FROM node_addresses WHERE node_id=? AND addr_type=0 " , - 1 , & del , NULL ) ;
if ( del ) { sqlite3_bind_int64 ( del , 1 , ( sqlite3_int64 ) g_cc . my_node_id ) ; sqlite3_step ( del ) ; sqlite3_finalize ( del ) ; }
if ( del ) {
sqlite3_bind_int64 ( del , 1 , ( sqlite3_int64 ) g_cc . my_node_id ) ;
sqlite3_step ( del ) ;
int deleted = sqlite3_changes ( g_cc . db ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] DELETE addr_type=0 for my_node=0x%016llx: %d rows deleted " , CC_ID , ( unsigned long long ) g_cc . my_node_id , deleted ) ;
sqlite3_finalize ( del ) ;
}
sqlite3_stmt * ins = NULL ;
sqlite3_stmt * ins = NULL ;
sqlite3_prepare_v2 ( g_cc . db ,
sqlite3_prepare_v2 ( g_cc . db ,
" INSERT OR REPLACE INTO node_addresses(node_id,family,protocol,address,port,addr_type,socket_id) "
" INSERT OR REPLACE INTO node_addresses(node_id,family,protocol,address,port,addr_type,socket_id) "
" VALUES(?,?,1,?,?,0,?) " , - 1 , & ins , NULL ) ;
" VALUES(?,?,1,?,?,0,?) " , - 1 , & ins , NULL ) ;
if ( ! ins ) return ;
if ( ! ins ) {
DEBUG_WARN ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] FAIL prepare INSERT stmt my_node=0x%016llx " , CC_ID , ( unsigned long long ) g_cc . my_node_id ) ;
return ;
}
struct ETCP_SOCKET * sock = g_cc . inst - > etcp_sockets ;
struct ETCP_SOCKET * sock = g_cc . inst - > etcp_sockets ;
int sock_count = 0 , written = 0 ;
while ( sock ) {
while ( sock ) {
sock_count + + ;
struct sockaddr_storage * sa = sock - > interface_addr . ss_family ? & sock - > interface_addr : NULL ;
struct sockaddr_storage * sa = sock - > interface_addr . ss_family ? & sock - > interface_addr : NULL ;
if ( ! sa ) sa = sock - > local_addr . ss_family ? & sock - > local_addr : NULL ;
if ( ! sa ) sa = sock - > local_addr . ss_family ? & sock - > local_addr : NULL ;
if ( ! sa ) { sock = sock - > next ; continue ; }
if ( ! sa ) { DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] socket %d — no interface/local addr " , CC_ID , sock_count ) ; sock = sock - > next ; continue ; }
if ( sa - > ss_family = = AF_INET ) {
if ( sa - > ss_family = = AF_INET ) {
struct sockaddr_in * sin = ( struct sockaddr_in * ) sa ;
struct sockaddr_in * sin = ( struct sockaddr_in * ) sa ;
@ -336,6 +349,10 @@ void chat_core_sync_my_addresses(void) {
sqlite3_bind_int ( ins , 4 , ( int ) ntohs ( sin - > sin_port ) ) ;
sqlite3_bind_int ( ins , 4 , ( int ) ntohs ( sin - > sin_port ) ) ;
sqlite3_bind_int ( ins , 5 , ( int ) sock - > sock_id ) ;
sqlite3_bind_int ( ins , 5 , ( int ) sock - > sock_id ) ;
sqlite3_step ( ins ) ; sqlite3_reset ( ins ) ;
sqlite3_step ( ins ) ; sqlite3_reset ( ins ) ;
uint8_t * ip = ( uint8_t * ) & sin - > sin_addr ;
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] INSERT my_node=0x%016llx sock=%d %d.%d.%d.%d:%d " ,
CC_ID , ( unsigned long long ) g_cc . my_node_id , sock - > sock_id , ip [ 0 ] , ip [ 1 ] , ip [ 2 ] , ip [ 3 ] , ( int ) ntohs ( sin - > sin_port ) ) ;
written + + ;
} else if ( sa - > ss_family = = AF_INET6 ) {
} else if ( sa - > ss_family = = AF_INET6 ) {
struct sockaddr_in6 * sin6 = ( struct sockaddr_in6 * ) sa ;
struct sockaddr_in6 * sin6 = ( struct sockaddr_in6 * ) sa ;
sqlite3_bind_int64 ( ins , 1 , ( sqlite3_int64 ) g_cc . my_node_id ) ;
sqlite3_bind_int64 ( ins , 1 , ( sqlite3_int64 ) g_cc . my_node_id ) ;
@ -344,10 +361,32 @@ void chat_core_sync_my_addresses(void) {
sqlite3_bind_int ( ins , 4 , ( int ) ntohs ( sin6 - > sin6_port ) ) ;
sqlite3_bind_int ( ins , 4 , ( int ) ntohs ( sin6 - > sin6_port ) ) ;
sqlite3_bind_int ( ins , 5 , ( int ) sock - > sock_id ) ;
sqlite3_bind_int ( ins , 5 , ( int ) sock - > sock_id ) ;
sqlite3_step ( ins ) ; sqlite3_reset ( ins ) ;
sqlite3_step ( ins ) ; sqlite3_reset ( ins ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] INSERT v6 my_node=0x%016llx sock=%d port=%d " ,
CC_ID , ( unsigned long long ) g_cc . my_node_id , sock - > sock_id , ( int ) ntohs ( sin6 - > sin6_port ) ) ;
written + + ;
}
}
sock = sock - > next ;
sock = sock - > next ;
}
}
sqlite3_finalize ( ins ) ;
sqlite3_finalize ( ins ) ;
if ( sock_count = = 0 )
DEBUG_WARN ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] etcp_sockets is NULL — NO sockets, addresses NOT written! " , CC_ID ) ;
else if ( written = = 0 )
DEBUG_WARN ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] %d sockets found but 0 addresses written (all have no interface_addr nor local_addr) " , CC_ID , sock_count ) ;
else
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] DONE: %d of %d sockets written, my_node=0x%016llx " ,
CC_ID , written , sock_count , ( unsigned long long ) g_cc . my_node_id ) ;
/* verify */
sqlite3_stmt * chk = NULL ;
sqlite3_prepare_v2 ( g_cc . db , " SELECT COUNT(*) FROM node_addresses WHERE node_id=? AND addr_type=0 " , - 1 , & chk , NULL ) ;
if ( chk ) {
sqlite3_bind_int64 ( chk , 1 , ( sqlite3_int64 ) g_cc . my_node_id ) ;
int cnt = sqlite3_step ( chk ) = = SQLITE_ROW ? sqlite3_column_int ( chk , 0 ) : - 1 ;
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] VERIFY: total addr_type=0 rows for my_node=0x%016llx = %d " ,
CC_ID , ( unsigned long long ) g_cc . my_node_id , cnt ) ;
sqlite3_finalize ( chk ) ;
}
}
}
void chat_core_update_my_name_trampoline ( void * arg ) {
void chat_core_update_my_name_trampoline ( void * arg ) {
@ -605,17 +644,22 @@ void chat_core_connect_from_invite(struct chat_invite* inv) {
/* save addresses to node_addresses */
/* save addresses to node_addresses */
{
{
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] save_invite_addr node=0x%016llx addr_count=%d " , CC_ID , ( unsigned long long ) node_id , inv - > addr_count ) ;
sqlite3_stmt * ds = NULL ;
sqlite3_stmt * ds = NULL ;
if ( sqlite3_prepare_v2 ( g_cc . db ,
if ( sqlite3_prepare_v2 ( g_cc . db ,
" DELETE FROM node_addresses WHERE node_id=? " , - 1 , & ds , NULL ) = = SQLITE_OK ) {
" DELETE FROM node_addresses WHERE node_id=? " , - 1 , & ds , NULL ) = = SQLITE_OK ) {
sqlite3_bind_int64 ( ds , 1 , ( sqlite3_int64 ) node_id ) ;
sqlite3_bind_int64 ( ds , 1 , ( sqlite3_int64 ) node_id ) ;
sqlite3_step ( ds ) ; sqlite3_finalize ( ds ) ;
sqlite3_step ( ds ) ;
int deleted = sqlite3_changes ( g_cc . db ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] invite DELETE ALL for node=0x%016llx: %d rows deleted " , CC_ID , ( unsigned long long ) node_id , deleted ) ;
sqlite3_finalize ( ds ) ;
}
}
sqlite3_stmt * is = NULL ;
sqlite3_stmt * is = NULL ;
if ( sqlite3_prepare_v2 ( g_cc . db ,
if ( sqlite3_prepare_v2 ( g_cc . db ,
" INSERT INTO node_addresses(node_id,family,protocol,address,port,addr_type,socket_id) "
" INSERT INTO node_addresses(node_id,family,protocol,address,port,addr_type,socket_id) "
" VALUES(?,?,1,?,?,0,?) " , - 1 , & is , NULL ) = = SQLITE_OK ) {
" VALUES(?,?,1,?,?,0,?) " , - 1 , & is , NULL ) = = SQLITE_OK ) {
const uint8_t * src = inv - > addrs_data ;
const uint8_t * src = inv - > addrs_data ;
int written = 0 ;
for ( int i = 0 ; i < inv - > addr_count ; i + + ) {
for ( int i = 0 ; i < inv - > addr_count ; i + + ) {
uint8_t family = * src + + ;
uint8_t family = * src + + ;
uint8_t sid = * src + + ;
uint8_t sid = * src + + ;
@ -627,11 +671,19 @@ void chat_core_connect_from_invite(struct chat_invite* inv) {
sqlite3_bind_int ( is , 4 , ( int ) port ) ;
sqlite3_bind_int ( is , 4 , ( int ) port ) ;
sqlite3_bind_int ( is , 5 , ( int ) sid ) ;
sqlite3_bind_int ( is , 5 , ( int ) sid ) ;
sqlite3_step ( is ) ; sqlite3_reset ( is ) ;
sqlite3_step ( is ) ; sqlite3_reset ( is ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] invite INSERT node=0x%016llx sock=%d %d.%d.%d.%d:%d " ,
CC_ID , ( unsigned long long ) node_id , sid , src [ - 6 ] , src [ - 5 ] , src [ - 4 ] , src [ - 3 ] , port ) ;
written + + ;
} else {
} else {
src + = 18 ;
src + = 18 ;
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] invite SKIP v6 addr for node=0x%016llx " , CC_ID , ( unsigned long long ) node_id ) ;
}
}
}
}
sqlite3_finalize ( is ) ;
sqlite3_finalize ( is ) ;
DEBUG_INFO ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] invite DONE: %d v4 addresses written for node=0x%016llx " ,
CC_ID , written , ( unsigned long long ) node_id ) ;
} else {
DEBUG_WARN ( DEBUG_CATEGORY_DEBUG , " %s: [ADDR_SYNC] invite FAIL prepare INSERT node=0x%016llx " , CC_ID , ( unsigned long long ) node_id ) ;
}
}
}
}