summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--opentracker.c13
-rw-r--r--trackerlogic.c35
2 files changed, 31 insertions, 17 deletions
diff --git a/opentracker.c b/opentracker.c
index ae755cc..2e46fa1 100644
--- a/opentracker.c
+++ b/opentracker.c
@@ -83,7 +83,7 @@ int main( int argc, char **argv );
83static void httperror( const int64 s, const char *title, const char *message ); 83static void httperror( const int64 s, const char *title, const char *message );
84static void httpresponse( const int64 s, char *data ); 84static void httpresponse( const int64 s, char *data );
85 85
86static void sendmallocdata( const int64 s, char *buffer, const size_t size ); 86static void sendmmapdata( const int64 s, char *buffer, const size_t size );
87static void senddata( const int64 s, char *buffer, const size_t size ); 87static void senddata( const int64 s, char *buffer, const size_t size );
88 88
89static void server_mainloop( ); 89static void server_mainloop( );
@@ -132,7 +132,7 @@ static void httperror( const int64 s, const char *title, const char *message ) {
132 senddata(s,static_outbuf,reply_size); 132 senddata(s,static_outbuf,reply_size);
133} 133}
134 134
135static void sendmallocdata( const int64 s, char *buffer, size_t size ) { 135static void sendmmapdata( const int64 s, char *buffer, size_t size ) {
136 struct http_data *h = io_getcookie( s ); 136 struct http_data *h = io_getcookie( s );
137 char *header; 137 char *header;
138 size_t header_size; 138 size_t header_size;
@@ -152,7 +152,7 @@ static void sendmallocdata( const int64 s, char *buffer, size_t size ) {
152 152
153 iob_reset( &h->batch ); 153 iob_reset( &h->batch );
154 iob_addbuf_free( &h->batch, header, header_size ); 154 iob_addbuf_free( &h->batch, header, header_size );
155 iob_addbuf_free( &h->batch, buffer, size ); 155 iob_addbuf_munmap( &h->batch, buffer, size );
156 156
157 /* writeable sockets timeout after twice the pool timeout 157 /* writeable sockets timeout after twice the pool timeout
158 which defaults to 5 minutes (e.g. after 10 minutes) */ 158 which defaults to 5 minutes (e.g. after 10 minutes) */
@@ -253,7 +253,7 @@ LOG_TO_STDERR( "sync: %d.%d.%d.%d\n", h->ip[0], h->ip[1], h->ip[2], h->ip[3] );
253 253
254 if( mode == SYNC_OUT ) { 254 if( mode == SYNC_OUT ) {
255 if( !( reply_size = return_changeset_for_tracker( &reply ) ) ) HTTPERROR_500; 255 if( !( reply_size = return_changeset_for_tracker( &reply ) ) ) HTTPERROR_500;
256 return sendmallocdata( s, reply, reply_size ); 256 return sendmmapdata( s, reply, reply_size );
257 } 257 }
258 258
259 /* Simple but proof for now */ 259 /* Simple but proof for now */
@@ -305,7 +305,7 @@ LOG_TO_STDERR( "sync: %d.%d.%d.%d\n", h->ip[0], h->ip[1], h->ip[2], h->ip[3] );
305LOG_TO_STDERR( "stats: %d.%d.%d.%d - mode: dmem\n", h->ip[0], h->ip[1], h->ip[2], h->ip[3] ); 305LOG_TO_STDERR( "stats: %d.%d.%d.%d - mode: dmem\n", h->ip[0], h->ip[1], h->ip[2], h->ip[3] );
306 306
307 if( !( reply_size = return_memstat_for_tracker( &reply ) ) ) HTTPERROR_500; 307 if( !( reply_size = return_memstat_for_tracker( &reply ) ) ) HTTPERROR_500;
308 return sendmallocdata( s, reply, reply_size ); 308 return sendmmapdata( s, reply, reply_size );
309 309
310 case STATS_UDP: 310 case STATS_UDP:
311 t = time( NULL ) - ot_start_time; 311 t = time( NULL ) - ot_start_time;
@@ -380,9 +380,8 @@ SCRAPE_WORKAROUND:
380LOG_TO_STDERR( "scrp: %d.%d.%d.%d - FULL SCRAPE\n", h->ip[0], h->ip[1], h->ip[2], h->ip[3] ); 380LOG_TO_STDERR( "scrp: %d.%d.%d.%d - FULL SCRAPE\n", h->ip[0], h->ip[1], h->ip[2], h->ip[3] );
381 381
382 if( !( reply_size = return_fullscrape_for_tracker( &reply ) ) ) HTTPERROR_500; 382 if( !( reply_size = return_fullscrape_for_tracker( &reply ) ) ) HTTPERROR_500;
383 if( (c = realloc( reply, reply_size ) ) ) reply = c;
384 ot_overall_tcp_successfulannounces++; 383 ot_overall_tcp_successfulannounces++;
385 return sendmallocdata( s, reply, reply_size ); 384 return sendmmapdata( s, reply, reply_size );
386 } 385 }
387 386
388 /* Enough for http header + whole scrape string */ 387 /* Enough for http header + whole scrape string */
diff --git a/trackerlogic.c b/trackerlogic.c
index ee7b7fc..3f09d56 100644
--- a/trackerlogic.c
+++ b/trackerlogic.c
@@ -27,8 +27,8 @@ static ot_vector accesslist;
27#define WANT_ACCESS_CONTROL 27#define WANT_ACCESS_CONTROL
28#endif 28#endif
29 29
30size_t changeset_size = 0; 30static size_t changeset_size = 0;
31time_t last_clean_time = 0; 31static time_t last_clean_time = 0;
32 32
33/* Converter function from memory to human readable hex strings 33/* Converter function from memory to human readable hex strings
34 - definitely not thread safe!!! 34 - definitely not thread safe!!!
@@ -305,14 +305,16 @@ size_t return_peers_for_torrent( ot_torrent *torrent, size_t amount, char *reply
305/* Fetch full scrape info for all torrents */ 305/* Fetch full scrape info for all torrents */
306size_t return_fullscrape_for_tracker( char **reply ) { 306size_t return_fullscrape_for_tracker( char **reply ) {
307 size_t torrent_count = 0, j; 307 size_t torrent_count = 0, j;
308 size_t allocated, replysize, usedpages;
308 int i, k; 309 int i, k;
309 char *r; 310 char *r;
310 311
311 for( i=0; i<256; ++i ) 312 for( i=0; i<256; ++i )
312 torrent_count += all_torrents[i].size; 313 torrent_count += all_torrents[i].size;
313 314
314 // one extra for pro- and epilogue 315 /* one extra for pro- and epilogue */
315 if( !( r = *reply = malloc( 100*(1+torrent_count) ) ) ) return 0; 316 allocated = 100*(1+torrent_count);
317 if( !( r = *reply = mmap( NULL, allocated, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0 ) ) ) return 0;
316 318
317 memmove( r, "d5:filesd", 9 ); r += 9; 319 memmove( r, "d5:filesd", 9 ); r += 9;
318 for( i=0; i<256; ++i ) { 320 for( i=0; i<256; ++i ) {
@@ -334,11 +336,19 @@ size_t return_fullscrape_for_tracker( char **reply ) {
334 } 336 }
335 337
336 *r++='e'; *r++='e'; 338 *r++='e'; *r++='e';
337 return r - *reply; 339
340 replysize = ( r - *reply );
341 if( allocated > replysize ) {
342 usedpages = 1 + ( replysize / getpagesize() );
343 munmap( *reply + usedpages * getpagesize(), allocated - replysize );
344 }
345
346 return replysize;
338} 347}
339 348
340size_t return_memstat_for_tracker( char **reply ) { 349size_t return_memstat_for_tracker( char **reply ) {
341 size_t torrent_count = 0, j; 350 size_t torrent_count = 0, j;
351 size_t allocated, replysize, usedpages;
342 int i, k; 352 int i, k;
343 char *r; 353 char *r;
344 354
@@ -347,7 +357,8 @@ size_t return_memstat_for_tracker( char **reply ) {
347 torrent_count += torrents_list->size; 357 torrent_count += torrents_list->size;
348 } 358 }
349 359
350 if( !( r = *reply = malloc( 256*32 + (43+OT_POOLS_COUNT*32)*torrent_count ) ) ) return 0; 360 allocated = 256*32 + (43+OT_POOLS_COUNT*32)*torrent_count;
361 if( !( r = *reply = mmap( NULL, allocated, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0 ) ) ) return 0;
351 362
352 for( i=0; i<256; ++i ) 363 for( i=0; i<256; ++i )
353 r += sprintf( r, "%02X: %08X %08X\n", i, (unsigned int)all_torrents[i].size, (unsigned int)all_torrents[i].space ); 364 r += sprintf( r, "%02X: %08X %08X\n", i, (unsigned int)all_torrents[i].size, (unsigned int)all_torrents[i].space );
@@ -363,7 +374,13 @@ size_t return_memstat_for_tracker( char **reply ) {
363 } 374 }
364 } 375 }
365 376
366 return r - *reply; 377 replysize = ( r - *reply );
378 if( allocated > replysize ) {
379 usedpages = 1 + ( replysize / getpagesize() );
380 munmap( *reply + usedpages * getpagesize(), allocated - replysize );
381 }
382
383 return replysize;
367} 384}
368 385
369/* Fetches scrape info for a specific torrent */ 386/* Fetches scrape info for a specific torrent */
@@ -506,9 +523,7 @@ size_t return_changeset_for_tracker( char **reply ) {
506 523
507 clean_all_torrents(); 524 clean_all_torrents();
508 525
509 *reply = malloc( 8 + changeset_size + 2 ); 526 if( !( *reply = mmap( NULL, 8 + changeset_size + 2, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0 ) ) ) return 0;
510 if( !*reply )
511 return 0;
512 527
513 memmove( *reply, "d4:syncd", 8 ); 528 memmove( *reply, "d4:syncd", 8 );
514 for( i = 0; i < changeset.size; ++i ) { 529 for( i = 0; i < changeset.size; ++i ) {