static void * livesync_worker( void * args ) { struct ot_workstruct ws; ot_ip6 in_ip; uint16_t in_port; (void)args; /* Initialize our "thread local storage" */ ws.inbuf = ws.request = malloc( LIVESYNC_INCOMING_BUFFSIZE ); ws.outbuf = ws.reply = 0; memcpy( in_ip, V4mappedprefix, sizeof( V4mappedprefix ) ); while( 1 ) { ws.request_size = socket_recv4(g_socket_in, (char*)ws.inbuf, LIVESYNC_INCOMING_BUFFSIZE, 12+(char*)in_ip, &in_port); /* Expect at least tracker id and packet type */ if( ws.request_size <= (ssize_t)(sizeof( g_tracker_id ) + sizeof( uint32_t )) ) continue; if( !accesslist_isblessed(in_ip, OT_PERMISSION_MAY_LIVESYNC)) continue; if( !memcmp( ws.inbuf, &g_tracker_id, sizeof( g_tracker_id ) ) ) { /* TODO: log packet coming from ourselves */ continue; } switch( uint32_read_big( sizeof( g_tracker_id ) + (char *)ws.inbuf ) ) { case OT_SYNC_PEER: livesync_handle_peersync( &ws ); break; default: break; } } /* Never returns. */ return NULL; }
uint64 uint64_read_big(const char *in) { return ((uint64)uint32_read_big(in)<<32) | uint32_read_big(in+4); }