diff options
Diffstat (limited to 'opentracker.c')
-rw-r--r-- | opentracker.c | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/opentracker.c b/opentracker.c index c67e331..a82518d 100644 --- a/opentracker.c +++ b/opentracker.c | |||
@@ -51,7 +51,7 @@ static void signal_handler( int s ) { | |||
51 | if( s == SIGINT ) { | 51 | if( s == SIGINT ) { |
52 | /* Any new interrupt signal quits the application */ | 52 | /* Any new interrupt signal quits the application */ |
53 | signal( SIGINT, SIG_DFL); | 53 | signal( SIGINT, SIG_DFL); |
54 | 54 | ||
55 | /* Tell all other threads to not acquire any new lock on a bucket | 55 | /* Tell all other threads to not acquire any new lock on a bucket |
56 | but cancel their operations and return */ | 56 | but cancel their operations and return */ |
57 | g_opentracker_running = 0; | 57 | g_opentracker_running = 0; |
@@ -250,7 +250,7 @@ static int64_t ot_try_bind( ot_ip6 ip, uint16_t port, PROTO_FLAG proto ) { | |||
250 | #else | 250 | #else |
251 | if( ip6_isv4mapped(ip) ) { | 251 | if( ip6_isv4mapped(ip) ) { |
252 | exerr( "V6 Tracker is V6 only!" ); | 252 | exerr( "V6 Tracker is V6 only!" ); |
253 | } | 253 | } |
254 | #endif | 254 | #endif |
255 | 255 | ||
256 | #ifdef _DEBUG | 256 | #ifdef _DEBUG |
@@ -261,7 +261,7 @@ static int64_t ot_try_bind( ot_ip6 ip, uint16_t port, PROTO_FLAG proto ) { | |||
261 | snprintf( _debug + off, sizeof(_debug)-off, "]:%d...", port); | 261 | snprintf( _debug + off, sizeof(_debug)-off, "]:%d...", port); |
262 | fputs( _debug, stderr ); | 262 | fputs( _debug, stderr ); |
263 | #endif | 263 | #endif |
264 | 264 | ||
265 | if( socket_bind6_reuse( sock, ip, port, 0 ) == -1 ) | 265 | if( socket_bind6_reuse( sock, ip, port, 0 ) == -1 ) |
266 | panic( "socket_bind6_reuse" ); | 266 | panic( "socket_bind6_reuse" ); |
267 | 267 | ||
@@ -394,6 +394,42 @@ int parse_configfile( char * config_filename ) { | |||
394 | return bound; | 394 | return bound; |
395 | } | 395 | } |
396 | 396 | ||
397 | void load_state(const char * const state_filename ) { | ||
398 | FILE * state_filehandle; | ||
399 | char inbuf[512]; | ||
400 | ot_hash infohash; | ||
401 | unsigned long long base, downcount; | ||
402 | int consumed; | ||
403 | |||
404 | state_filehandle = fopen( state_filename, "r" ); | ||
405 | |||
406 | if( state_filehandle == NULL ) { | ||
407 | fprintf( stderr, "Warning: Can't open config file: %s.", state_filename ); | ||
408 | return; | ||
409 | } | ||
410 | |||
411 | /* We do ignore anything that is not of the form "^[:xdigit:]:\d+:\d+" */ | ||
412 | while( fgets( inbuf, sizeof(inbuf), state_filehandle ) ) { | ||
413 | int i; | ||
414 | for( i=0; i<(int)sizeof(ot_hash); ++i ) { | ||
415 | int eger = 16 * scan_fromhex( inbuf[ 2*i ] ) + scan_fromhex( inbuf[ 1 + 2*i ] ); | ||
416 | if( eger < 0 ) | ||
417 | continue; | ||
418 | infohash[i] = eger; | ||
419 | } | ||
420 | |||
421 | if( i != (int)sizeof(ot_hash) ) continue; | ||
422 | i *= 2; | ||
423 | |||
424 | if( inbuf[ i++ ] != ':' || !( consumed = scan_ulonglong( inbuf+i, &base ) ) ) continue; | ||
425 | i += consumed; | ||
426 | if( inbuf[ i++ ] != ':' || !( consumed = scan_ulonglong( inbuf+i, &downcount ) ) ) continue; | ||
427 | add_torrent_from_saved_state( infohash, base, downcount ); | ||
428 | } | ||
429 | |||
430 | fclose( state_filehandle ); | ||
431 | } | ||
432 | |||
397 | int drop_privileges (const char * const serverdir) { | 433 | int drop_privileges (const char * const serverdir) { |
398 | struct passwd *pws = NULL; | 434 | struct passwd *pws = NULL; |
399 | 435 | ||
@@ -448,7 +484,7 @@ int main( int argc, char **argv ) { | |||
448 | #endif | 484 | #endif |
449 | 485 | ||
450 | while( scanon ) { | 486 | while( scanon ) { |
451 | switch( getopt( argc, argv, ":i:p:A:P:d:r:s:f:v" | 487 | switch( getopt( argc, argv, ":i:p:A:P:d:r:s:f:l:v" |
452 | #ifdef WANT_ACCESSLIST_BLACK | 488 | #ifdef WANT_ACCESSLIST_BLACK |
453 | "b:" | 489 | "b:" |
454 | #elif defined( WANT_ACCESSLIST_WHITE ) | 490 | #elif defined( WANT_ACCESSLIST_WHITE ) |
@@ -477,6 +513,7 @@ while( scanon ) { | |||
477 | #endif | 513 | #endif |
478 | case 'd': set_config_option( &g_serverdir, optarg ); break; | 514 | case 'd': set_config_option( &g_serverdir, optarg ); break; |
479 | case 'r': set_config_option( &g_redirecturl, optarg ); break; | 515 | case 'r': set_config_option( &g_redirecturl, optarg ); break; |
516 | case 'l': load_state( optarg ); break; | ||
480 | case 'A': | 517 | case 'A': |
481 | if( !scan_ip6( optarg, tmpip )) { usage( argv[0] ); exit( 1 ); } | 518 | if( !scan_ip6( optarg, tmpip )) { usage( argv[0] ); exit( 1 ); } |
482 | accesslist_blessip( tmpip, 0xffff ); /* Allow everything for now */ | 519 | accesslist_blessip( tmpip, 0xffff ); /* Allow everything for now */ |