Ejemplo n.º 1
0
/*
 * P2P plaintext format: "comment:x.x.x.x-y.y.y.y"
 * http://wiki.phoenixlabs.org/wiki/P2P_Format
 * http://en.wikipedia.org/wiki/PeerGuardian#P2P_plaintext_format
 */
static tr_bool
parseLine1( const char * line, struct tr_ip_range * range )
{
    char * walk;
    int b[4];
    int e[4];
    char str[64];
    tr_address addr;

    walk = strrchr( line, ':' );
    if( !walk )
        return FALSE;
    ++walk; /* walk past the colon */

    if( sscanf( walk, "%d.%d.%d.%d-%d.%d.%d.%d",
                &b[0], &b[1], &b[2], &b[3],
                &e[0], &e[1], &e[2], &e[3] ) != 8 )
        return FALSE;

    tr_snprintf( str, sizeof( str ), "%d.%d.%d.%d", b[0], b[1], b[2], b[3] );
    if( tr_pton( str, &addr ) == NULL )
        return FALSE;
    range->begin = ntohl( addr.addr.addr4.s_addr );

    tr_snprintf( str, sizeof( str ), "%d.%d.%d.%d", e[0], e[1], e[2], e[3] );
    if( tr_pton( str, &addr ) == NULL )
        return FALSE;
    range->end = ntohl( addr.addr.addr4.s_addr );

    return TRUE;
}
Ejemplo n.º 2
0
/*
 * DAT format: "000.000.000.000 - 000.255.255.255 , 000 , invalid ip"
 * http://wiki.phoenixlabs.org/wiki/DAT_Format
 */
static tr_bool
parseLine2( const char * line, struct tr_ip_range * range )
{
    int unk;
    int a[4];
    int b[4];
    char str[32];
    tr_address addr;

    if( sscanf( line, "%3d.%3d.%3d.%3d - %3d.%3d.%3d.%3d , %3d , ",
                &a[0], &a[1], &a[2], &a[3],
                &b[0], &b[1], &b[2], &b[3],
                &unk ) != 9 )
        return FALSE;

    tr_snprintf( str, sizeof(str), "%d.%d.%d.%d", a[0], a[1], a[2], a[3] );
    if( tr_pton( str, &addr ) == NULL )
        return FALSE;
    range->begin = ntohl( addr.addr.addr4.s_addr );

    tr_snprintf( str, sizeof(str), "%d.%d.%d.%d", b[0], b[1], b[2], b[3] );
    if( tr_pton( str, &addr ) == NULL )
        return FALSE;
    range->end = ntohl( addr.addr.addr4.s_addr );

    return TRUE;
}
Ejemplo n.º 3
0
static void
doDNS( void * vtask )
{
    tr_address addr;
    int port = -1;
    char * host = NULL;
    struct hostent     *he;
    struct   sockaddr_in   adr;
     
    struct tr_web_task * task = vtask;
    tr_dns_result lookup_result = TR_DNS_UNTESTED;

    assert( task->resolved_host == NULL );

    if( !tr_urlParse( task->url, -1, NULL, &host, &port, NULL ) )
    {
        task->port = port;
        task->host = host;

        /* If 'host' is an IPv4 or IPv6 address in text form, use it as-is.
         * Otherwise, see if its resolved name is in our DNS cache */
        if( tr_pton( task->host, &addr ) != NULL )
        {
            task->resolved_host = task->host;
            lookup_result = TR_DNS_OK;
        }
        else
        {
        	 if( (he = gethostbyname(host)) ) {
        		 memcpy(&adr.sin_addr, he->h_addr_list[0], he->h_length);
        		 task->resolved_host = strdup(inet_ntoa(adr.sin_addr));
        		 lookup_result = TR_DNS_OK;
        	 } 
        }
    }

    if( lookup_result != TR_DNS_UNTESTED )
    {
        addTask( task );
    }
    else if( !host || evdns_resolve_ipv4( host, 0, dns_ipv4_done_cb, task ) )
    {
        dns_ipv4_done_cb( DNS_ERR_UNKNOWN, DNS_IPv4_A, 0, 0, NULL, task );
    }
}
Ejemplo n.º 4
0
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;
}