Exemplo n.º 1
0
int
tr_dhtStatus( tr_session * session, int af, int * nodes_return )
{
    struct getstatus_closure closure = { af, -1, -1 };

    if( !tr_dhtEnabled( session ) ||
        (af == AF_INET && session->udp_socket < 0) ||
        (af == AF_INET6 && session->udp6_socket < 0) ) {
        if( nodes_return )
            *nodes_return = 0;
        return TR_DHT_STOPPED;
    }

    tr_runInEventThread( session, getstatus, &closure );
    while( closure.status < 0 )
        tr_wait_msec( 50 /*msec*/ );

    if( nodes_return )
        *nodes_return = closure.count;

    return closure.status;
}
Exemplo n.º 2
0
int
tr_dhtAddNode (tr_session       * ss,
               const tr_address * address,
               tr_port            port,
               bool            bootstrap)
{
    int af = address->type == TR_AF_INET ? AF_INET : AF_INET6;

    if (!tr_dhtEnabled (ss))
        return 0;

    /* Since we don't want to abuse our bootstrap nodes,
     * we don't ping them if the DHT is in a good state. */

    if (bootstrap) {
        if (tr_dhtStatus (ss, af, NULL) >= TR_DHT_FIREWALLED)
            return 0;
    }

    if (address->type == TR_AF_INET) {
        struct sockaddr_in sin;
        memset (&sin, 0, sizeof (sin));
        sin.sin_family = AF_INET;
        memcpy (&sin.sin_addr, &address->addr.addr4, 4);
        sin.sin_port = htons (port);
        dht_ping_node ((struct sockaddr*)&sin, sizeof (sin));
        return 1;
    } else if (address->type == TR_AF_INET6) {
        struct sockaddr_in6 sin6;
        memset (&sin6, 0, sizeof (sin6));
        sin6.sin6_family = AF_INET6;
        memcpy (&sin6.sin6_addr, &address->addr.addr6, 16);
        sin6.sin6_port = htons (port);
        dht_ping_node ((struct sockaddr*)&sin6, sizeof (sin6));
        return 1;
    }

    return 0;
}
Exemplo n.º 3
0
tr_port
tr_dhtPort( tr_session *ss )
{
    return tr_dhtEnabled( ss ) ? dht_port : 0;
}
Exemplo n.º 4
0
tr_port
tr_dhtPort( tr_session *ss )
{
    return tr_dhtEnabled( ss ) ? ss->udp_port : 0;
}