mirror of
https://github.com/transmission/transmission.git
synced 2026-05-08 09:39:08 +01:00
#905: update peer_id client lists. add a dozen or so new clients from Azureus (thanks amc1!)
This commit is contained in:
@@ -84,6 +84,7 @@ bin_PROGRAMS = benc2php
|
||||
TESTS = \
|
||||
blocklist-test \
|
||||
bencode-test \
|
||||
clients-test \
|
||||
test-fastset \
|
||||
test-peer-id
|
||||
|
||||
@@ -106,13 +107,14 @@ bencode_test_SOURCES = bencode-test.c
|
||||
bencode_test_LDADD = $(APPS_LDADD)
|
||||
blocklist_test_SOURCES = blocklist-test.c
|
||||
blocklist_test_LDADD = $(APPS_LDADD)
|
||||
clients_test_SOURCES = clients-test.c
|
||||
clients_test_LDADD = $(APPS_LDADD)
|
||||
test_fastset_SOURCES = test-fastset.c
|
||||
test_fastset_LDADD = $(APPS_LDADD)
|
||||
test_peer_id_SOURCES = test-peer-id.c
|
||||
test_peer_id_LDADD = $(APPS_LDADD)
|
||||
|
||||
|
||||
|
||||
EXTRA_libtransmission_a_SOURCES = \
|
||||
version.h
|
||||
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "transmission.h"
|
||||
#include "clients.h"
|
||||
|
||||
#define VERBOSE 0
|
||||
|
||||
#define check(A) { \
|
||||
++test; \
|
||||
if (A) { \
|
||||
if( VERBOSE ) \
|
||||
fprintf( stderr, "PASS test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
|
||||
} else { \
|
||||
if( VERBOSE ) \
|
||||
fprintf( stderr, "FAIL test #%d (%s, %d)\n", test, __FILE__, __LINE__ ); \
|
||||
return test; \
|
||||
} \
|
||||
}
|
||||
|
||||
int
|
||||
main( void )
|
||||
{
|
||||
int test = 0;
|
||||
char buf[128];
|
||||
|
||||
tr_clientForId( buf, sizeof( buf ), "-FC1013-" ); check( !strcmp( buf, "FileCroc 1.0.1.3" ) );
|
||||
tr_clientForId( buf, sizeof( buf ), "-MR1100-" ); check( !strcmp( buf, "Miro 1.1.0.0" ) );
|
||||
tr_clientForId( buf, sizeof( buf ), "-TR0006-" ); check( !strcmp( buf, "Transmission 0.6" ) );
|
||||
tr_clientForId( buf, sizeof( buf ), "-TR0072-" ); check( !strcmp( buf, "Transmission 0.72" ) );
|
||||
tr_clientForId( buf, sizeof( buf ), "-TR111Z-" ); check( !strcmp( buf, "Transmission 1.11 (Dev)" ) );
|
||||
|
||||
/* cleanup */
|
||||
return 0;
|
||||
}
|
||||
+234
-351
@@ -22,427 +22,310 @@
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*****************************************************************************/
|
||||
|
||||
#include <ctype.h> /* isprint */
|
||||
/* thanks amc1! */
|
||||
|
||||
#include <ctype.h> /* isprint, tolower */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h> /* strtol */
|
||||
#include <string.h>
|
||||
|
||||
#include "transmission.h"
|
||||
#include "trcompat.h" /* strlcpy */
|
||||
#include "utils.h"
|
||||
|
||||
static int charToInt( char character )
|
||||
static int
|
||||
charint( char ch )
|
||||
{
|
||||
int value;
|
||||
if( character >= 'A' && character <= 'Z' )
|
||||
value = 10 + character - 'A';
|
||||
else if( character >= 'a' && character <= 'z')
|
||||
value = 36 + character - 'a';
|
||||
else
|
||||
value = character - '0';
|
||||
|
||||
return value;
|
||||
if( isdigit( ch ) ) return ch - '0';
|
||||
if( isupper( ch ) ) return 10 + ch - 'A';
|
||||
if( islower( ch ) ) return 36 + ch - 'a';
|
||||
return 0;
|
||||
}
|
||||
|
||||
char * tr_clientForId( const uint8_t * id )
|
||||
static int
|
||||
strint( const void * pch, int span )
|
||||
{
|
||||
char * ret = NULL;
|
||||
char tmp[64];
|
||||
memcpy( tmp, pch, span );
|
||||
tmp[span] = '\0';
|
||||
return strtol( tmp, NULL, 0 );
|
||||
}
|
||||
|
||||
static const char*
|
||||
getMnemonic( char ch )
|
||||
{
|
||||
switch( ch )
|
||||
{
|
||||
case 'b': case 'B': return "Beta";
|
||||
case 'd': return "Debug";
|
||||
case 'x': case 'X': case 'Z': return "(Dev)";
|
||||
default: return "";
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
three_digits( char * buf, size_t buflen, const char * name, const uint8_t * digits )
|
||||
{
|
||||
snprintf( buf, buflen, "%s %d.%d.%d", name,
|
||||
charint( digits[0] ),
|
||||
charint( digits[1] ),
|
||||
charint( digits[2] ) );
|
||||
}
|
||||
static void
|
||||
four_digits( char * buf, size_t buflen, const char * name, const uint8_t * digits )
|
||||
{
|
||||
snprintf( buf, buflen, "%s %d.%d.%d.%d", name,
|
||||
charint( digits[0] ),
|
||||
charint( digits[1] ),
|
||||
charint( digits[2] ),
|
||||
charint( digits[3] ) );
|
||||
}
|
||||
static void
|
||||
two_major_two_minor( char * buf, size_t buflen, const char * name, const uint8_t * digits )
|
||||
{
|
||||
snprintf( buf, buflen, "%s %02d.%02d", name,
|
||||
strint( digits+0, 2 ),
|
||||
strint( digits+2, 2 ) );
|
||||
}
|
||||
static void
|
||||
no_version( char * buf, size_t buflen, const char * name )
|
||||
{
|
||||
strlcpy( buf, name, buflen );
|
||||
}
|
||||
|
||||
static void
|
||||
mainline_style( char * buf, size_t buflen, const char * name, const uint8_t * id )
|
||||
{
|
||||
if( id[4] == '-' && id[6] == '-' )
|
||||
snprintf( buf, buflen, "%s %c.%c.%c", name, id[1], id[3], id[5] );
|
||||
else if( id[5] == '-' )
|
||||
snprintf( buf, buflen, "%s %c.%c%c.%c", name, id[1], id[3], id[4], id[6] );
|
||||
}
|
||||
|
||||
static int
|
||||
isMainlineStyle( const uint8_t * peer_id )
|
||||
{
|
||||
/**
|
||||
* One of the following styles will be used:
|
||||
* Mx-y-z--
|
||||
* Mx-yy-z-
|
||||
*/
|
||||
return peer_id[2]=='-'
|
||||
&& peer_id[7]=='-'
|
||||
&& ( peer_id[4]=='-' || peer_id[5]=='-' );
|
||||
}
|
||||
|
||||
void
|
||||
tr_clientForId( char * buf, size_t buflen, const void * id_in )
|
||||
{
|
||||
const uint8_t * id = id_in;
|
||||
|
||||
*buf = '\0';
|
||||
|
||||
if( !id )
|
||||
return;
|
||||
|
||||
/* Azureus-style */
|
||||
if( id[0] == '-' && id[7] == '-' )
|
||||
{
|
||||
if( !memcmp( &id[1], "TR", 2 ) )
|
||||
if( !memcmp( id+1, "UT", 2 ) )
|
||||
{
|
||||
/* support old-style Transmission id without maintenance number */
|
||||
if ( !memcmp( &id[3], "00", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Transmission 0.%d",
|
||||
charToInt( id[5] ) * 10 + charToInt( id[6] ) );
|
||||
}
|
||||
snprintf( buf, buflen, "\xc2\xb5Torrent %d.%d.%d %s",
|
||||
strint(id+3,1), strint(id+4,1), strint(id+5,1), getMnemonic(id[6]) );
|
||||
}
|
||||
|
||||
/* we win the most fucked-up peer_id award! hooray! */
|
||||
else if( !memcmp( id+1, "TR", 2 ) )
|
||||
{
|
||||
if( !memcmp( id+3, "000", 3 ) ) /* very old client style: -TR0006- is 0.6 */
|
||||
snprintf( buf, buflen, "Transmission 0.%c", id[6] );
|
||||
else if( !memcmp( id+3, "00", 2) ) /* previous client style: -TR0072- is 0.72 */
|
||||
snprintf( buf, buflen, "Transmission %d.%02d", strint(id+3,2), strint(id+5,2) );
|
||||
else /* current client style: -TR072Z- is 0.72 (Dev) */
|
||||
snprintf( buf, buflen, "Transmission %d.%02d %s", strint(id+3,1), strint(id+4,2), getMnemonic(id[6]) );
|
||||
}
|
||||
|
||||
else if( !memcmp( id+1, "KT", 2 ) )
|
||||
{
|
||||
if( id[5] == 'D' )
|
||||
snprintf( buf, buflen, "KTorrent %d.%d Dev %d", charint(id[3]), charint(id[4]), charint(id[6]) );
|
||||
else if( id[5] == 'R' )
|
||||
snprintf( buf, buflen, "KTorrent %d.%d RC %d", charint(id[3]), charint(id[4]), charint(id[6]) );
|
||||
else
|
||||
{
|
||||
tr_asprintf( &ret, "Transmission %d.%c%c%s",
|
||||
charToInt( id[3] ), id[4], id[5],
|
||||
id[6] == 'Z' || id[6] == 'X' ? "+" : "" );
|
||||
}
|
||||
three_digits( buf, buflen, "KTorrent", id+3 );
|
||||
}
|
||||
else if( !memcmp( &id[1], "UT", 2 ) )
|
||||
|
||||
else if( !memcmp( id+1, "AR", 2 ) ) four_digits( buf, buflen, "Ares", id+3 );
|
||||
else if( !memcmp( id+1, "AT", 2 ) ) four_digits( buf, buflen, "Artemis", id+3 );
|
||||
else if( !memcmp( id+1, "AV", 2 ) ) four_digits( buf, buflen, "Avicora", id+3 );
|
||||
else if( !memcmp( id+1, "AZ", 2 ) ) four_digits( buf, buflen, "Azureus", id+3 );
|
||||
else if( !memcmp( id+1, "BG", 2 ) ) four_digits( buf, buflen, "BTG", id+3 );
|
||||
else if( !memcmp( id+1, "BX", 2 ) ) four_digits( buf, buflen, "BittorrentX", id+3 );
|
||||
else if( !memcmp( id+1, "bk", 2 ) ) four_digits( buf, buflen, "BitKitten (libtorrent)", id+3 );
|
||||
else if( !memcmp( id+1, "BS", 2 ) ) four_digits( buf, buflen, "BTSlave", id+3 );
|
||||
else if( !memcmp( id+1, "BX", 2 ) ) four_digits( buf, buflen, "BittorrentX", id+3 );
|
||||
else if( !memcmp( id+1, "EB", 2 ) ) four_digits( buf, buflen, "EBit", id+3 );
|
||||
else if( !memcmp( id+1, "DE", 2 ) ) four_digits( buf, buflen, "Deluge", id+3 );
|
||||
else if( !memcmp( id+1, "DP", 2 ) ) four_digits( buf, buflen, "Propogate Data Client", id+3 );
|
||||
else if( !memcmp( id+1, "FC", 2 ) ) four_digits( buf, buflen, "FileCroc", id+3 );
|
||||
else if( !memcmp( id+1, "FT", 2 ) ) four_digits( buf, buflen, "FoxTorrent/RedSwoosh", id+3 );
|
||||
else if( !memcmp( id+1, "GR", 2 ) ) four_digits( buf, buflen, "GetRight", id+3 );
|
||||
else if( !memcmp( id+1, "HN", 2 ) ) four_digits( buf, buflen, "Hydranode", id+3 );
|
||||
else if( !memcmp( id+1, "LH", 2 ) ) four_digits( buf, buflen, "LH-ABC", id+3 );
|
||||
else if( !memcmp( id+1, "NX", 2 ) ) four_digits( buf, buflen, "Net Transport", id+3 );
|
||||
else if( !memcmp( id+1, "MO", 2 ) ) four_digits( buf, buflen, "MonoTorrent", id+3 );
|
||||
else if( !memcmp( id+1, "MR", 2 ) ) four_digits( buf, buflen, "Miro", id+3 );
|
||||
else if( !memcmp( id+1, "MT", 2 ) ) four_digits( buf, buflen, "Moonlight", id+3 );
|
||||
else if( !memcmp( id+1, "PD", 2 ) ) four_digits( buf, buflen, "Pando", id+3 );
|
||||
else if( !memcmp( id+1, "RT", 2 ) ) four_digits( buf, buflen, "Retriever", id+3 );
|
||||
else if( !memcmp( id+1, "SS", 2 ) ) four_digits( buf, buflen, "SwarmScope", id+3 );
|
||||
else if( !memcmp( id+1, "SZ", 2 ) ) four_digits( buf, buflen, "Shareaza", id+3 );
|
||||
else if( !memcmp( id+1, "S~", 2 ) ) four_digits( buf, buflen, "Shareaza", id+3 );
|
||||
else if( !memcmp( id+1, "st", 2 ) ) four_digits( buf, buflen, "SharkTorrent", id+3 );
|
||||
else if( !memcmp( id+1, "TS", 2 ) ) four_digits( buf, buflen, "TorrentStorm", id+3 );
|
||||
else if( !memcmp( id+1, "UL", 2 ) ) four_digits( buf, buflen, "uLeecher!", id+3 );
|
||||
else if( !memcmp( id+1, "VG", 2 ) ) four_digits( buf, buflen, "Vagaa", id+3 );
|
||||
else if( !memcmp( id+1, "WT", 2 ) ) four_digits( buf, buflen, "BitLet", id+3 );
|
||||
else if( !memcmp( id+1, "WY", 2 ) ) four_digits( buf, buflen, "Wyzo", id+3 );
|
||||
else if( !memcmp( id+1, "XL", 2 ) ) four_digits( buf, buflen, "Xunlei", id+3 );
|
||||
else if( !memcmp( id+1, "XT", 2 ) ) four_digits( buf, buflen, "XanTorrent", id+3 );
|
||||
else if( !memcmp( id+1, "ZT", 2 ) ) four_digits( buf, buflen, "ZipTorrent", id+3 );
|
||||
|
||||
else if( !memcmp( id+1, "AG", 2 ) ) three_digits( buf, buflen, "Ares", id+3 );
|
||||
else if( !memcmp( id+1, "A~", 2 ) ) three_digits( buf, buflen, "Ares", id+3 );
|
||||
else if( !memcmp( id+1, "ES", 2 ) ) three_digits( buf, buflen, "Electric Sheep", id+3 );
|
||||
else if( !memcmp( id+1, "HL", 2 ) ) three_digits( buf, buflen, "Halite", id+3 );
|
||||
else if( !memcmp( id+1, "LT", 2 ) ) three_digits( buf, buflen, "libtorrent (Rasterbar)", id+3 );
|
||||
else if( !memcmp( id+1, "lt", 2 ) ) three_digits( buf, buflen, "libTorrent (Rakshasa)", id+3 );
|
||||
else if( !memcmp( id+1, "MP", 2 ) ) three_digits( buf, buflen, "MooPolice", id+3 );
|
||||
else if( !memcmp( id+1, "TT", 2 ) ) three_digits( buf, buflen, "TuoTu", id+3 );
|
||||
else if( !memcmp( id+1, "qB", 2 ) ) three_digits( buf, buflen, "qBittorrent", id+3 );
|
||||
|
||||
else if( !memcmp( id+1, "AX", 2 ) ) two_major_two_minor( buf, buflen, "BitPump", id+3 );
|
||||
else if( !memcmp( id+1, "BC", 2 ) ) two_major_two_minor( buf, buflen, "BitComet", id+3 );
|
||||
else if( !memcmp( id+1, "CD", 2 ) ) two_major_two_minor( buf, buflen, "Enhanced CTorrent", id+3 );
|
||||
else if( !memcmp( id+1, "FG", 2 ) ) two_major_two_minor( buf, buflen, "FlashGet", id+3 );
|
||||
else if( !memcmp( id+1, "LP", 2 ) ) two_major_two_minor( buf, buflen, "Lphant", id+3 );
|
||||
|
||||
else if( !memcmp( id+1, "BF", 2 ) ) no_version( buf, buflen, "BitFlu" );
|
||||
else if( !memcmp( id+1, "LW", 2 ) ) no_version( buf, buflen, "LimeWire" );
|
||||
|
||||
else if( !memcmp( id+1, "BB", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "\xc2\xb5Torrent %c.%d", id[3],
|
||||
charToInt( id[4] ) * 10 + charToInt( id[5] ) );
|
||||
snprintf( buf, buflen, "BitBuddy %c.%c%c%c", id[3], id[4], id[5], id[6] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "AZ", 2 ) )
|
||||
else if( !memcmp( id+1, "BR", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Azureus %c.%c.%c.%c",
|
||||
id[3], id[4], id[5], id[6] );
|
||||
snprintf( buf, buflen, "BitRocket %c.%c (%c%c)", id[3], id[4], id[5], id[6] );
|
||||
}
|
||||
|
||||
else if( !memcmp( &id[1], "BC", 2 ) )
|
||||
else if( !memcmp( id+1, "CT", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "BitComet %d.%c%c",
|
||||
charToInt( id[3] ) * 10 + charToInt( id[4] ),
|
||||
id[5], id[6] );
|
||||
snprintf( buf, buflen, "CTorrent %d.%d.%02d", charint(id[3]), charint(id[4]), strint(id+5,2) );
|
||||
}
|
||||
else if( !memcmp( &id[1], "SZ", 2 ) || !memcmp( &id[1], "S~", 2 ) )
|
||||
else if( !memcmp( id+1, "XX", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Shareaza %c.%c.%c.%c",
|
||||
id[3], id[4], id[5], id[6] );
|
||||
snprintf( buf, buflen, "Xtorrent %d.%d (%d)", charint(id[3]), charint(id[4]), strint(id+5,2) );
|
||||
}
|
||||
else if( !memcmp( &id[1], "XL", 2 ) )
|
||||
else if( !memcmp( id+1, "BOW", 3 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Xunlei %c.%c.%c.%c",
|
||||
id[3], id[4], id[5], id[6] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "BOW", 3 ) )
|
||||
{
|
||||
if( !memcmp( &id[4], "A0C", 3 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Bits on Wheels 1.0.6" );
|
||||
}
|
||||
else if( !memcmp( &id[4], "A0B", 3 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Bits on Wheels 1.0.5" );
|
||||
}
|
||||
else
|
||||
{
|
||||
tr_asprintf( &ret, "Bits on Wheels (%c%c%c)",
|
||||
id[4], id[5], id[6] );
|
||||
}
|
||||
}
|
||||
else if( !memcmp( &id[1], "BR", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "BitRocket %c.%c (%d)",
|
||||
id[3], id[4], charToInt( id[5] ) * 10 + charToInt( id[6] ) );
|
||||
}
|
||||
else if( !memcmp( &id[1], "XX", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Xtorrent %c.%c (%d)",
|
||||
id[3], id[4], charToInt( id[5] ) * 10 + charToInt( id[6] ) );
|
||||
}
|
||||
else if( !memcmp( &id[1], "TS", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "TorrentStorm %c.%c.%c.%c",
|
||||
id[3], id[4], id[5], id[6] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "KT", 2 ) )
|
||||
{
|
||||
if( id[5] == 'R' )
|
||||
{
|
||||
tr_asprintf( &ret, "KTorrent %c.%c RC %c",
|
||||
id[3], id[4], id[6] );
|
||||
}
|
||||
else if( id[5] == 'D' )
|
||||
{
|
||||
tr_asprintf( &ret, "KTorrent %c.%c Dev",
|
||||
id[3], id[4] );
|
||||
}
|
||||
else
|
||||
{
|
||||
tr_asprintf( &ret, "KTorrent %c.%c.%c",
|
||||
id[3], id[4], id[5] );
|
||||
}
|
||||
}
|
||||
else if( !memcmp( &id[1], "lt", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "libTorrent %d.%d.%d.%d",
|
||||
charToInt( id[3] ), charToInt( id[4] ),
|
||||
charToInt( id[5] ), charToInt( id[6] ) );
|
||||
}
|
||||
else if( !memcmp( &id[1], "LT", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "libtorrent %d.%d.%d.%d",
|
||||
charToInt( id[3] ), charToInt( id[4] ),
|
||||
charToInt( id[5] ), charToInt( id[6] ) );
|
||||
}
|
||||
else if( !memcmp( &id[1], "LH", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "LH-ABC %c.%c.%c",
|
||||
id[3], id[4], id[5] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "TT", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "TuoTu %c.%c.%c",
|
||||
id[3], id[4], id[5] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "ES", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Electric Sheep %c.%c.%c",
|
||||
id[3], id[4], id[5] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "CD", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Enhanced CTorrent %d.%d",
|
||||
charToInt( id[3] ) * 10 + charToInt( id[4] ),
|
||||
charToInt( id[5] ) * 10 + charToInt( id[6] ) );
|
||||
}
|
||||
else if( !memcmp( &id[1], "CT", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "CTorrent %c.%c.%d",
|
||||
id[3], id[4],
|
||||
charToInt( id[5] ) * 10 + charToInt( id[6] ) );
|
||||
}
|
||||
else if( !memcmp( &id[1], "LP", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Lphant %d.%c%c",
|
||||
charToInt( id[3] ) * 10 + charToInt( id[4] ),
|
||||
id[5], id[6] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "AX", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "BitPump %d.%c%c",
|
||||
charToInt( id[3] ) * 10 + charToInt( id[4] ),
|
||||
id[5], id[6] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "DE", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Deluge %d.%d.%d",
|
||||
charToInt( id[3] ), charToInt( id[4] ),
|
||||
charToInt( id[5] ) );
|
||||
}
|
||||
else if( !memcmp( &id[1], "AG", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Ares Galaxy %d.%d.%d",
|
||||
charToInt( id[3] ), charToInt( id[4] ),
|
||||
charToInt( id[5] ) );
|
||||
}
|
||||
else if( !memcmp( &id[1], "HL", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Halite %d.%d.%d",
|
||||
charToInt( id[3] ), charToInt( id[4] ),
|
||||
charToInt( id[5] ) );
|
||||
}
|
||||
else if( !memcmp( &id[1], "AR", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Arctic Torrent" );
|
||||
}
|
||||
else if( !memcmp( &id[1], "BG", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "BTG %c.%c.%c.%c",
|
||||
id[3], id[4], id[5], id[6] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "BB", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "BitBuddy %c.%c%c%c",
|
||||
id[3], id[4], id[5], id[6] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "qB", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "qBittorrent %d.%d.%d",
|
||||
charToInt( id[3] ), charToInt( id[4] ),
|
||||
charToInt( id[5] ) );
|
||||
}
|
||||
else if( !memcmp( &id[1], "BF", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Bitflu (%d/%d/%02d)",
|
||||
charToInt( id[6] ),
|
||||
charToInt( id[4] ) * 10 + charToInt( id[5] ),
|
||||
charToInt( id[3] ) );
|
||||
}
|
||||
else if( !memcmp( &id[1], "FT", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "FoxTorrent (%c%c%c%c)",
|
||||
id[3], id[4], id[5], id[6] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "GR", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "GetRight %c.%c.%c.%c",
|
||||
id[3], id[4], id[5], id[6] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "PD", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Pando %c.%c.%c.%c",
|
||||
id[3], id[4], id[5], id[6] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "WY", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Wyzo %c.%c.%c.%c",
|
||||
id[3], id[4], id[5], id[6] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "NX", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Net Transport %d.%c.%c",
|
||||
charToInt( id[3] ) * 10 + charToInt( id[4] ),
|
||||
id[5], id[6] );
|
||||
}
|
||||
else if( !memcmp( &id[1], "LW", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "LimeWire" );
|
||||
}
|
||||
|
||||
if( ret )
|
||||
{
|
||||
return ret;
|
||||
if( !memcmp( &id[4], "A0B", 3 ) ) snprintf( buf, buflen, "Bits on Wheels 1.0.5" );
|
||||
else if( !memcmp( &id[4], "A0C", 3 ) ) snprintf( buf, buflen, "Bits on Wheels 1.0.6" );
|
||||
else snprintf( buf, buflen, "Bits on Wheels %c.%c.%c", id[4], id[5], id[5] );
|
||||
}
|
||||
|
||||
if( *buf )
|
||||
return;
|
||||
}
|
||||
|
||||
/* Tornado-style */
|
||||
/* Shad0w-style */
|
||||
if( !memcmp( &id[4], "----", 4 ) || !memcmp( &id[4], "--0", 3 ) )
|
||||
{
|
||||
if( id[0] == 'T' )
|
||||
{
|
||||
tr_asprintf( &ret, "BitTornado %d.%d.%d", charToInt( id[1] ),
|
||||
charToInt( id[2] ), charToInt( id[3] ) );
|
||||
}
|
||||
else if( id[0] == 'A' )
|
||||
{
|
||||
tr_asprintf( &ret, "ABC %d.%d.%d", charToInt( id[1] ),
|
||||
charToInt( id[2] ), charToInt( id[3] ) );
|
||||
}
|
||||
else if( id[0] == 'R' )
|
||||
{
|
||||
tr_asprintf( &ret, "Tribler %c.%c", id[1], id[2] );
|
||||
}
|
||||
else if( id[0] == 'S' )
|
||||
{
|
||||
tr_asprintf( &ret, "Shad0w's Client %d.%d.%d", charToInt( id[1] ),
|
||||
charToInt( id[2] ), charToInt( id[3] ) );
|
||||
}
|
||||
|
||||
if( ret )
|
||||
{
|
||||
return ret;
|
||||
switch( *id ) {
|
||||
case 'A': three_digits( buf, buflen, "ABC", id+1 ); break;
|
||||
case 'O': three_digits( buf, buflen, "Osprey", id+1 ); break;
|
||||
case 'Q': three_digits( buf, buflen, "BTQueue", id+1 ); break;
|
||||
case 'R': three_digits( buf, buflen, "Tribler", id+1 ); break;
|
||||
case 'S': three_digits( buf, buflen, "Shad0w", id+1 ); break;
|
||||
case 'T': three_digits( buf, buflen, "BitTornado", id+1 ); break;
|
||||
default: break;
|
||||
}
|
||||
if( *buf ) return;
|
||||
}
|
||||
|
||||
/* Different formatting per client */
|
||||
if( id[0] == 'M' && id[2] == '-' && id[7] == '-' )
|
||||
|
||||
/* Mainline */
|
||||
if( isMainlineStyle( id ) )
|
||||
{
|
||||
if( id[4] == '-' && id[6] == '-' )
|
||||
{
|
||||
tr_asprintf( &ret, "BitTorrent %c.%c.%c", id[1], id[3], id[5] );
|
||||
}
|
||||
else if( id[5] == '-' )
|
||||
{
|
||||
tr_asprintf( &ret, "BitTorrent %c.%c%c.%c", id[1], id[3], id[4], id[6] );
|
||||
}
|
||||
|
||||
if( ret )
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
if( *id=='M' ) mainline_style( buf, buflen, "BitTorrent", id );
|
||||
if( *id=='Q' ) mainline_style( buf, buflen, "Queen Bee", id );
|
||||
if( *buf ) return;
|
||||
}
|
||||
if( id[0] == 'Q' && id[2] == '-' && id[7] == '-' )
|
||||
|
||||
/* Clients with no version */
|
||||
if( !memcmp( id, "AZ2500BT", 8 ) ) no_version( buf, buflen, "BitTyrant (Azureus Mod)" );
|
||||
else if( !memcmp( id, "LIME", 4 ) ) no_version( buf, buflen, "Limewire" );
|
||||
else if( !memcmp( id, "martini", 7 ) ) no_version( buf, buflen, "Martini Man" );
|
||||
else if( !memcmp( id, "Pando", 5 ) ) no_version( buf, buflen, "Pando" );
|
||||
else if( !memcmp( id, "a00---0", 7 ) ) no_version( buf, buflen, "Swarmy" );
|
||||
else if( !memcmp( id, "a02---0", 7 ) ) no_version( buf, buflen, "Swarmy" );
|
||||
else if( !memcmp( id, "-G3", 3 ) ) no_version( buf, buflen, "G3 Torrent" );
|
||||
else if( !memcmp( id, "10-------", 9 ) ) no_version( buf, buflen, "JVtorrent" );
|
||||
else if( !memcmp( id, "346-", 4 ) ) no_version( buf, buflen, "TorrentTopia" );
|
||||
else if( !memcmp( id, "eX", 2 ) ) no_version( buf, buflen, "eXeem" );
|
||||
|
||||
/* Everything else */
|
||||
else if( !memcmp( id, "S3", 2 ) && id[2] == '-' && id[4] == '-' && id[6] == '-' )
|
||||
{
|
||||
if( id[4] == '-' && id[6] == '-' )
|
||||
{
|
||||
tr_asprintf( &ret, "Queen Bee %c.%c.%c", id[1], id[3], id[5] );
|
||||
}
|
||||
else if( id[5] == '-' )
|
||||
{
|
||||
tr_asprintf( &ret, "Queen Bee %c.%c%c.%c", id[1], id[3], id[4], id[6] );
|
||||
}
|
||||
|
||||
if( ret )
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
/* All versions of each client are formatted the same */
|
||||
if( !memcmp( id, "S3", 2 ) && id[2] == '-' && id[4] == '-' && id[6] == '-' )
|
||||
{
|
||||
tr_asprintf( &ret, "Amazon S3 %c.%c.%c", id[3], id[5], id[7] );
|
||||
}
|
||||
else if( !memcmp( id, "exbc", 4 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "%s %d.%02d",
|
||||
!memcmp( &id[6], "LORD", 4 ) ? "BitLord" : "BitComet",
|
||||
id[4], id[5] );
|
||||
snprintf( buf, buflen, "Amazon S3 %c.%c.%c", id[3], id[5], id[7] );
|
||||
}
|
||||
else if( !memcmp( id, "OP", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Opera (%c%c%c%c)", id[2], id[3], id[4], id[5] );
|
||||
snprintf( buf, buflen, "Opera (Build %c%c%c%c)", id[2], id[3], id[4], id[5] );
|
||||
}
|
||||
else if( !memcmp( id, "-ML", 3 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "MLDonkey %c%c%c%c%c",
|
||||
id[3], id[4], id[5], id[6], id[7] );
|
||||
}
|
||||
else if( !memcmp( id, "AZ", 2 ) && !memcmp( &id[6], "BT", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "BitTyrant %c.%c.%c.%c",
|
||||
id[2], id[3], id[4], id[5] );
|
||||
}
|
||||
else if( !memcmp( id, "-FG", 3 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "FlashGet %d.%c%c",
|
||||
charToInt( id[3] ) * 10 + charToInt( id[4] ),
|
||||
id[5], id[6] );
|
||||
snprintf( buf, buflen, "MLDonkey %c%c%c%c%c", id[3], id[4], id[5], id[6], id[7] );
|
||||
}
|
||||
else if( !memcmp( id, "DNA", 3 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "BitTorrent DNA %d.%d.%d", charToInt( id[3] ) * 10 + charToInt( id[4] ),
|
||||
charToInt( id[5] ) * 10 + charToInt( id[6] ), charToInt( id[7] ) * 10 + charToInt( id[8] ) );
|
||||
snprintf( buf, buflen, "BitTorrent DNA %d.%d.%d", strint(id+3,2),
|
||||
strint(id+5,2),
|
||||
strint(id+7,2) );
|
||||
}
|
||||
else if( !memcmp( id, "Plus", 4 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Plus! v2 %c.%c%c", id[4], id[5], id[6] );
|
||||
snprintf( buf, buflen, "Plus! v2 %c.%c%c", id[4], id[5], id[6] );
|
||||
}
|
||||
else if( !memcmp( id, "XBT", 3 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "XBT Client %c%c%c%s", id[3], id[4], id[5],
|
||||
id[6] == 'd' ? " (debug)" : "" );
|
||||
snprintf( buf, buflen, "XBT Client %c.%c.%c %s", id[3], id[4], id[5], getMnemonic(id[6]) );
|
||||
}
|
||||
else if( !memcmp( id, "Mbrst", 5 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "burst! %c.%c.%c", id[5], id[7], id[9] );
|
||||
snprintf( buf, buflen, "burst! %c.%c.%c", id[5], id[7], id[9] );
|
||||
}
|
||||
else if( !memcmp( id, "btpd", 4 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "BT Protocol Daemon %c%c%c", id[5], id[6], id[7] );
|
||||
}
|
||||
else if( id[0] == 'Q' && !memcmp( &id[4], "--", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "BTQueue %d.%d.%d", charToInt( id[1] ),
|
||||
charToInt( id[2] ), charToInt( id[3] ) );
|
||||
snprintf( buf, buflen, "BT Protocol Daemon %c%c%c", id[5], id[6], id[7] );
|
||||
}
|
||||
else if( !memcmp( id, "BLZ", 3 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "Blizzard Downloader %d.%d", id[3] + 1, id[4] );
|
||||
}
|
||||
else if( !memcmp( id, "-WT-", 4 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "BitLet" );
|
||||
}
|
||||
else if( !memcmp( id, "LIME", 4 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "LimeWire" );
|
||||
}
|
||||
else if( !memcmp( id, "-G3", 3 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "G3 Torrent" );
|
||||
}
|
||||
else if( !memcmp( id, "10-------", 9 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "JVtorrent" );
|
||||
}
|
||||
else if( !memcmp( id, "346-", 4 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "TorrentTopia" );
|
||||
}
|
||||
else if( !memcmp( id, "eX", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "eXeem" );
|
||||
snprintf( buf, buflen, "Blizzard Downloader %d.%d", id[3]+1, id[4] );
|
||||
}
|
||||
else if( '\0' == id[0] && !memcmp( &id[1], "BS", 2 ) )
|
||||
{
|
||||
tr_asprintf( &ret, "BitSpirit %u", ( id[1] == 0 ? 1 : id[1] ) );
|
||||
snprintf( buf, buflen, "BitSpirit %u", ( id[1] == 0 ? 1 : id[1] ) );
|
||||
}
|
||||
|
||||
/* No match */
|
||||
if( !ret )
|
||||
if( !*buf )
|
||||
{
|
||||
if( isprint( id[0] ) && isprint( id[1] ) && isprint( id[2] ) &&
|
||||
isprint( id[3] ) && isprint( id[4] ) && isprint( id[5] ) &&
|
||||
isprint( id[6] ) && isprint( id[7] ) )
|
||||
{
|
||||
tr_asprintf( &ret, "%c%c%c%c%c%c%c%c",
|
||||
id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7] );
|
||||
}
|
||||
snprintf( buf, buflen, "%c%c%c%c%c%c%c%c",
|
||||
id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7] );
|
||||
else
|
||||
{
|
||||
tr_asprintf( &ret, "0x%02x%02x%02x%02x%02x%02x%02x%02x",
|
||||
id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7] );
|
||||
}
|
||||
snprintf( buf, buflen, "0x%02x%02x%02x%02x%02x%02x%02x%02x",
|
||||
id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7] );
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -22,4 +22,6 @@
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*****************************************************************************/
|
||||
|
||||
char * tr_clientForId( const uint8_t * );
|
||||
void tr_clientForId( char * buf,
|
||||
size_t buflen,
|
||||
const void * peer_id );
|
||||
|
||||
@@ -665,8 +665,8 @@ readHandshake( tr_handshake * handshake, struct evbuffer * inbuf )
|
||||
static int
|
||||
readPeerId( tr_handshake * handshake, struct evbuffer * inbuf )
|
||||
{
|
||||
char * client;
|
||||
int peerIsGood;
|
||||
char client[128];
|
||||
|
||||
if( EVBUFFER_LENGTH(inbuf) < PEER_ID_LEN )
|
||||
return READ_MORE;
|
||||
@@ -675,9 +675,8 @@ readPeerId( tr_handshake * handshake, struct evbuffer * inbuf )
|
||||
tr_peerIoReadBytes( handshake->io, inbuf, handshake->peer_id, PEER_ID_LEN );
|
||||
tr_peerIoSetPeersId( handshake->io, handshake->peer_id );
|
||||
handshake->havePeerID = TRUE;
|
||||
client = tr_clientForId( handshake->peer_id );
|
||||
tr_clientForId( client, sizeof( client ), handshake->peer_id );
|
||||
dbgmsg( handshake, "peer-id is [%s] ... isIncoming is %d", client, tr_peerIoIsIncoming( handshake->io ) );
|
||||
tr_free( client );
|
||||
|
||||
/* if we've somehow connected to ourselves, don't keep the connection */
|
||||
peerIsGood = memcmp( handshake->peer_id, tr_getPeerId(), PEER_ID_LEN ) ? 1 : 0;
|
||||
|
||||
@@ -1045,7 +1045,14 @@ myHandshakeDoneCB( tr_handshake * handshake,
|
||||
{
|
||||
peer = getPeer( t, addr );
|
||||
tr_free( peer->client );
|
||||
peer->client = peer_id ? tr_clientForId( peer_id ) : NULL;
|
||||
|
||||
if( !peer_id )
|
||||
peer->client = NULL;
|
||||
else {
|
||||
char client[128];
|
||||
tr_clientForId( client, sizeof( client ), peer_id );
|
||||
peer->client = tr_strdup( client );
|
||||
}
|
||||
peer->port = port;
|
||||
peer->io = io;
|
||||
peer->msgs = tr_peerMsgsNew( t->tor, peer, msgsCallbackFunc, t, &peer->msgsTag );
|
||||
|
||||
+7
-34
@@ -202,34 +202,6 @@ tr_deepLog( const char * file, int line, const char * name, const char * fmt, ..
|
||||
****
|
||||
***/
|
||||
|
||||
int
|
||||
tr_vasprintf( char **strp, const char *fmt, va_list ap )
|
||||
{
|
||||
int ret;
|
||||
struct evbuffer * buf = evbuffer_new( );
|
||||
*strp = NULL;
|
||||
if( evbuffer_add_vprintf( buf, fmt, ap ) < 0 )
|
||||
ret = -1;
|
||||
else {
|
||||
ret = EVBUFFER_LENGTH( buf );
|
||||
*strp = tr_strndup( (char*)EVBUFFER_DATA(buf), ret );
|
||||
}
|
||||
evbuffer_free( buf );
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
tr_asprintf( char **strp, const char *fmt, ...)
|
||||
{
|
||||
int ret;
|
||||
va_list ap;
|
||||
va_start( ap, fmt );
|
||||
ret = tr_vasprintf( strp, fmt, ap );
|
||||
va_end( ap );
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
tr_msg( const char * file, int line, int level,
|
||||
const char * name,
|
||||
@@ -252,14 +224,14 @@ tr_msg( const char * file, int line, int level,
|
||||
if( messageLevel >= level )
|
||||
{
|
||||
va_list ap;
|
||||
char * text;
|
||||
struct evbuffer * buf = evbuffer_new( );
|
||||
|
||||
/* build the text message */
|
||||
va_start( ap, fmt );
|
||||
tr_vasprintf( &text, fmt, ap );
|
||||
evbuffer_add_vprintf( buf, fmt, ap );
|
||||
va_end( ap );
|
||||
|
||||
if( text != NULL )
|
||||
if( EVBUFFER_LENGTH( buf ) )
|
||||
{
|
||||
if( messageQueuing )
|
||||
{
|
||||
@@ -267,7 +239,7 @@ tr_msg( const char * file, int line, int level,
|
||||
newmsg = tr_new0( tr_msg_list, 1 );
|
||||
newmsg->level = level;
|
||||
newmsg->when = time( NULL );
|
||||
newmsg->message = text;
|
||||
newmsg->message = tr_strdup( (char*)EVBUFFER_DATA( buf ) );
|
||||
newmsg->file = file;
|
||||
newmsg->line = line;
|
||||
newmsg->name = tr_strdup( name );
|
||||
@@ -279,10 +251,11 @@ tr_msg( const char * file, int line, int level,
|
||||
{
|
||||
if( fp == NULL )
|
||||
fp = stderr;
|
||||
fprintf( fp, "%s\n", text );
|
||||
tr_free( text );
|
||||
fprintf( fp, "%s\n", (char*)EVBUFFER_DATA(buf) );
|
||||
fflush( fp );
|
||||
}
|
||||
|
||||
evbuffer_free( buf );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -84,10 +84,6 @@ int tr_mkdirp( const char * path, int permissions );
|
||||
|
||||
uint8_t* tr_loadFile( const char * filename, size_t * size );
|
||||
|
||||
int tr_vasprintf( char **strp, const char *fmt, va_list ap );
|
||||
|
||||
int tr_asprintf( char **strp, const char *fmt, ...);
|
||||
|
||||
|
||||
/* creates a filename from a series of elements using the
|
||||
correct separator for filenames. */
|
||||
|
||||
Reference in New Issue
Block a user