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; }
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; }
tr_port tr_dhtPort( tr_session *ss ) { return tr_dhtEnabled( ss ) ? dht_port : 0; }
tr_port tr_dhtPort( tr_session *ss ) { return tr_dhtEnabled( ss ) ? ss->udp_port : 0; }