source: trunk/libtransmission/clients.c @ 2391

Last change on this file since 2391 was 2391, checked in by joshe, 14 years ago

Include trcompat.h for asprintf()
Don't mix function and non function pointers without casting.
Replace a couple bzero()s with memset()s.
Remove a stray ;
Include a missing header.

  • Property svn:keywords set to Date Rev Author Id
File size: 12.8 KB
Line 
1/******************************************************************************
2 * $Id: clients.c 2391 2007-07-18 17:25:42Z joshe $
3 *
4 * Copyright (c) 2005 Transmission authors and contributors
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *****************************************************************************/
24
25#include <ctype.h> /* isprint */
26
27#include "transmission.h"
28#include "trcompat.h"
29
30static int charToInt( char character );
31
32static 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
45char * tr_clientForId( uint8_t * id )
46{
47    char * ret = NULL;
48   
49    /* Azureus-style */
50    if( id[0] == '-' && id[7] == '-' )
51    {
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                asprintf( &ret, "Transmission 0.%d",
58                        charToInt( id[5] ) * 10 + charToInt( id[6] ) );
59            }
60            else
61            {
62                asprintf( &ret, "Transmission %d.%c%c%s",
63                        charToInt( id[3] ), id[4], id[5],
64                        id[6] == 'Z' ? " (dev)" : "" );
65            }
66        }
67        else if( !memcmp( &id[1], "AZ", 2 ) )
68        {
69            asprintf( &ret, "Azureus %c.%c.%c.%c",
70                      id[3], id[4], id[5], id[6] );
71        }
72        else if( !memcmp( &id[1], "UT", 2 ) )
73        {
74            asprintf( &ret, "\xc2\xb5Torrent %c.%d", id[3],
75                      charToInt( id[4] ) * 10 + charToInt( id[5] ) );
76        }
77        else if( !memcmp( &id[1], "BC", 2 ) )
78        {
79            asprintf( &ret, "BitComet %d.%c%c",
80                      charToInt( id[3] ) * 10 + charToInt( id[4] ),
81                      id[5], id[6] );
82        }
83        else if( !memcmp( &id[1], "SZ", 2 ) || !memcmp( &id[1], "S~", 2 ) )
84        {
85            asprintf( &ret, "Shareaza %c.%c.%c.%c",
86                      id[3], id[4], id[5], id[6] );
87        }
88        else if( !memcmp( &id[1], "BOW", 3 ) )
89        {
90            if( !memcmp( &id[4], "A0C", 3 ) )
91            {
92                asprintf( &ret, "Bits on Wheels 1.0.6" );
93            }
94            else if( !memcmp( &id[4], "A0B", 3 ) )
95            {
96                asprintf( &ret, "Bits on Wheels 1.0.5" );
97            }
98            else
99            {
100                asprintf( &ret, "Bits on Wheels (%c%c%c)",
101                        id[4], id[5], id[6] );
102            }
103        }
104        else if( !memcmp( &id[1], "BR", 2 ) )
105        {
106            asprintf( &ret, "BitRocket %c.%c (%d)",
107                      id[3], id[4], charToInt( id[5] ) * 10 + charToInt( id[6] ) );
108        }
109        else if( !memcmp( &id[1], "XX", 2 ) )
110        {
111            asprintf( &ret, "Xtorrent (%d)",
112                      charToInt( id[3] ) * 1000 + charToInt( id[4] ) * 100
113                      + charToInt( id[5] ) * 10 + charToInt( id[6] ) );
114        }
115        else if( !memcmp( &id[1], "TS", 2 ) )
116        {
117            asprintf( &ret, "TorrentStorm %c.%c.%c.%c",
118                      id[3], id[4], id[5], id[6] );
119        }
120        else if( !memcmp( &id[1], "KT", 2 ) )
121        {
122            if( id[5] == 'R' )
123            {
124                asprintf( &ret, "KTorrent %c.%c RC %c",
125                        id[3], id[4], id[6] );
126            }
127            else if( id[5] == 'D' )
128            {
129                asprintf( &ret, "KTorrent %c.%c Dev",
130                        id[3], id[4] );
131            }
132            else
133            {
134                asprintf( &ret, "KTorrent %c.%c.%c",
135                        id[3], id[4], id[5] );
136            }
137        }
138        else if( !memcmp( &id[1], "lt", 2 ) )
139        {
140            asprintf( &ret, "libTorrent %d.%d.%d.%d",
141                      charToInt( id[3] ), charToInt( id[4] ),
142                      charToInt( id[5] ), charToInt( id[6] ) );
143        }
144        else if( !memcmp( &id[1], "LT", 2 ) )
145        {
146            asprintf( &ret, "libtorrent %d.%d.%d.%d",
147                      charToInt( id[3] ), charToInt( id[4] ),
148                      charToInt( id[5] ), charToInt( id[6] ) );
149        }
150        else if( !memcmp( &id[1], "TT", 2 ) )
151        {
152            asprintf( &ret, "TuoTu %c.%c.%c",
153                      id[3], id[4], id[5] );
154        }
155                else if( !memcmp( &id[1], "ES", 2 ) )
156        {
157            asprintf( &ret, "Electric Sheep %c.%c.%c",
158                      id[3], id[4], id[5] );
159        }
160        else if( !memcmp( &id[1], "CD", 2 ) )
161        {
162            asprintf( &ret, "Enhanced CTorrent %d.%d",
163                      charToInt( id[3] ) * 10 + charToInt( id[4] ),
164                      charToInt( id[5] ) * 10 + charToInt( id[6] ) );
165        }
166                else if( !memcmp( &id[1], "CT", 2 ) )
167        {
168            asprintf( &ret, "CTorrent %c.%c.%d",
169                      id[3], id[4],
170                      charToInt( id[5] ) * 10 + charToInt( id[6] ) );
171        }
172        else if( !memcmp( &id[1], "LP", 2 ) )
173        {
174            asprintf( &ret, "Lphant %d.%c%c",
175                      charToInt( id[3] ) * 10 + charToInt( id[4] ),
176                      id[5], id[6] );
177        }
178        else if( !memcmp( &id[1], "AX", 2 ) )
179        {
180            asprintf( &ret, "BitPump %d.%c%c",
181                      charToInt( id[3] ) * 10 + charToInt( id[4] ),
182                      id[5], id[6] );
183        }
184        else if( !memcmp( &id[1], "DE", 2 ) )
185        {
186            asprintf( &ret, "Deluge %d.%d.%d",
187                      charToInt( id[3] ), charToInt( id[4] ),
188                      charToInt( id[5] ) );
189        }
190        else if( !memcmp( &id[1], "AG", 2 ) )
191        {
192            asprintf( &ret, "Ares Galaxy %d.%d.%d",
193                      charToInt( id[3] ), charToInt( id[4] ),
194                      charToInt( id[5] ) );
195        }
196        else if( !memcmp( &id[1], "AR", 2 ) )
197        {
198            asprintf( &ret, "Arctic Torrent" );
199        }
200        else if( !memcmp( &id[1], "BG", 2 ) )
201        {
202            asprintf( &ret, "BTG %c.%c.%c.%c",
203                      id[3], id[4], id[5], id[6] );
204        }
205                else if( !memcmp( &id[1], "BB", 2 ) )
206        {
207            asprintf( &ret, "BitBuddy %c.%c%c%c",
208                      id[3], id[4], id[5], id[6] );
209        }
210                else if( !memcmp( &id[1], "qB", 2 ) )
211        {
212            asprintf( &ret, "qBittorrent %d.%d.%d",
213                      charToInt( id[3] ), charToInt( id[4] ),
214                      charToInt( id[5] ) );
215        }
216        else if( !memcmp( &id[1], "BF", 2 ) )
217        {
218            asprintf( &ret, "Bitflu (%d/%d/%02d)",
219                      charToInt( id[6] ),
220                      charToInt( id[4] ) * 10 + charToInt( id[5] ),
221                      charToInt( id[3] ) );
222        }
223        else if( !memcmp( &id[1], "FT", 2 ) )
224        {
225            asprintf( &ret, "FoxTorrent (%c%c%c%c)",
226                      id[3], id[4], id[5], id[6] );
227        }
228        else if( !memcmp( &id[1], "GR", 2 ) )
229        {
230            asprintf( &ret, "GetRight (%c.%c.%c.%c)",
231                      id[3], id[4], id[5], id[6] );
232        }
233       
234        if( ret )
235        {
236            return ret;
237        }
238    }
239   
240    /* Tornado-style */
241    if( !memcmp( &id[4], "----", 4 ) || !memcmp( &id[4], "--0", 3 ) )
242    {
243        if( id[0] == 'T' )
244        {
245            asprintf( &ret, "BitTornado %d.%d.%d", charToInt( id[1] ),
246                        charToInt( id[2] ), charToInt( id[3] ) );
247        }
248        else if( id[0] == 'A' )
249        {
250            asprintf( &ret, "ABC %d.%d.%d", charToInt( id[1] ),
251                        charToInt( id[2] ), charToInt( id[3] ) );
252        }
253        else if( id[0] == 'R' )
254        {
255            asprintf( &ret, "Tribler %c.%c", id[1], id[2] );
256        }
257        else if( id[0] == 'S' )
258        {
259            asprintf( &ret, "Shad0w's Client %d.%d.%d", charToInt( id[1] ),
260                        charToInt( id[2] ), charToInt( id[3] ) );
261        }
262       
263        if( ret )
264        {
265            return ret;
266        }
267    }
268   
269    /* Different formatting per client */
270    if( id[0] == 'M' && id[2] == '-' && id[7] == '-' )
271    {
272        if( id[4] == '-' && id[6] == '-' )
273        {
274            asprintf( &ret, "BitTorrent %c.%c.%c", id[1], id[3], id[5] );
275        }
276        else if( id[5] == '-' )
277        {
278            asprintf( &ret, "BitTorrent %c.%c%c.%c", id[1], id[3], id[4], id[6] );
279        }
280       
281        if( ret )
282        {
283            return ret;
284        }
285    }
286    if( id[0] == 'Q' && id[2] == '-' && id[7] == '-' )
287    {
288        if( id[4] == '-' && id[6] == '-' )
289        {
290            asprintf( &ret, "Queen Bee %c.%c.%c", id[1], id[3], id[5] );
291        }
292        else if( id[5] == '-' )
293        {
294            asprintf( &ret, "Queen Bee %c.%c%c.%c", id[1], id[3], id[4], id[6] );
295        }
296       
297        if( ret )
298        {
299            return ret;
300        }
301    }
302   
303    /* All versions of each client are formatted the same */
304    if( !memcmp( id, "exbc", 4 ) )
305    {
306        asprintf( &ret, "%s %d.%02d",
307                    !memcmp( &id[6], "LORD", 4 ) ? "BitLord" : "BitComet",
308                    id[4], id[5] );
309    }
310    else if( !memcmp( id, "OP", 2 ) )
311    {
312        asprintf( &ret, "Opera (%c%c%c%c)", id[2], id[3], id[4], id[5] );
313    }
314    else if( !memcmp( id, "-ML", 3 ) )
315    {
316        asprintf( &ret, "MLDonkey %c%c%c%c%c",
317                  id[3], id[4], id[5], id[6], id[7] );
318    }
319    else if( !memcmp( id, "AZ", 2 ) && !memcmp( &id[6], "BT", 2 ) )
320    {
321        asprintf( &ret, "BitTyrant %c.%c.%c.%c",
322                    id[2], id[3], id[4], id[5] );
323    }
324    else if( !memcmp( id, "-FG", 3 ) )
325    {
326        asprintf( &ret, "FlashGet %d.%c%c",
327                  charToInt( id[3] ) * 10 + charToInt( id[4] ),
328                      id[5], id[6] );
329    }
330    else if( !memcmp( id, "Plus", 4 ) )
331    {
332        asprintf( &ret, "Plus! v2 %c.%c%c", id[4], id[5], id[6] );
333    }
334    else if( !memcmp( id, "XBT", 3 ) )
335    {
336        asprintf( &ret, "XBT Client %c%c%c%s", id[3], id[4], id[5],
337                    id[6] == 'd' ? " (debug)" : "" );
338    }
339    else if( !memcmp( id, "Mbrst", 5 ) )
340    {
341        asprintf( &ret, "burst! %c.%c.%c", id[5], id[7], id[9] );
342    }
343    else if( !memcmp( id, "btpd", 4 ) )
344    {
345        asprintf( &ret, "BT Protocol Daemon %c%c%c", id[5], id[6], id[7] );
346    }
347    else if( id[0] == 'Q' && !memcmp( &id[4], "--", 2 ) )
348    {
349        asprintf( &ret, "BTQueue %d.%d.%d", charToInt( id[1] ),
350                    charToInt( id[2] ), charToInt( id[3] ) );
351    }
352    else if( !memcmp( id, "BLZ", 3 ) )
353    {
354        asprintf( &ret, "Blizzard Downloader %d.%d", id[3] + 1, id[4] );
355    }
356    else if( !memcmp( id, "LIME", 4 ) )
357    {
358        asprintf( &ret, "Limewire" );
359    }
360    else if( !memcmp( id, "-G3", 3 ) )
361    {
362        asprintf( &ret, "G3 Torrent" );
363    }
364    else if( !memcmp( id, "10-------", 9 ) )
365    {
366        asprintf( &ret, "JVtorrent" );
367    }
368    else if( !memcmp( id, "346-", 4 ) )
369    {
370        asprintf( &ret, "TorrentTopia" );
371    }
372    else if( !memcmp( id, "eX", 2 ) )
373    {
374        asprintf( &ret, "eXeem" );
375    }
376    else if( '\0' == id[0] && 'B' == id[2] && 'S' == id[3] )
377    {
378        asprintf( &ret, "BitSpirit v%u", ( 0 == id[1] ? 1 : id[1] ) );
379    }
380
381    /* No match */
382    if( !ret )
383    {
384        if( isprint( id[0] ) && isprint( id[1] ) && isprint( id[2] ) &&
385            isprint( id[3] ) && isprint( id[4] ) && isprint( id[5] ) &&
386            isprint( id[6] ) && isprint( id[7] ) )
387        {
388            asprintf( &ret, "unknown client (%c%c%c%c%c%c%c%c)",
389                  id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7] );
390        }
391        else
392        {
393            asprintf( &ret, "unknown client (0x%02x%02x%02x%02x%02x%02x%02x%02x)",
394                  id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7] );
395        }
396    }
397
398    return ret;
399}
Note: See TracBrowser for help on using the repository browser.