/* This software was written by Dirk Engling It is considered beerware. Prost. Skol. Cheers or whatever. $id$ */ #ifndef __OT_TRACKERLOGIC_H__ #define __OT_TRACKERLOGIC_H__ #include #include #include #include /* Libowfat */ #include #include #define READ16(addr,offs) ((int16_t)uint16_read((offs)+(uint8_t*)(addr))) #define READ32(addr,offs) ((int32_t)uint32_read((offs)+(uint8_t*)(addr))) #define WRITE16(addr,offs,val) uint16_pack((offs)+(uint8_t*)(addr),(val)) #define WRITE32(addr,offs,val) uint32_pack((offs)+(uint8_t*)(addr),(val)) typedef uint8_t ot_hash[20]; typedef time_t ot_time; /* Some tracker behaviour tunable */ #define OT_CLIENT_TIMEOUT 30 #define OT_CLIENT_TIMEOUT_CHECKINTERVAL 10 #define OT_CLIENT_TIMEOUT_SEND (60*15) #define OT_CLIENT_REQUEST_INTERVAL (60*30) #define OT_CLIENT_REQUEST_VARIATION (60*6) #define OT_TORRENT_TIMEOUT_HOURS 24 #define OT_TORRENT_TIMEOUT (60*OT_TORRENT_TIMEOUT_HOURS) #define OT_CLIENT_REQUEST_INTERVAL_RANDOM ( OT_CLIENT_REQUEST_INTERVAL - OT_CLIENT_REQUEST_VARIATION/2 + (int)( random( ) % OT_CLIENT_REQUEST_VARIATION ) ) /* If peers come back before 10 minutes, don't live sync them */ #define OT_CLIENT_SYNC_RENEW_BOUNDARY 10 /* Number of tracker admin ip addresses allowed */ #define OT_ADMINIP_MAX 64 #define OT_MAX_THREADS 16 #define OT_PEER_TIMEOUT 45 /* We maintain a list of 1024 pointers to sorted list of ot_torrent structs Sort key is, of course, its hash */ #define OT_BUCKET_COUNT_BITS 10 #define OT_BUCKET_COUNT (1<peers.size > (peer_list)->peers.space)) /* Exported functions */ #ifdef WANT_SYNC_LIVE #define WANT_SYNC #endif #ifdef WANT_SYNC #define WANT_SYNC_PARAM( param ) , param #else #define WANT_SYNC_PARAM( param ) #endif int trackerlogic_init( const char * const serverdir ); void trackerlogic_deinit( void ); void exerr( char * message ); /* add_peer_to_torrent does only release the torrent bucket if from_sync is set, otherwise it is released in return_peers_for_torrent */ size_t return_peers_for_torrent( ot_torrent *torrent, size_t amount, char *reply, PROTO_FLAG proto ); ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer WANT_SYNC_PARAM( int from_sync ) ); size_t remove_peer_from_torrent( ot_hash *hash, ot_peer *peer, char *reply, PROTO_FLAG proto ); size_t return_tcp_scrape_for_torrent( ot_hash *hash, int amount, char *reply ); size_t return_udp_scrape_for_torrent( ot_hash *hash, char *reply ); /* Helper, before it moves to its own object */ void free_peerlist( ot_peerlist *peer_list ); #endif