@ -200,11 +200,13 @@ int chat_core_init(struct UTUN_INSTANCE* inst, const char* db_path) {
sqlite3_stmt * stmt = NULL ;
if ( sqlite3_prepare_v2 ( g_cc . db , " SELECT channel_id FROM channels ORDER BY created_at ASC " ,
- 1 , & stmt , NULL ) = = SQLITE_OK ) {
int loaded = 0 ;
while ( sqlite3_step ( stmt ) = = SQLITE_ROW ) {
const char * ch = ( const char * ) sqlite3_column_text ( stmt , 0 ) ;
if ( ch & & ch [ 0 ] ) chat_core_ensure_channel_ready ( ch ) ;
if ( ch & & ch [ 0 ] ) { chat_core_ensure_channel_ready ( ch ) ; loaded + + ; }
}
sqlite3_finalize ( stmt ) ;
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: loaded %d channels from DB " , CC_ID , loaded ) ;
}
}
@ -322,12 +324,6 @@ void chat_core_sync_my_addresses(void) {
if ( sa - > ss_family = = AF_INET ) {
struct sockaddr_in * sin = ( struct sockaddr_in * ) sa ;
uint8_t b0 = ( uint8_t ) ( ntohl ( sin - > sin_addr . s_addr ) > > 24 ) ;
if ( b0 = = 10 | | b0 = = 127 | |
( b0 = = 172 & & ( ( ntohl ( sin - > sin_addr . s_addr ) > > 20 ) & 0xF0 ) = = 16 ) | |
( b0 = = 192 & & ( uint8_t ) ( ntohl ( sin - > sin_addr . s_addr ) > > 16 ) = = 168 ) | |
( b0 = = 169 & & ( uint8_t ) ( ntohl ( sin - > sin_addr . s_addr ) > > 16 ) = = 254 ) )
{ sock = sock - > next ; continue ; }
sqlite3_bind_int64 ( ins , 1 , ( sqlite3_int64 ) g_cc . my_node_id ) ;
sqlite3_bind_int ( ins , 2 , 4 ) ;
sqlite3_bind_blob ( ins , 3 , & sin - > sin_addr , 4 , SQLITE_STATIC ) ;
@ -335,8 +331,6 @@ void chat_core_sync_my_addresses(void) {
sqlite3_step ( ins ) ; sqlite3_reset ( ins ) ;
} else if ( sa - > ss_family = = AF_INET6 ) {
struct sockaddr_in6 * sin6 = ( struct sockaddr_in6 * ) sa ;
if ( sin6 - > sin6_addr . s6_addr [ 0 ] = = 0xFE & & ( sin6 - > sin6_addr . s6_addr [ 1 ] & 0xC0 ) = = 0x80 )
{ sock = sock - > next ; continue ; }
sqlite3_bind_int64 ( ins , 1 , ( sqlite3_int64 ) g_cc . my_node_id ) ;
sqlite3_bind_int ( ins , 2 , 6 ) ;
sqlite3_bind_blob ( ins , 3 , & sin6 - > sin6_addr , 16 , SQLITE_STATIC ) ;
@ -982,9 +976,26 @@ void chat_core_create_channel(struct chat_channel_create* req) {
} else {
memset ( join_sig , 0 , 64 ) ;
}
uint8_t my_addrs [ 256 ] ; int my_addr_cnt = 0 ;
{ struct ETCP_SOCKET * s = g_cc . inst - > etcp_sockets ;
while ( s & & my_addr_cnt < 16 ) {
struct sockaddr_storage * sa = s - > interface_addr . ss_family ? & s - > interface_addr : NULL ;
if ( ! sa ) sa = s - > local_addr . ss_family ? & s - > local_addr : NULL ;
if ( sa & & sa - > ss_family = = AF_INET ) {
struct sockaddr_in * sin = ( struct sockaddr_in * ) sa ;
my_addrs [ my_addr_cnt * 7 ] = 4 ;
memcpy ( my_addrs + my_addr_cnt * 7 + 1 , & sin - > sin_addr , 4 ) ;
uint16_t port = ntohs ( sin - > sin_port ) ;
my_addrs [ my_addr_cnt * 7 + 5 ] = ( uint8_t ) ( port > > 8 ) ;
my_addrs [ my_addr_cnt * 7 + 6 ] = ( uint8_t ) ( port & 0xFF ) ;
my_addr_cnt + + ;
}
s = s - > next ;
}
}
int mrc = member_sync_put ( g_cc . inst , req - > channel_id , myid ,
g_cc . inst - > my_keys . public_key , g_cc . inst - > my_ed25519_pubkey ,
join_sig , join_ts , NULL , 0 , g_cc . inst - > name , NULL , 0 ) ;
join_sig , join_ts , NULL , 0 , g_cc . inst - > name , my_addrs , my_addr_cnt ) ;
if ( mrc ! = 0 ) {
DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: member_sync_put(self) FAILED ch=%s rc=%d " ,
CC_ID , req - > channel_id , mrc ) ;