Changeset 10708


Ignore:
Timestamp:
May 31, 2010, 11:38:36 AM (12 years ago)
Author:
charles
Message:

(trunk libT) #3247 "add blocklist support for pipfilter file format" -- implemented in trunk for 2.00

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/blocklist.c

    r10624 r10708  
    228228}
    229229
     230/*
     231 * level1 format: "comment:x.x.x.x-y.y.y.y"
     232 */
     233static tr_bool
     234parseLine1( const char * line, struct tr_ip_range * range )
     235{
     236    char * walk;
     237    int b[4];
     238    int e[4];
     239    char str[64];
     240    tr_address addr;
     241
     242    walk = strrchr( line, ':' );
     243    if( !walk )
     244        return FALSE;
     245    ++walk; /* walk past the colon */
     246
     247    if( sscanf( walk, "%d.%d.%d.%d-%d.%d.%d.%d",
     248                &b[0], &b[1], &b[2], &b[3],
     249                &e[0], &e[1], &e[2], &e[3] ) != 8 )
     250        return FALSE;
     251
     252    tr_snprintf( str, sizeof( str ), "%d.%d.%d.%d", b[0], b[1], b[2], b[3] );
     253    if( tr_pton( str, &addr ) == NULL )
     254        return FALSE;
     255    range->begin = ntohl( addr.addr.addr4.s_addr );
     256
     257    tr_snprintf( str, sizeof( str ), "%d.%d.%d.%d", e[0], e[1], e[2], e[3] );
     258    if( tr_pton( str, &addr ) == NULL )
     259        return FALSE;
     260    range->end = ntohl( addr.addr.addr4.s_addr );
     261
     262    return TRUE;
     263}
     264
     265/*
     266 * "000.000.000.000 - 000.255.255.255 , 000 , invalid ip"
     267 */
     268static tr_bool
     269parseLine2( const char * line, struct tr_ip_range * range )
     270{
     271    int unk;
     272    int a[4];
     273    int b[4];
     274    char str[32];
     275    tr_address addr;
     276
     277    if( sscanf( line, "%3d.%3d.%3d.%3d - %3d.%3d.%3d.%3d , %3d , ",
     278                &a[0], &a[1], &a[2], &a[3],
     279                &b[0], &b[1], &b[2], &b[3],
     280                &unk ) != 9 )
     281        return FALSE;
     282
     283    tr_snprintf( str, sizeof(str), "%d.%d.%d.%d", a[0], a[1], a[2], a[3] );
     284    if( tr_pton( str, &addr ) == NULL )
     285        return FALSE;
     286    range->begin = ntohl( addr.addr.addr4.s_addr );
     287
     288    tr_snprintf( str, sizeof(str), "%d.%d.%d.%d", b[0], b[1], b[2], b[3] );
     289    if( tr_pton( str, &addr ) == NULL )
     290        return FALSE;
     291    range->end = ntohl( addr.addr.addr4.s_addr );
     292
     293    return TRUE;
     294}
     295
     296static int
     297parseLine( const char * line, struct tr_ip_range * range )
     298{
     299    return parseLine1( line, range )
     300        || parseLine2( line, range );
     301}
     302
    230303int
    231304_tr_blocklistSetContent( tr_blocklist * b,
     
    264337    while( !fggets( &line, in ) )
    265338    {
    266         char * rangeBegin;
    267         char * rangeEnd;
    268         char * crpos;
    269         tr_address  addr;
     339        char * walk;
    270340        struct tr_ip_range range;
    271341
    272342        ++inCount;
    273343
    274         rangeBegin = strrchr( line, ':' );
    275         if( !rangeBegin ){ free( line ); continue; }
    276         ++rangeBegin;
    277 
    278         rangeEnd = strchr( rangeBegin, '-' );
    279         if( !rangeEnd ){ free( line ); continue; }
    280         *rangeEnd++ = '\0';
    281         if(( crpos = strchr( rangeEnd, '\r' )))
    282             *crpos = '\0';
    283 
    284         if( !tr_pton( rangeBegin, &addr ) )
     344        /* zap the linefeed */
     345        if(( walk = strchr( line, '\r' ))) *walk = '\0';
     346        if(( walk = strchr( line, '\n' ))) *walk = '\0';
     347
     348        if( !parseLine( line, &range ) )
    285349        {
    286             printf( "error rangeBegin: %s", line );
    287350            /* don't try to display the actual lines - it causes issues */
    288351            tr_err( _( "blocklist skipped invalid address at line %d" ), inCount );
     
    290353            continue;
    291354        }
    292         range.begin = ntohl( addr.addr.addr4.s_addr );
    293 
    294         if( !tr_pton( rangeEnd, &addr ) )
    295         {
    296             printf( "error rangeEnd: %s", line );
    297             /* don't try to display the actual lines - it causes issues */
    298             tr_err( _( "blocklist skipped invalid address at line %d" ), inCount );
    299             free( line );
    300             continue;
    301         }
    302         range.end = ntohl( addr.addr.addr4.s_addr );
    303355
    304356        free( line );
     
    306358        if( fwrite( &range, sizeof( struct tr_ip_range ), 1, out ) != 1 )
    307359        {
    308             tr_err( _(
    309                        "Couldn't save file \"%1$s\": %2$s" ), b->filename,
     360            tr_err( _( "Couldn't save file \"%1$s\": %2$s" ), b->filename,
    310361                   tr_strerror( errno ) );
    311362            break;
Note: See TracChangeset for help on using the changeset viewer.