static void blocklistEnsureLoaded(tr_blocklistFile* b) { if (b->rules == NULL) { blocklistLoad(b); } }
int _tr_blocklistSetContent( tr_blocklist * b, const char * filename ) { FILE * in; FILE * out; int inCount = 0; int outCount = 0; char line[2048]; const char * err_fmt = _( "Couldn't read \"%1$s\": %2$s" ); if( !filename ) { blocklistDelete( b ); return 0; } in = fopen( filename, "rb" ); if( !in ) { tr_err( err_fmt, filename, tr_strerror( errno ) ); return 0; } blocklistClose( b ); out = fopen( b->filename, "wb+" ); if( !out ) { tr_err( err_fmt, b->filename, tr_strerror( errno ) ); fclose( in ); return 0; } while( fgets( line, sizeof( line ), in ) != NULL ) { char * walk; struct tr_ip_range range; ++inCount; /* zap the linefeed */ if(( walk = strchr( line, '\r' ))) *walk = '\0'; if(( walk = strchr( line, '\n' ))) *walk = '\0'; if( !parseLine( line, &range ) ) { /* don't try to display the actual lines - it causes issues */ tr_err( _( "blocklist skipped invalid address at line %d" ), inCount ); continue; } if( fwrite( &range, sizeof( struct tr_ip_range ), 1, out ) != 1 ) { tr_err( _( "Couldn't save file \"%1$s\": %2$s" ), b->filename, tr_strerror( errno ) ); break; } ++outCount; } { char * base = tr_basename( b->filename ); tr_inf( _( "Blocklist \"%s\" updated with %d entries" ), base, outCount ); tr_free( base ); } fclose( out ); fclose( in ); blocklistLoad( b ); return outCount; }
static void blocklistEnsureLoaded( tr_blocklist * b ) { if( !b->rules ) blocklistLoad( b ); }
int _tr_blocklistSetContent( tr_blocklist * b, const char * filename ) { FILE * in; FILE * out; char * line; int lineCount = 0; const char * err_fmt = _( "Couldn't read \"%1$s\": %2$s" ); if( !filename ) { blocklistDelete( b ); return 0; } in = fopen( filename, "r" ); if( !in ) { tr_err( err_fmt, filename, tr_strerror( errno ) ); return 0; } blocklistClose( b ); out = fopen( b->filename, "wb+" ); if( !out ) { tr_err( err_fmt, b->filename, tr_strerror( errno ) ); fclose( in ); return 0; } while( !fggets( &line, in ) ) { char * rangeBegin; char * rangeEnd; char * crpos; tr_address addr; struct tr_ip_range range; rangeBegin = strrchr( line, ':' ); if( !rangeBegin ) { free( line ); continue; } ++rangeBegin; rangeEnd = strchr( rangeBegin, '-' ); if( !rangeEnd ) { free( line ); continue; } *rangeEnd++ = '\0'; if(( crpos = strchr( rangeEnd, '\r' ))) *crpos = '\0'; if( !tr_pton( rangeBegin, &addr ) ) tr_err( "blocklist skipped invalid address [%s]\n", rangeBegin ); range.begin = ntohl( addr.addr.addr4.s_addr ); if( !tr_pton( rangeEnd, &addr ) ) tr_err( "blocklist skipped invalid address [%s]\n", rangeEnd ); range.end = ntohl( addr.addr.addr4.s_addr ); free( line ); if( fwrite( &range, sizeof( struct tr_ip_range ), 1, out ) != 1 ) { tr_err( _( "Couldn't save file \"%1$s\": %2$s" ), b->filename, tr_strerror( errno ) ); break; } ++lineCount; } { char * base = tr_basename( b->filename ); tr_inf( _( "Blocklist \"%1$s\" updated with %2$'d entries" ), base, lineCount ); tr_free( base ); } fclose( out ); fclose( in ); blocklistLoad( b ); return lineCount; }