* 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;
+}
+
+static int
+strint( const void * pch, int span )
+{
+ 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 );
}
-char * tr_clientForId( const uint8_t * id )
+static void
+mainline_style( char * buf, size_t buflen, const char * name, const uint8_t * id )
{
- char * ret = NULL;
+ 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 ) )
- {
- /* 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] ) );
- }
- else
- {
- tr_asprintf( &ret, "Transmission %d.%c%c%s",
- charToInt( id[3] ), id[4], id[5],
- id[6] == 'Z' || id[6] == 'X' ? "+" : "" );
- }
- }
- else if( !memcmp( &id[1], "UT", 2 ) )
- {
- tr_asprintf( &ret, "\xc2\xb5Torrent %c.%d", id[3],
- charToInt( id[4] ) * 10 + charToInt( id[5] ) );
- }
- else if( !memcmp( &id[1], "AZ", 2 ) )
- {
- tr_asprintf( &ret, "Azureus %c.%c.%c.%c",
- id[3], id[4], id[5], id[6] );
- }
-
- else if( !memcmp( &id[1], "BC", 2 ) )
- {
- tr_asprintf( &ret, "BitComet %d.%c%c",
- charToInt( id[3] ) * 10 + charToInt( id[4] ),
- id[5], id[6] );
- }
- else if( !memcmp( &id[1], "SZ", 2 ) || !memcmp( &id[1], "S~", 2 ) )
+ if( !memcmp( id+1, "UT", 2 ) )
{
- tr_asprintf( &ret, "Shareaza %c.%c.%c.%c",
- id[3], id[4], id[5], 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]) );
}
- else if( !memcmp( &id[1], "XL", 2 ) )
- {
- 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 ) )
+
+ /* we win the most fucked-up peer_id award! hooray! */
+ else if( !memcmp( id+1, "TR", 2 ) )
{
- tr_asprintf( &ret, "TorrentStorm %c.%c.%c.%c",
- id[3], id[4], id[5], id[6] );
+ 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 ) )
+
+ 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] );
- }
+ 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, "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] ) );
+ three_digits( buf, buflen, "KTorrent", id+3 );
}
- 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 ) )
+
+ 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, "GetRight %c.%c.%c.%c",
- id[3], id[4], id[5], id[6] );
+ snprintf( buf, buflen, "BitBuddy %c.%c%c%c", id[3], id[4], id[5], id[6] );
}
- else if( !memcmp( &id[1], "PD", 2 ) )
+ else if( !memcmp( id+1, "BR", 2 ) )
{
- tr_asprintf( &ret, "Pando %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], "WY", 2 ) )
+ else if( !memcmp( id+1, "CT", 2 ) )
{
- tr_asprintf( &ret, "Wyzo %c.%c.%c.%c",
- id[3], 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], "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 ) )
+ else if( !memcmp( id+1, "XX", 2 ) )
{
- tr_asprintf( &ret, "LimeWire" );
+ snprintf( buf, buflen, "Xtorrent %d.%d (%d)", charint(id[3]), charint(id[4]), strint(id+5,2) );
}
-
- if( ret )
+ else if( !memcmp( id+1, "BOW", 3 ) )
{
- 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] == '-' )
- {
- 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[0] == 'Q' && id[2] == '-' && id[7] == '-' )
- {
- 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] == '-' )
+
+ /* Mainline */
+ if( isMainlineStyle( id ) )
{
- tr_asprintf( &ret, "Amazon S3 %c.%c.%c", id[3], id[5], id[7] );
+ if( *id=='M' ) mainline_style( buf, buflen, "BitTorrent", id );
+ if( *id=='Q' ) mainline_style( buf, buflen, "Queen Bee", id );
+ if( *buf ) return;
}
- else if( !memcmp( id, "exbc", 4 ) )
+
+ /* 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] == '-' )
{
- 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;
}