Changeset 8880
- Timestamp:
- Aug 7, 2009, 2:38:09 PM (13 years ago)
- Location:
- trunk/libtransmission
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libtransmission/tr-dht.c
r8727 r8880 116 116 tr_free( cl->nodes ); 117 117 tr_free( closure ); 118 tr_ndbg( "DHT", "Finished bootstrapping" ); 118 119 } 119 120 … … 134 135 return -1; 135 136 136 dht_socket = socket(PF_INET, SOCK_DGRAM, 0);137 if(dht_socket < 0)138 return -1;139 140 137 dht_port = tr_sessionGetPeerPort(ss); 141 138 if(dht_port <= 0) 142 139 return -1; 140 141 tr_ndbg( "DHT", "Initialising DHT" ); 142 143 dht_socket = socket(PF_INET, SOCK_DGRAM, 0); 144 if(dht_socket < 0) 145 goto fail; 143 146 144 147 memset(&sin, 0, sizeof(sin)); … … 158 161 if(( have_id = tr_bencDictFindRaw( &benc, "id", &raw, &len ) && len==20 )) 159 162 memcpy( myid, raw, len ); 160 if( tr_bencDictFindRaw( &benc, "nodes", &raw, &len ) && !(len%6) ) 163 if( tr_bencDictFindRaw( &benc, "nodes", &raw, &len ) && !(len%6) ) { 161 164 nodes = tr_memdup( raw, len ); 165 tr_ninf( "DHT", "Bootstrapping from %d old nodes", (int)(len/6) ); 166 } 162 167 tr_bencFree( &benc ); 163 168 } 164 169 165 if(!have_id) { 170 if( have_id ) 171 tr_ninf( "DHT", "Reusing old id" ); 172 else { 166 173 /* Note that DHT ids need to be distributed uniformly, 167 174 * so it should be something truly random. */ 175 tr_ninf( "DHT", "Generating new id" ); 168 176 tr_cryptoRandBuf( myid, 20 ); 169 177 } … … 190 198 tr_timerAdd( &dht_event, 0, tr_cryptoWeakRandInt( 1000000 ) ); 191 199 200 tr_ndbg( "DHT", "DHT initialised" ); 201 192 202 return 1; 193 203 … … 198 208 dht_socket = -1; 199 209 session = NULL; 210 tr_ndbg( "DHT", "DHT initialisation failed (errno = %d)", save ); 200 211 errno = save; 201 212 } … … 210 221 return; 211 222 223 tr_ndbg( "DHT", "Uninitialising DHT" ); 224 212 225 event_del(&dht_event); 213 226 214 227 /* Since we only save known good nodes, avoid erasing older data if we 215 228 don't know enough nodes. */ 216 if(tr_dhtStatus(ss, NULL) >= TR_DHT_FIREWALLED) { 229 if(tr_dhtStatus(ss, NULL) < TR_DHT_FIREWALLED) 230 tr_ninf( "DHT", "Not saving nodes, DHT not ready" ); 231 else { 217 232 tr_benc benc; 218 233 struct sockaddr_in sins[300]; … … 222 237 int n = dht_get_nodes(sins, 300); 223 238 int j = 0; 239 240 tr_ninf( "DHT", "Saving %d nodes", n ); 224 241 for( i=0; i<n; ++i ) { 225 242 memcpy( compact + j, &sins[i].sin_addr, 4 ); … … 239 256 EVUTIL_CLOSESOCKET( dht_socket ); 240 257 258 tr_ndbg("DHT", "Done uninitialising DHT"); 259 241 260 session = NULL; 242 261 } … … 299 318 300 319 int 301 tr_dhtAddNode(tr_session *ss, tr_address *address, tr_port port, tr_bool bootstrap) 320 tr_dhtAddNode(tr_session *ss, tr_address *address, tr_port port, 321 tr_bool bootstrap) 302 322 { 303 323 struct sockaddr_in sin; … … 323 343 324 344 return 1; 345 } 346 347 const char * 348 tr_dhtPrintableStatus(int status) 349 { 350 switch(status) { 351 case TR_DHT_STOPPED: return "stopped"; 352 case TR_DHT_BROKEN: return "broken"; 353 case TR_DHT_POOR: return "poor"; 354 case TR_DHT_FIREWALLED: return "firewalled"; 355 case TR_DHT_GOOD: return "good"; 356 default: return "???"; 357 } 325 358 } 326 359 … … 341 374 tr_peerMgrAddPex( tor, TR_PEER_FROM_DHT, pex+i ); 342 375 tr_free(pex); 376 tr_torinf(tor, "Learned %d peers from DHT", (int)n); 343 377 } 344 378 tr_globalUnlock( session ); … … 347 381 { 348 382 tr_torrent * tor = tr_torrentFindFromHash( session, info_hash ); 349 if( tor ) 383 if( tor ) { 384 tr_torinf(tor, "DHT announce done"); 350 385 tor->dhtAnnounceInProgress = 0; 386 } 351 387 } 352 388 } … … 355 391 tr_dhtAnnounce(tr_torrent *tor, tr_bool announce) 356 392 { 357 int rc ;393 int rc, status, numnodes; 358 394 359 395 if( !tr_torrentAllowsDHT( tor ) ) 360 396 return -1; 361 397 362 if( tr_dhtStatus( tor->session, NULL ) < TR_DHT_POOR ) 398 status = tr_dhtStatus( tor->session, &numnodes ); 399 if(status < TR_DHT_POOR ) { 400 tr_tordbg(tor, "DHT not ready (%s, %d nodes)", 401 tr_dhtPrintableStatus(status), numnodes); 363 402 return 0; 403 } 364 404 365 405 rc = dht_search( dht_socket, tor->info.hash, … … 367 407 callback, NULL); 368 408 369 if( rc >= 1 ) 409 if( rc >= 1 ) { 410 tr_torinf(tor, "Starting DHT announce (%s, %d nodes)", 411 tr_dhtPrintableStatus(status), numnodes); 370 412 tor->dhtAnnounceInProgress = TRUE; 413 } else { 414 tr_torerr(tor, "DHT announce failed, errno = %d (%s, %d nodes)", 415 errno, tr_dhtPrintableStatus(status), numnodes); 416 } 371 417 372 418 return 1; … … 382 428 tosleep = 0; 383 429 } else { 384 perror("dht_periodic");430 tr_nerr("DHT", "dht_periodic failed (errno = %d)", errno); 385 431 if(errno == EINVAL || errno == EFAULT) 386 432 abort(); -
trunk/libtransmission/tr-dht.h
r8452 r8880 32 32 tr_port tr_dhtPort ( const tr_session * ); 33 33 int tr_dhtStatus( tr_session *, int * setme_nodeCount ); 34 const char *tr_dhtPrintableStatus(int status); 34 35 int tr_dhtAddNode( tr_session *, tr_address *, tr_port, tr_bool bootstrap ); 35 36 int tr_dhtAnnounce( tr_torrent *, tr_bool announce );
Note: See TracChangeset
for help on using the changeset viewer.