Ignore:
Timestamp:
Apr 29, 2008, 4:57:16 PM (14 years ago)
Author:
charles
Message:

#905: update peer_id client lists. add a dozen or so new clients from Azureus (thanks amc1!)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/clients.c

    r5505 r5723  
    2323 *****************************************************************************/
    2424
    25 #include <ctype.h> /* isprint */
     25/* thanks amc1! */
     26
     27#include <ctype.h> /* isprint, tolower */
    2628#include <stdio.h>
     29#include <stdlib.h> /* strtol */
    2730#include <string.h>
    2831
    2932#include "transmission.h"
     33#include "trcompat.h" /* strlcpy */
    3034#include "utils.h"
    3135
    32 static int charToInt( char character )
    33 {
    34     int value;
    35     if( character >= 'A' && character <= 'Z' )
    36         value = 10 + character - 'A';
    37     else if( character >= 'a' && character <= 'z')
    38         value = 36 + character - 'a';
    39     else
    40         value = character - '0';
    41    
    42     return value;
    43 }
    44 
    45 char * tr_clientForId( const uint8_t * id )
    46 {
    47     char * ret = NULL;
     36static int
     37charint( char ch )
     38{
     39    if( isdigit( ch ) ) return ch - '0';
     40    if( isupper( ch ) ) return 10 + ch - 'A';
     41    if( islower( ch ) ) return 36 + ch - 'a';
     42    return 0;
     43}
     44
     45static int
     46strint( const void * pch, int span )
     47{
     48    char tmp[64];
     49    memcpy( tmp, pch, span );
     50    tmp[span] = '\0';
     51    return strtol( tmp, NULL, 0 );
     52}
     53
     54static const char*
     55getMnemonic( char ch )
     56{
     57    switch( ch )
     58    {
     59        case 'b': case 'B': return "Beta";
     60        case 'd': return "Debug";
     61        case 'x': case 'X': case 'Z': return "(Dev)";
     62        default: return "";
     63    }
     64}
     65
     66static void
     67three_digits( char * buf, size_t buflen, const char * name, const uint8_t * digits )
     68{
     69    snprintf( buf, buflen, "%s %d.%d.%d", name,
     70              charint( digits[0] ),
     71              charint( digits[1] ),
     72              charint( digits[2] ) );
     73}
     74static void
     75four_digits( char * buf, size_t buflen, const char * name, const uint8_t * digits )
     76{
     77    snprintf( buf, buflen, "%s %d.%d.%d.%d", name,
     78              charint( digits[0] ),
     79              charint( digits[1] ),
     80              charint( digits[2] ),
     81              charint( digits[3] ) );
     82}
     83static void
     84two_major_two_minor( char * buf, size_t buflen, const char * name, const uint8_t * digits )
     85{
     86    snprintf( buf, buflen, "%s %02d.%02d", name,
     87              strint( digits+0, 2 ),
     88              strint( digits+2, 2 ) );
     89}
     90static void
     91no_version( char * buf, size_t buflen, const char * name )
     92{
     93    strlcpy( buf, name, buflen );
     94}
     95
     96static void
     97mainline_style( char * buf, size_t buflen, const char * name, const uint8_t * id )
     98{
     99    if( id[4] == '-' && id[6] == '-' )
     100        snprintf( buf, buflen, "%s %c.%c.%c", name, id[1], id[3], id[5] );
     101    else if( id[5] == '-' )
     102        snprintf( buf, buflen, "%s %c.%c%c.%c", name, id[1], id[3], id[4], id[6] );
     103}
     104
     105static int
     106isMainlineStyle( const uint8_t * peer_id )
     107{
     108    /**
     109     * One of the following styles will be used:
     110     *   Mx-y-z--
     111     *   Mx-yy-z-
     112     */
     113    return peer_id[2]=='-'
     114        && peer_id[7]=='-'
     115        && ( peer_id[4]=='-' || peer_id[5]=='-' );
     116}
     117
     118void
     119tr_clientForId( char * buf, size_t buflen, const void * id_in )
     120{
     121    const uint8_t * id = id_in;
     122
     123    *buf = '\0';
     124
     125    if( !id )
     126        return;
    48127   
    49128    /* Azureus-style */
    50129    if( id[0] == '-' && id[7] == '-' )
    51130    {
    52         if( !memcmp( &id[1], "TR", 2 ) )
    53         {
    54             /* support old-style Transmission id without maintenance number */
    55             if ( !memcmp( &id[3], "00", 2 ) )
    56             {
    57                 tr_asprintf( &ret, "Transmission 0.%d",
    58                         charToInt( id[5] ) * 10 + charToInt( id[6] ) );
    59             }
     131        if( !memcmp( id+1, "UT", 2 ) )
     132        {
     133            snprintf( buf, buflen, "\xc2\xb5Torrent %d.%d.%d %s",
     134                      strint(id+3,1), strint(id+4,1), strint(id+5,1), getMnemonic(id[6]) );
     135        }
     136
     137        /* we win the most fucked-up peer_id award!  hooray! */
     138        else if( !memcmp( id+1, "TR", 2 ) )
     139        {
     140            if( !memcmp( id+3, "000", 3 ) ) /* very old client style: -TR0006- is 0.6 */
     141                snprintf( buf, buflen, "Transmission 0.%c", id[6] );
     142            else if( !memcmp( id+3, "00", 2) ) /* previous client style: -TR0072- is 0.72 */
     143                snprintf( buf, buflen, "Transmission %d.%02d", strint(id+3,2), strint(id+5,2) );
     144            else /* current client style: -TR072Z- is 0.72 (Dev) */
     145                snprintf( buf, buflen, "Transmission %d.%02d %s", strint(id+3,1), strint(id+4,2), getMnemonic(id[6]) );
     146        }
     147
     148        else if( !memcmp( id+1, "KT", 2 ) )
     149        {
     150            if( id[5] == 'D' )
     151                snprintf( buf, buflen, "KTorrent %d.%d Dev %d", charint(id[3]), charint(id[4]), charint(id[6]) );
     152            else if( id[5] == 'R' )
     153                snprintf( buf, buflen, "KTorrent %d.%d RC %d", charint(id[3]), charint(id[4]), charint(id[6]) );
    60154            else
    61             {
    62                 tr_asprintf( &ret, "Transmission %d.%c%c%s",
    63                         charToInt( id[3] ), id[4], id[5],
    64                         id[6] == 'Z' || id[6] == 'X' ? "+" : "" );
    65             }
    66         }
    67         else if( !memcmp( &id[1], "UT", 2 ) )
    68         {
    69             tr_asprintf( &ret, "\xc2\xb5Torrent %c.%d", id[3],
    70                       charToInt( id[4] ) * 10 + charToInt( id[5] ) );
    71         }
    72         else if( !memcmp( &id[1], "AZ", 2 ) )
    73         {
    74             tr_asprintf( &ret, "Azureus %c.%c.%c.%c",
    75                       id[3], id[4], id[5], id[6] );
    76         }
    77        
    78         else if( !memcmp( &id[1], "BC", 2 ) )
    79         {
    80             tr_asprintf( &ret, "BitComet %d.%c%c",
    81                       charToInt( id[3] ) * 10 + charToInt( id[4] ),
    82                       id[5], id[6] );
    83         }
    84         else if( !memcmp( &id[1], "SZ", 2 ) || !memcmp( &id[1], "S~", 2 ) )
    85         {
    86             tr_asprintf( &ret, "Shareaza %c.%c.%c.%c",
    87                       id[3], id[4], id[5], id[6] );
    88         }
    89         else if( !memcmp( &id[1], "XL", 2 ) )
    90         {
    91             tr_asprintf( &ret, "Xunlei %c.%c.%c.%c",
    92                          id[3], id[4], id[5], id[6] );
    93         }
    94         else if( !memcmp( &id[1], "BOW", 3 ) )
    95         {
    96             if( !memcmp( &id[4], "A0C", 3 ) )
    97             {
    98                 tr_asprintf( &ret, "Bits on Wheels 1.0.6" );
    99             }
    100             else if( !memcmp( &id[4], "A0B", 3 ) )
    101             {
    102                 tr_asprintf( &ret, "Bits on Wheels 1.0.5" );
    103             }
    104             else
    105             {
    106                 tr_asprintf( &ret, "Bits on Wheels (%c%c%c)",
    107                         id[4], id[5], id[6] );
    108             }
    109         }
    110         else if( !memcmp( &id[1], "BR", 2 ) )
    111         {
    112             tr_asprintf( &ret, "BitRocket %c.%c (%d)",
    113                       id[3], id[4], charToInt( id[5] ) * 10 + charToInt( id[6] ) );
    114         }
    115         else if( !memcmp( &id[1], "XX", 2 ) )
    116         {
    117             tr_asprintf( &ret, "Xtorrent %c.%c (%d)",
    118                       id[3], id[4], charToInt( id[5] ) * 10 + charToInt( id[6] ) );
    119         }
    120         else if( !memcmp( &id[1], "TS", 2 ) )
    121         {
    122             tr_asprintf( &ret, "TorrentStorm %c.%c.%c.%c",
    123                       id[3], id[4], id[5], id[6] );
    124         }
    125         else if( !memcmp( &id[1], "KT", 2 ) )
    126         {
    127             if( id[5] == 'R' )
    128             {
    129                 tr_asprintf( &ret, "KTorrent %c.%c RC %c",
    130                         id[3], id[4], id[6] );
    131             }
    132             else if( id[5] == 'D' )
    133             {
    134                 tr_asprintf( &ret, "KTorrent %c.%c Dev",
    135                         id[3], id[4] );
    136             }
    137             else
    138             {
    139                 tr_asprintf( &ret, "KTorrent %c.%c.%c",
    140                         id[3], id[4], id[5] );
    141             }
    142         }
    143         else if( !memcmp( &id[1], "lt", 2 ) )
    144         {
    145             tr_asprintf( &ret, "libTorrent %d.%d.%d.%d",
    146                       charToInt( id[3] ), charToInt( id[4] ),
    147                       charToInt( id[5] ), charToInt( id[6] ) );
    148         }
    149         else if( !memcmp( &id[1], "LT", 2 ) )
    150         {
    151             tr_asprintf( &ret, "libtorrent %d.%d.%d.%d",
    152                       charToInt( id[3] ), charToInt( id[4] ),
    153                       charToInt( id[5] ), charToInt( id[6] ) );
    154         }
    155         else if( !memcmp( &id[1], "LH", 2 ) )
    156         {
    157             tr_asprintf( &ret, "LH-ABC %c.%c.%c",
    158                       id[3], id[4], id[5] );
    159         }
    160         else if( !memcmp( &id[1], "TT", 2 ) )
    161         {
    162             tr_asprintf( &ret, "TuoTu %c.%c.%c",
    163                       id[3], id[4], id[5] );
    164         }
    165                 else if( !memcmp( &id[1], "ES", 2 ) )
    166         {
    167             tr_asprintf( &ret, "Electric Sheep %c.%c.%c",
    168                       id[3], id[4], id[5] );
    169         }
    170         else if( !memcmp( &id[1], "CD", 2 ) )
    171         {
    172             tr_asprintf( &ret, "Enhanced CTorrent %d.%d",
    173                       charToInt( id[3] ) * 10 + charToInt( id[4] ),
    174                       charToInt( id[5] ) * 10 + charToInt( id[6] ) );
    175         }
    176                 else if( !memcmp( &id[1], "CT", 2 ) )
    177         {
    178             tr_asprintf( &ret, "CTorrent %c.%c.%d",
    179                       id[3], id[4],
    180                       charToInt( id[5] ) * 10 + charToInt( id[6] ) );
    181         }
    182         else if( !memcmp( &id[1], "LP", 2 ) )
    183         {
    184             tr_asprintf( &ret, "Lphant %d.%c%c",
    185                       charToInt( id[3] ) * 10 + charToInt( id[4] ),
    186                       id[5], id[6] );
    187         }
    188         else if( !memcmp( &id[1], "AX", 2 ) )
    189         {
    190             tr_asprintf( &ret, "BitPump %d.%c%c",
    191                       charToInt( id[3] ) * 10 + charToInt( id[4] ),
    192                       id[5], id[6] );
    193         }
    194         else if( !memcmp( &id[1], "DE", 2 ) )
    195         {
    196             tr_asprintf( &ret, "Deluge %d.%d.%d",
    197                       charToInt( id[3] ), charToInt( id[4] ),
    198                       charToInt( id[5] ) );
    199         }
    200         else if( !memcmp( &id[1], "AG", 2 ) )
    201         {
    202             tr_asprintf( &ret, "Ares Galaxy %d.%d.%d",
    203                       charToInt( id[3] ), charToInt( id[4] ),
    204                       charToInt( id[5] ) );
    205         }
    206         else if( !memcmp( &id[1], "HL", 2 ) )
    207         {
    208             tr_asprintf( &ret, "Halite %d.%d.%d",
    209                       charToInt( id[3] ), charToInt( id[4] ),
    210                       charToInt( id[5] ) );
    211         }
    212         else if( !memcmp( &id[1], "AR", 2 ) )
    213         {
    214             tr_asprintf( &ret, "Arctic Torrent" );
    215         }
    216         else if( !memcmp( &id[1], "BG", 2 ) )
    217         {
    218             tr_asprintf( &ret, "BTG %c.%c.%c.%c",
    219                       id[3], id[4], id[5], id[6] );
    220         }
    221                 else if( !memcmp( &id[1], "BB", 2 ) )
    222         {
    223             tr_asprintf( &ret, "BitBuddy %c.%c%c%c",
    224                       id[3], id[4], id[5], id[6] );
    225         }
    226                 else if( !memcmp( &id[1], "qB", 2 ) )
    227         {
    228             tr_asprintf( &ret, "qBittorrent %d.%d.%d",
    229                       charToInt( id[3] ), charToInt( id[4] ),
    230                       charToInt( id[5] ) );
    231         }
    232         else if( !memcmp( &id[1], "BF", 2 ) )
    233         {
    234             tr_asprintf( &ret, "Bitflu (%d/%d/%02d)",
    235                       charToInt( id[6] ),
    236                       charToInt( id[4] ) * 10 + charToInt( id[5] ),
    237                       charToInt( id[3] ) );
    238         }
    239         else if( !memcmp( &id[1], "FT", 2 ) )
    240         {
    241             tr_asprintf( &ret, "FoxTorrent (%c%c%c%c)",
    242                       id[3], id[4], id[5], id[6] );
    243         }
    244         else if( !memcmp( &id[1], "GR", 2 ) )
    245         {
    246             tr_asprintf( &ret, "GetRight %c.%c.%c.%c",
    247                       id[3], id[4], id[5], id[6] );
    248         }
    249         else if( !memcmp( &id[1], "PD", 2 ) )
    250         {
    251             tr_asprintf( &ret, "Pando %c.%c.%c.%c",
    252                       id[3], id[4], id[5], id[6] );
    253         }
    254         else if( !memcmp( &id[1], "WY", 2 ) )
    255         {
    256             tr_asprintf( &ret, "Wyzo %c.%c.%c.%c",
    257                       id[3], id[4], id[5], id[6] );
    258         }
    259         else if( !memcmp( &id[1], "NX", 2 ) )
    260         {
    261             tr_asprintf( &ret, "Net Transport %d.%c.%c",
    262                       charToInt( id[3] ) * 10 + charToInt( id[4] ),
    263                       id[5], id[6] );
    264         }
    265         else if( !memcmp( &id[1], "LW", 2 ) )
    266         {
    267             tr_asprintf( &ret, "LimeWire" );
    268         }
    269        
    270         if( ret )
    271         {
    272             return ret;
    273         }
     155                three_digits( buf, buflen, "KTorrent", id+3 );
     156        }
     157
     158        else if( !memcmp( id+1, "AR", 2 ) ) four_digits( buf, buflen, "Ares", id+3 );
     159        else if( !memcmp( id+1, "AT", 2 ) ) four_digits( buf, buflen, "Artemis", id+3 );
     160        else if( !memcmp( id+1, "AV", 2 ) ) four_digits( buf, buflen, "Avicora", id+3 );
     161        else if( !memcmp( id+1, "AZ", 2 ) ) four_digits( buf, buflen, "Azureus", id+3 );
     162        else if( !memcmp( id+1, "BG", 2 ) ) four_digits( buf, buflen, "BTG", id+3 );
     163        else if( !memcmp( id+1, "BX", 2 ) ) four_digits( buf, buflen, "BittorrentX", id+3 );
     164        else if( !memcmp( id+1, "bk", 2 ) ) four_digits( buf, buflen, "BitKitten (libtorrent)", id+3 );
     165        else if( !memcmp( id+1, "BS", 2 ) ) four_digits( buf, buflen, "BTSlave", id+3 );
     166        else if( !memcmp( id+1, "BX", 2 ) ) four_digits( buf, buflen, "BittorrentX", id+3 );
     167        else if( !memcmp( id+1, "EB", 2 ) ) four_digits( buf, buflen, "EBit", id+3 );
     168        else if( !memcmp( id+1, "DE", 2 ) ) four_digits( buf, buflen, "Deluge", id+3 );
     169        else if( !memcmp( id+1, "DP", 2 ) ) four_digits( buf, buflen, "Propogate Data Client", id+3 );
     170        else if( !memcmp( id+1, "FC", 2 ) ) four_digits( buf, buflen, "FileCroc", id+3 );
     171        else if( !memcmp( id+1, "FT", 2 ) ) four_digits( buf, buflen, "FoxTorrent/RedSwoosh", id+3 );
     172        else if( !memcmp( id+1, "GR", 2 ) ) four_digits( buf, buflen, "GetRight", id+3 );
     173        else if( !memcmp( id+1, "HN", 2 ) ) four_digits( buf, buflen, "Hydranode", id+3 );
     174        else if( !memcmp( id+1, "LH", 2 ) ) four_digits( buf, buflen, "LH-ABC", id+3 );
     175        else if( !memcmp( id+1, "NX", 2 ) ) four_digits( buf, buflen, "Net Transport", id+3 );
     176        else if( !memcmp( id+1, "MO", 2 ) ) four_digits( buf, buflen, "MonoTorrent", id+3 );
     177        else if( !memcmp( id+1, "MR", 2 ) ) four_digits( buf, buflen, "Miro", id+3 );
     178        else if( !memcmp( id+1, "MT", 2 ) ) four_digits( buf, buflen, "Moonlight", id+3 );
     179        else if( !memcmp( id+1, "PD", 2 ) ) four_digits( buf, buflen, "Pando", id+3 );
     180        else if( !memcmp( id+1, "RT", 2 ) ) four_digits( buf, buflen, "Retriever", id+3 );
     181        else if( !memcmp( id+1, "SS", 2 ) ) four_digits( buf, buflen, "SwarmScope", id+3 );
     182        else if( !memcmp( id+1, "SZ", 2 ) ) four_digits( buf, buflen, "Shareaza", id+3 );
     183        else if( !memcmp( id+1, "S~", 2 ) ) four_digits( buf, buflen, "Shareaza", id+3 );
     184        else if( !memcmp( id+1, "st", 2 ) ) four_digits( buf, buflen, "SharkTorrent", id+3 );
     185        else if( !memcmp( id+1, "TS", 2 ) ) four_digits( buf, buflen, "TorrentStorm", id+3 );
     186        else if( !memcmp( id+1, "UL", 2 ) ) four_digits( buf, buflen, "uLeecher!", id+3 );
     187        else if( !memcmp( id+1, "VG", 2 ) ) four_digits( buf, buflen, "Vagaa", id+3 );
     188        else if( !memcmp( id+1, "WT", 2 ) ) four_digits( buf, buflen, "BitLet", id+3 );
     189        else if( !memcmp( id+1, "WY", 2 ) ) four_digits( buf, buflen, "Wyzo", id+3 );
     190        else if( !memcmp( id+1, "XL", 2 ) ) four_digits( buf, buflen, "Xunlei", id+3 );
     191        else if( !memcmp( id+1, "XT", 2 ) ) four_digits( buf, buflen, "XanTorrent", id+3 );
     192        else if( !memcmp( id+1, "ZT", 2 ) ) four_digits( buf, buflen, "ZipTorrent", id+3 );
     193
     194        else if( !memcmp( id+1, "AG", 2 ) ) three_digits( buf, buflen, "Ares", id+3 );
     195        else if( !memcmp( id+1, "A~", 2 ) ) three_digits( buf, buflen, "Ares", id+3 );
     196        else if( !memcmp( id+1, "ES", 2 ) ) three_digits( buf, buflen, "Electric Sheep", id+3 );
     197        else if( !memcmp( id+1, "HL", 2 ) ) three_digits( buf, buflen, "Halite", id+3 );
     198        else if( !memcmp( id+1, "LT", 2 ) ) three_digits( buf, buflen, "libtorrent (Rasterbar)", id+3 );
     199        else if( !memcmp( id+1, "lt", 2 ) ) three_digits( buf, buflen, "libTorrent (Rakshasa)", id+3 );
     200        else if( !memcmp( id+1, "MP", 2 ) ) three_digits( buf, buflen, "MooPolice", id+3 );
     201        else if( !memcmp( id+1, "TT", 2 ) ) three_digits( buf, buflen, "TuoTu", id+3 );
     202        else if( !memcmp( id+1, "qB", 2 ) ) three_digits( buf, buflen, "qBittorrent", id+3 );
     203
     204        else if( !memcmp( id+1, "AX", 2 ) ) two_major_two_minor( buf, buflen, "BitPump", id+3 );
     205        else if( !memcmp( id+1, "BC", 2 ) ) two_major_two_minor( buf, buflen, "BitComet", id+3 );
     206        else if( !memcmp( id+1, "CD", 2 ) ) two_major_two_minor( buf, buflen, "Enhanced CTorrent", id+3 );
     207        else if( !memcmp( id+1, "FG", 2 ) ) two_major_two_minor( buf, buflen, "FlashGet", id+3 );
     208        else if( !memcmp( id+1, "LP", 2 ) ) two_major_two_minor( buf, buflen, "Lphant", id+3 );
     209
     210        else if( !memcmp( id+1, "BF", 2 ) ) no_version( buf, buflen, "BitFlu" );
     211        else if( !memcmp( id+1, "LW", 2 ) ) no_version( buf, buflen, "LimeWire" );
     212
     213        else if( !memcmp( id+1, "BB", 2 ) )
     214        {
     215            snprintf( buf, buflen, "BitBuddy %c.%c%c%c", id[3], id[4], id[5], id[6] );
     216        }
     217        else if( !memcmp( id+1, "BR", 2 ) )
     218        {
     219            snprintf( buf, buflen, "BitRocket %c.%c (%c%c)", id[3], id[4], id[5], id[6] );
     220        }
     221        else if( !memcmp( id+1, "CT", 2 ) )
     222        {
     223            snprintf( buf, buflen, "CTorrent %d.%d.%02d", charint(id[3]), charint(id[4]), strint(id+5,2) );
     224        }
     225        else if( !memcmp( id+1, "XX", 2 ) )
     226        {
     227            snprintf( buf, buflen, "Xtorrent %d.%d (%d)", charint(id[3]), charint(id[4]), strint(id+5,2) );
     228        }
     229        else if( !memcmp( id+1, "BOW", 3 ) )
     230        {
     231                 if( !memcmp( &id[4], "A0B", 3 ) ) snprintf( buf, buflen, "Bits on Wheels 1.0.5" );
     232            else if( !memcmp( &id[4], "A0C", 3 ) ) snprintf( buf, buflen, "Bits on Wheels 1.0.6" );
     233            else                                   snprintf( buf, buflen, "Bits on Wheels %c.%c.%c", id[4], id[5], id[5] );
     234        }
     235
     236        if( *buf )
     237            return;
    274238    }
    275239   
    276     /* Tornado-style */
     240    /* Shad0w-style */
    277241    if( !memcmp( &id[4], "----", 4 ) || !memcmp( &id[4], "--0", 3 ) )
    278242    {
    279         if( id[0] == 'T' )
    280         {
    281             tr_asprintf( &ret, "BitTornado %d.%d.%d", charToInt( id[1] ),
    282                         charToInt( id[2] ), charToInt( id[3] ) );
    283         }
    284         else if( id[0] == 'A' )
    285         {
    286             tr_asprintf( &ret, "ABC %d.%d.%d", charToInt( id[1] ),
    287                         charToInt( id[2] ), charToInt( id[3] ) );
    288         }
    289         else if( id[0] == 'R' )
    290         {
    291             tr_asprintf( &ret, "Tribler %c.%c", id[1], id[2] );
    292         }
    293         else if( id[0] == 'S' )
    294         {
    295             tr_asprintf( &ret, "Shad0w's Client %d.%d.%d", charToInt( id[1] ),
    296                         charToInt( id[2] ), charToInt( id[3] ) );
    297         }
    298        
    299         if( ret )
    300         {
    301             return ret;
    302         }
    303     }
    304    
    305     /* Different formatting per client */
    306     if( id[0] == 'M' && id[2] == '-' && id[7] == '-' )
    307     {
    308         if( id[4] == '-' && id[6] == '-' )
    309         {
    310             tr_asprintf( &ret, "BitTorrent %c.%c.%c", id[1], id[3], id[5] );
    311         }
    312         else if( id[5] == '-' )
    313         {
    314             tr_asprintf( &ret, "BitTorrent %c.%c%c.%c", id[1], id[3], id[4], id[6] );
    315         }
    316        
    317         if( ret )
    318         {
    319             return ret;
    320         }
    321     }
    322     if( id[0] == 'Q' && id[2] == '-' && id[7] == '-' )
    323     {
    324         if( id[4] == '-' && id[6] == '-' )
    325         {
    326             tr_asprintf( &ret, "Queen Bee %c.%c.%c", id[1], id[3], id[5] );
    327         }
    328         else if( id[5] == '-' )
    329         {
    330             tr_asprintf( &ret, "Queen Bee %c.%c%c.%c", id[1], id[3], id[4], id[6] );
    331         }
    332        
    333         if( ret )
    334         {
    335             return ret;
    336         }
    337     }
    338    
    339     /* All versions of each client are formatted the same */
    340     if( !memcmp( id, "S3", 2 ) && id[2] == '-' && id[4] == '-' && id[6] == '-' )
    341     {
    342         tr_asprintf( &ret, "Amazon S3 %c.%c.%c", id[3], id[5], id[7] );
    343     }
    344     else if( !memcmp( id, "exbc", 4 ) )
    345     {
    346         tr_asprintf( &ret, "%s %d.%02d",
    347                     !memcmp( &id[6], "LORD", 4 ) ? "BitLord" : "BitComet",
    348                     id[4], id[5] );
     243        switch( *id ) {
     244            case 'A': three_digits( buf, buflen, "ABC", id+1 ); break;
     245            case 'O': three_digits( buf, buflen, "Osprey", id+1 ); break;
     246            case 'Q': three_digits( buf, buflen, "BTQueue", id+1 ); break;
     247            case 'R': three_digits( buf, buflen, "Tribler", id+1 ); break;
     248            case 'S': three_digits( buf, buflen, "Shad0w", id+1 ); break;
     249            case 'T': three_digits( buf, buflen, "BitTornado", id+1 ); break;
     250            default: break;
     251        }
     252        if( *buf ) return;
     253    }
     254
     255    /* Mainline */
     256    if( isMainlineStyle( id ) )
     257    {
     258        if( *id=='M' ) mainline_style( buf, buflen, "BitTorrent", id );
     259        if( *id=='Q' ) mainline_style( buf, buflen, "Queen Bee", id );
     260        if( *buf ) return;
     261    }
     262
     263    /* Clients with no version */
     264         if( !memcmp( id, "AZ2500BT", 8 ) )  no_version( buf, buflen, "BitTyrant (Azureus Mod)" );
     265    else if( !memcmp( id, "LIME", 4 ) )      no_version( buf, buflen, "Limewire" );
     266    else if( !memcmp( id, "martini", 7 ) )   no_version( buf, buflen, "Martini Man" );
     267    else if( !memcmp( id, "Pando", 5 ) )     no_version( buf, buflen, "Pando" );
     268    else if( !memcmp( id, "a00---0", 7 ) )   no_version( buf, buflen, "Swarmy" );
     269    else if( !memcmp( id, "a02---0", 7 ) )   no_version( buf, buflen, "Swarmy" );
     270    else if( !memcmp( id, "-G3", 3 ) )       no_version( buf, buflen, "G3 Torrent" );
     271    else if( !memcmp( id, "10-------", 9 ) ) no_version( buf, buflen, "JVtorrent" );
     272    else if( !memcmp( id, "346-", 4 ) )      no_version( buf, buflen, "TorrentTopia" );
     273    else if( !memcmp( id, "eX", 2 ) )        no_version( buf, buflen, "eXeem" );
     274   
     275    /* Everything else */
     276    else if( !memcmp( id, "S3", 2 ) && id[2] == '-' && id[4] == '-' && id[6] == '-' )
     277    {
     278        snprintf( buf, buflen, "Amazon S3 %c.%c.%c", id[3], id[5], id[7] );
    349279    }
    350280    else if( !memcmp( id, "OP", 2 ) )
    351281    {
    352         tr_asprintf( &ret, "Opera (%c%c%c%c)", id[2], id[3], id[4], id[5] );
     282        snprintf( buf, buflen, "Opera (Build %c%c%c%c)", id[2], id[3], id[4], id[5] );
    353283    }
    354284    else if( !memcmp( id, "-ML", 3 ) )
    355285    {
    356         tr_asprintf( &ret, "MLDonkey %c%c%c%c%c",
    357                   id[3], id[4], id[5], id[6], id[7] );
    358     }
    359     else if( !memcmp( id, "AZ", 2 ) && !memcmp( &id[6], "BT", 2 ) )
    360     {
    361         tr_asprintf( &ret, "BitTyrant %c.%c.%c.%c",
    362                     id[2], id[3], id[4], id[5] );
    363     }
    364     else if( !memcmp( id, "-FG", 3 ) )
    365     {
    366         tr_asprintf( &ret, "FlashGet %d.%c%c",
    367                   charToInt( id[3] ) * 10 + charToInt( id[4] ),
    368                       id[5], id[6] );
     286        snprintf( buf, buflen, "MLDonkey %c%c%c%c%c", id[3], id[4], id[5], id[6], id[7] );
    369287    }
    370288    else if( !memcmp( id, "DNA", 3 ) )
    371289    {
    372         tr_asprintf( &ret, "BitTorrent DNA %d.%d.%d", charToInt( id[3] ) * 10 + charToInt( id[4] ),
    373                     charToInt( id[5] ) * 10 + charToInt( id[6] ), charToInt( id[7] ) * 10 + charToInt( id[8] ) );
     290        snprintf( buf, buflen, "BitTorrent DNA %d.%d.%d", strint(id+3,2),
     291                                                          strint(id+5,2),
     292                                                          strint(id+7,2) );
    374293    }
    375294    else if( !memcmp( id, "Plus", 4 ) )
    376295    {
    377         tr_asprintf( &ret, "Plus! v2 %c.%c%c", id[4], id[5], id[6] );
     296        snprintf( buf, buflen, "Plus! v2 %c.%c%c", id[4], id[5], id[6] );
    378297    }
    379298    else if( !memcmp( id, "XBT", 3 ) )
    380299    {
    381         tr_asprintf( &ret, "XBT Client %c%c%c%s", id[3], id[4], id[5],
    382                     id[6] == 'd' ? " (debug)" : "" );
     300        snprintf( buf, buflen, "XBT Client %c.%c.%c %s", id[3], id[4], id[5], getMnemonic(id[6]) );
    383301    }
    384302    else if( !memcmp( id, "Mbrst", 5 ) )
    385303    {
    386         tr_asprintf( &ret, "burst! %c.%c.%c", id[5], id[7], id[9] );
     304        snprintf( buf, buflen, "burst! %c.%c.%c", id[5], id[7], id[9] );
    387305    }
    388306    else if( !memcmp( id, "btpd", 4 ) )
    389307    {
    390         tr_asprintf( &ret, "BT Protocol Daemon %c%c%c", id[5], id[6], id[7] );
    391     }
    392     else if( id[0] == 'Q' && !memcmp( &id[4], "--", 2 ) )
    393     {
    394         tr_asprintf( &ret, "BTQueue %d.%d.%d", charToInt( id[1] ),
    395                     charToInt( id[2] ), charToInt( id[3] ) );
     308        snprintf( buf, buflen, "BT Protocol Daemon %c%c%c", id[5], id[6], id[7] );
    396309    }
    397310    else if( !memcmp( id, "BLZ", 3 ) )
    398311    {
    399         tr_asprintf( &ret, "Blizzard Downloader %d.%d", id[3] + 1, id[4] );
    400     }
    401     else if( !memcmp( id, "-WT-", 4 ) )
    402     {
    403         tr_asprintf( &ret, "BitLet" );
    404     }
    405     else if( !memcmp( id, "LIME", 4 ) )
    406     {
    407         tr_asprintf( &ret, "LimeWire" );
    408     }
    409     else if( !memcmp( id, "-G3", 3 ) )
    410     {
    411         tr_asprintf( &ret, "G3 Torrent" );
    412     }
    413     else if( !memcmp( id, "10-------", 9 ) )
    414     {
    415         tr_asprintf( &ret, "JVtorrent" );
    416     }
    417     else if( !memcmp( id, "346-", 4 ) )
    418     {
    419         tr_asprintf( &ret, "TorrentTopia" );
    420     }
    421     else if( !memcmp( id, "eX", 2 ) )
    422     {
    423         tr_asprintf( &ret, "eXeem" );
     312        snprintf( buf, buflen, "Blizzard Downloader %d.%d", id[3]+1, id[4] );
    424313    }
    425314    else if( '\0' == id[0] && !memcmp( &id[1], "BS", 2 ) )
    426315    {
    427         tr_asprintf( &ret, "BitSpirit %u", ( id[1] == 0 ? 1 : id[1] ) );
     316        snprintf( buf, buflen, "BitSpirit %u", ( id[1] == 0 ? 1 : id[1] ) );
    428317    }
    429318
    430319    /* No match */
    431     if( !ret )
     320    if( !*buf )
    432321    {
    433322        if( isprint( id[0] ) && isprint( id[1] ) && isprint( id[2] ) &&
    434323            isprint( id[3] ) && isprint( id[4] ) && isprint( id[5] ) &&
    435324            isprint( id[6] ) && isprint( id[7] ) )
    436         {
    437             tr_asprintf( &ret, "%c%c%c%c%c%c%c%c",
    438                   id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7] );
    439         }
     325                snprintf( buf, buflen, "%c%c%c%c%c%c%c%c",
     326                          id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7] );
    440327        else
    441         {
    442             tr_asprintf( &ret, "0x%02x%02x%02x%02x%02x%02x%02x%02x",
    443                   id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7] );
    444         }
    445     }
    446 
    447     return ret;
    448 }
     328                snprintf( buf, buflen, "0x%02x%02x%02x%02x%02x%02x%02x%02x",
     329                          id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7] );
     330    }
     331}
Note: See TracChangeset for help on using the changeset viewer.