Changeset 1727
- Timestamp:
- Apr 16, 2007, 9:21:00 PM (15 years ago)
- Location:
- trunk/libtransmission
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libtransmission/peeraz.h
r1720 r1727 224 224 } 225 225 226 static char *227 makeAZPex( tr_torrent_t * tor, tr_peer_t * peer, int * len )226 static int 227 makeAZPex( tr_torrent_t * tor, tr_peer_t * peer, char ** buf, int * len ) 228 228 { 229 229 benc_val_t val; 230 char * buf;231 232 peer_dbg( "SEND azureus-pex" );233 230 234 231 assert( !peer->private ); 235 232 tr_bencInitStr( &val, tor->info.hash, sizeof( tor->info.hash ), 1 ); 236 buf = makeCommonPex( tor, peer, len, peertreeToBencAZ, "infohash", &val ); 237 238 return buf; 233 return makeCommonPex( tor, peer, peertreeToBencAZ, "infohash", &val, 234 buf, len); 239 235 } 240 236 … … 428 424 subsub = tr_bencDictFind( dict, "ver" ); 429 425 if( NULL == subsub || TYPE_STR != subsub->type || 430 1 != subsub->val.s.i || AZ_EXT_VERSION !=subsub->val.s.s[0] )426 1 != subsub->val.s.i || AZ_EXT_VERSION > subsub->val.s.s[0] ) 431 427 { 432 428 continue; -
trunk/libtransmission/peerext.h
r1720 r1727 26 26 #define EXTENDED_PEX_ID 1 27 27 28 static char *29 makeCommonPex( tr_torrent_t * tor, tr_peer_t * peer, int * len,28 static int 29 makeCommonPex( tr_torrent_t * tor, tr_peer_t * peer, 30 30 int ( *peerfunc )( tr_peertree_t *, benc_val_t * ), 31 const char * extrakey, benc_val_t * extraval ) 31 const char * extrakey, benc_val_t * extraval, 32 char ** retbuf, int * retlen ) 32 33 { 33 34 tr_peertree_t * sent, added, common; … … 36 37 tr_peertree_entry_t * found; 37 38 benc_val_t val, * addval, * delval, * extra; 38 char * buf; 39 40 * len = 0;39 40 *retbuf = NULL; 41 *retlen = 0; 41 42 sent = &peer->sentPeers; 42 43 peertreeInit( &added ); … … 61 62 peertreeFree( &added ); 62 63 tr_bencFree( extraval ); 63 return NULL; 64 } 65 } 66 67 /* build the dictionaries */ 68 tr_bencInit( &val, TYPE_DICT ); 69 if( ( peertreeEmpty( &added ) && peertreeEmpty( sent ) ) || 70 tr_bencDictReserve( &val, 3 ) ) 71 { 72 tr_bencFree( &val ); 64 return 1; 65 } 66 } 67 68 /* check if there were any added or deleted peers */ 69 if( peertreeEmpty( &added ) && peertreeEmpty( sent ) ) 70 { 73 71 peertreeMerge( sent, &common ); 74 72 peertreeFree( &added ); 75 73 tr_bencFree( extraval ); 76 return NULL; 74 return 0; 75 } 76 77 /* build the dictionaries */ 78 tr_bencInit( &val, TYPE_DICT ); 79 if( tr_bencDictReserve( &val, 3 ) ) 80 { 81 tr_bencFree( &val ); 82 peertreeMerge( sent, &common ); 83 peertreeFree( &added ); 84 tr_bencFree( extraval ); 85 return 1; 77 86 } 78 87 extra = tr_bencDictAdd( &val, extrakey ); … … 86 95 peertreeFree( &added ); 87 96 tr_bencFree( extraval ); 88 return NULL;97 return 1; 89 98 } 90 99 *extra = *extraval; 91 100 memset( extraval, 0, sizeof( extraval ) ); 101 102 /* bencode it */ 103 *retbuf = tr_bencSaveMalloc( &val, retlen ); 104 tr_bencFree( &val ); 105 if( NULL == *retbuf ) 106 { 107 peertreeMerge( sent, &common ); 108 peertreeFree( &added ); 109 return 1; 110 } 111 112 peertreeSwap( sent, &common ); 113 peertreeMerge( sent, &added ); 114 peertreeFree( &common ); 115 116 return 0; 117 } 118 119 static char * 120 makeExtendedHandshake( tr_torrent_t * tor, tr_peer_t * peer, int * len ) 121 { 122 benc_val_t val, * msgsval; 123 char * buf, * vers; 124 125 /* get human-readable version string */ 126 vers = NULL; 127 asprintf( &vers, "%s %s", TR_NAME, VERSION_STRING ); 128 if( NULL == vers ) 129 { 130 return NULL; 131 } 132 133 /* reserve space in toplevel dictionary for v, m, and possibly p */ 134 tr_bencInit( &val, TYPE_DICT ); 135 if( tr_bencDictReserve( &val, ( 0 < tor->publicPort ? 3 : 2 ) ) ) 136 { 137 free( vers ); 138 tr_bencFree( &val ); 139 return NULL; 140 } 141 142 /* human readable version string */ 143 tr_bencInitStr( tr_bencDictAdd( &val, "v" ), vers, 0, 0 ); 144 145 /* create dict of supported extended messages */ 146 msgsval = tr_bencDictAdd( &val, "m" ); 147 tr_bencInit( msgsval, TYPE_DICT ); 148 if( tr_bencDictReserve( msgsval, 1 ) ) 149 { 150 tr_bencFree( &val ); 151 return NULL; 152 } 153 /* for public torrents advertise utorrent pex message */ 154 tr_bencInitInt( tr_bencDictAdd( msgsval, "ut_pex" ), 155 ( peer->private ? 0 : EXTENDED_PEX_ID ) ); 156 157 /* our listening port */ 158 if( 0 < tor->publicPort ) 159 { 160 /* XXX should inform peer when we no longer have a valid port */ 161 tr_bencInitInt( tr_bencDictAdd( &val, "p" ), tor->publicPort ); 162 } 92 163 93 164 /* bencode it */ … … 96 167 if( NULL == buf ) 97 168 { 98 peertreeMerge( sent, &common );99 peertreeFree( &added );100 169 return NULL; 101 170 } 102 171 103 peertreeSwap( sent, &common );104 peertreeMerge( sent, &added );105 peertreeFree( &common );106 107 return buf;108 }109 110 static char *111 makeExtendedHandshake( tr_torrent_t * tor, tr_peer_t * peer, int * len )112 {113 benc_val_t val, * msgsval;114 char * buf, * vers;115 116 /* get human-readable version string */117 vers = NULL;118 asprintf( &vers, "%s %s", TR_NAME, VERSION_STRING );119 if( NULL == vers )120 {121 return NULL;122 }123 124 /* reserve space in toplevel dictionary for v, m, and possibly p */125 tr_bencInit( &val, TYPE_DICT );126 if( tr_bencDictReserve( &val, ( 0 < tor->publicPort ? 3 : 2 ) ) )127 {128 free( vers );129 tr_bencFree( &val );130 return NULL;131 }132 133 /* human readable version string */134 tr_bencInitStr( tr_bencDictAdd( &val, "v" ), vers, 0, 0 );135 136 /* create dict of supported extended messages */137 msgsval = tr_bencDictAdd( &val, "m" );138 tr_bencInit( msgsval, TYPE_DICT );139 if( tr_bencDictReserve( msgsval, 1 ) )140 {141 tr_bencFree( &val );142 return NULL;143 }144 /* for public torrents advertise utorrent pex message */145 tr_bencInitInt( tr_bencDictAdd( msgsval, "ut_pex" ),146 ( peer->private ? 0 : EXTENDED_PEX_ID ) );147 148 /* our listening port */149 if( 0 < tor->publicPort )150 {151 /* XXX should inform peer when we no longer have a valid port */152 tr_bencInitInt( tr_bencDictAdd( &val, "p" ), tor->publicPort );153 }154 155 /* bencode it */156 buf = tr_bencSaveMalloc( &val, len );157 tr_bencFree( &val );158 if( NULL == buf )159 {160 return NULL;161 }162 163 172 peer->advertisedPort = tor->publicPort; 164 165 peer_dbg( "SEND extended-handshake, %s pex",166 ( peer->private ? "without" : "with" ) );167 173 168 174 return buf; … … 202 208 } 203 209 204 static char *205 makeUTPex( tr_torrent_t * tor, tr_peer_t * peer, int * len )210 static int 211 makeUTPex( tr_torrent_t * tor, tr_peer_t * peer, char ** buf, int * len ) 206 212 { 207 213 benc_val_t val; 208 char * ret;209 210 peer_dbg( "SEND extended-pex" );211 214 212 215 assert( !peer->private ); 213 216 tr_bencInitStr( &val, NULL, 0, 1 ); 214 ret = makeCommonPex( tor, peer, len, peertreeToBencUT, "added.f", &val ); 215 216 return ret; 217 return makeCommonPex( tor, peer, peertreeToBencUT, "added.f", &val, 218 buf, len ); 217 219 } 218 220 -
trunk/libtransmission/peermessages.h
r1665 r1727 406 406 case EXTENDED_HANDSHAKE_ID: 407 407 buf = makeExtendedHandshake( tor, peer, &len ); 408 if( NULL == buf ) 409 { 410 return TR_ERROR; 411 } 412 peer_dbg( "SEND extended-handshake, %s pex", 413 ( peer->private ? "without" : "with" ) ); 408 414 break; 409 415 case EXTENDED_PEX_ID: 410 buf = makeUTPex( tor, peer, &len ); 416 if( makeUTPex( tor, peer, &buf, &len ) ) 417 { 418 return TR_ERROR; 419 } 420 else if( NULL == buf ) 421 { 422 return TR_OK; 423 } 424 peer_dbg( "SEND extended-pex" ); 411 425 break; 412 426 default: 413 427 assert( 0 ); 414 428 break; 415 }416 if( NULL == buf )417 {418 return TR_ERROR;419 429 } 420 430 … … 439 449 int len; 440 450 441 buf = makeAZPex( tor, peer, &len ); 442 if( NULL == buf ) 451 if( makeAZPex( tor, peer, &buf, &len ) ) 443 452 { 444 453 return TR_ERROR; 454 } 455 else if( NULL == buf ) 456 { 457 return TR_OK; 445 458 } 446 459 … … 450 463 free( buf ); 451 464 465 peer_dbg( "SEND azureus-pex" ); 466 452 467 return TR_OK; 453 468 }
Note: See TracChangeset
for help on using the changeset viewer.