]> granicus.if.org Git - transmission/commitdiff
#905: update peer_id client lists. add a dozen or so new clients from Azureus (thank...
authorCharles Kerr <charles@transmissionbt.com>
Tue, 29 Apr 2008 16:57:16 +0000 (16:57 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Tue, 29 Apr 2008 16:57:16 +0000 (16:57 +0000)
libtransmission/Makefile.am
libtransmission/clients-test.c [new file with mode: 0644]
libtransmission/clients.c
libtransmission/clients.h
libtransmission/handshake.c
libtransmission/peer-mgr.c
libtransmission/utils.c
libtransmission/utils.h

index 09e762ad2822da0a3f76707bd8549d7a262d1155..51a1fcc7955edb8b4e2ef8d7431a7c9062e36772 100644 (file)
@@ -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
 
diff --git a/libtransmission/clients-test.c b/libtransmission/clients-test.c
new file mode 100644 (file)
index 0000000..ffc7c19
--- /dev/null
@@ -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;
+}
index 6e81f627b12a543500db1018fe37f56c778cf971..a5891aaec9c07a45593c2ed298f4962800b2e8a7 100644 (file)
  * 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;
 }
index 4bd7d12133fb3d5b5097fe46a953549196424e93..9c4bfb094ae72370c3979b585391f4130fbde557 100644 (file)
@@ -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 );
index a532c279011467372a930652d058844467302bea..564961417b4f7921992063c49a39ca7697222f37 100644 (file)
@@ -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;
index 92da3c28ddb54fe0b626dc04b785386fa15f19bd..b26d27633d56f378722f3520910548da7c0f4dfd 100644 (file)
@@ -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 );
index d4184525c15163d272bd2afcf0e53fa5a4faf831..f804b962c4ffba278af29f94e8445184b6ca616f 100644 (file)
@@ -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 );
         }
     }
 
index 91a193f2fcadc8eac044085dda9c4a535f62684d..8ced7755ce0e2f25f3c2f10ca16bcd5f6dc8eeb2 100644 (file)
@@ -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. */