Changeset 11048


Ignore:
Timestamp:
Jul 24, 2010, 12:30:16 PM (12 years ago)
Author:
charles
Message:

(trunk daemon) #3352 "move pieces and trackers out of transmission-remote --info" -- applied Longinus00's patch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/daemon/remote.c

    r11010 r11048  
    179179}
    180180
    181 enum { TAG_SESSION, TAG_STATS, TAG_LIST, TAG_DETAILS, TAG_FILES, TAG_PEERS, TAG_PORTTEST, TAG_TORRENT_ADD };
     181enum
     182{
     183    TAG_SESSION,
     184    TAG_STATS,
     185    TAG_DETAILS,
     186    TAG_FILES,
     187    TAG_LIST,
     188    TAG_PEERS,
     189    TAG_PIECES,
     190    TAG_PORTTEST,
     191    TAG_TORRENT_ADD,
     192    TAG_TRACKERS
     193};
    182194
    183195static const char*
     
    227239    { 911, "encryption-preferred",   "Prefer encrypted peer connections", "ep", 0, NULL },
    228240    { 912, "encryption-tolerated",   "Prefer unencrypted peer connections", "et", 0, NULL },
    229     { 'f', "files",                  "List the current torrent(s)' files", "f",  0, NULL },
     241    { 940, "files",                  "List the current torrent(s)' files", "f",  0, NULL },
    230242    { 'g', "get",                    "Mark files for download", "g",  1, "<files>" },
    231243    { 'G', "no-get",                 "Mark files for not downloading", "G",  1, "<files>" },
    232244    { 'i', "info",                   "Show the current torrent(s)' details", "i",  0, NULL },
     245    { 940, "info-files",             "List the current torrent(s)' files", "if",  0, NULL },
     246    { 941, "info-peers",             "List the current torrent(s)' peers", "ip",  0, NULL },
     247    { 942, "info-pieces",            "List the current torrent(s)' pieces", "ic",  0, NULL },
     248    { 943, "info-trackers",          "List the current torrent(s)' trackers", "it",  0, NULL },
    233249    { 920, "session-info",           "Show the session's details", "si", 0, NULL },
    234250    { 921, "session-stats",          "Show the session's statistics", "st", 0, NULL },
     
    281297    { 'y', "lpd",                    "Enable local peer discovery (LPD)", "y",  0, NULL },
    282298    { 'Y', "no-lpd",                 "Disable local peer discovery (LPD)", "Y",  0, NULL },
    283     { 940, "peer-info",              "List the current torrent(s)' peers", "pi",  0, NULL },
     299    { 941, "peer-info",              "List the current torrent(s)' peers", "pi",  0, NULL },
    284300    {   0, NULL,                     NULL, NULL, 0, NULL }
    285301};
     
    399415            return MODE_TORRENT_SET_LOCATION | MODE_TORRENT_ADD;
    400416
    401         case 'f': /* files */
    402417        case 'i': /* info */
    403418        case 'l': /* list all torrents */
    404         case 940: /* peer-info */
     419        case 940: /* info-files */
     420        case 941: /* info-peer */
     421        case 942: /* info-pieces */
     422        case 943: /* info-tracker */
    405423            return MODE_TORRENT_GET;
    406424
     
    646664    "status",
    647665    "totalSize",
    648     "trackerStats",
    649666    "uploadedEver",
    650667    "uploadLimit",
    651668    "uploadLimited",
    652     "pieces",
    653669    "webseeds",
    654670    "webseedsSendingToUs"
     
    788804            tr_benc *    t = tr_bencListChild( torrents, ti );
    789805            tr_benc *    l;
    790             const uint8_t * raw;
    791             size_t       rawlen;
    792806            const char * str;
    793807            char         buf[512];
     
    942956            printf( "\n" );
    943957
    944             printf( "TRACKERS\n" );
    945 
    946             if( tr_bencDictFindList( t, "trackerStats", &l ) )
    947             {
    948                 tr_benc * t;
    949                 for( i=0; (( t = tr_bencListChild( l, i ))); ++i )
    950                 {
    951                     int64_t downloadCount;
    952                     tr_bool hasAnnounced;
    953                     tr_bool hasScraped;
    954                     const char * host;
    955                     tr_bool isBackup;
    956                     int64_t lastAnnouncePeerCount;
    957                     const char * lastAnnounceResult;
    958                     int64_t lastAnnounceStartTime;
    959                     tr_bool lastAnnounceSucceeded;
    960                     int64_t lastAnnounceTime;
    961                     tr_bool lastAnnounceTimedOut;
    962                     const char * lastScrapeResult;
    963                     tr_bool lastScrapeSucceeded;
    964                     int64_t lastScrapeStartTime;
    965                     int64_t lastScrapeTime;
    966                     tr_bool lastScrapeTimedOut;
    967                     int64_t leecherCount;
    968                     int64_t nextAnnounceTime;
    969                     int64_t nextScrapeTime;
    970                     int64_t seederCount;
    971                     int64_t tier;
    972                     int64_t announceState;
    973                     int64_t scrapeState;
    974 
    975                     if( tr_bencDictFindInt ( t, "downloadCount", &downloadCount ) &&
    976                         tr_bencDictFindBool( t, "hasAnnounced", &hasAnnounced ) &&
    977                         tr_bencDictFindBool( t, "hasScraped", &hasScraped ) &&
    978                         tr_bencDictFindStr ( t, "host", &host ) &&
    979                         tr_bencDictFindBool( t, "isBackup", &isBackup ) &&
    980                         tr_bencDictFindInt ( t, "announceState", &announceState ) &&
    981                         tr_bencDictFindInt ( t, "scrapeState", &scrapeState ) &&
    982                         tr_bencDictFindInt ( t, "lastAnnouncePeerCount", &lastAnnouncePeerCount ) &&
    983                         tr_bencDictFindStr ( t, "lastAnnounceResult", &lastAnnounceResult ) &&
    984                         tr_bencDictFindInt ( t, "lastAnnounceStartTime", &lastAnnounceStartTime ) &&
    985                         tr_bencDictFindBool( t, "lastAnnounceSucceeded", &lastAnnounceSucceeded ) &&
    986                         tr_bencDictFindInt ( t, "lastAnnounceTime", &lastAnnounceTime ) &&
    987                         tr_bencDictFindBool( t, "lastAnnounceTimedOut", &lastAnnounceTimedOut ) &&
    988                         tr_bencDictFindStr ( t, "lastScrapeResult", &lastScrapeResult ) &&
    989                         tr_bencDictFindInt ( t, "lastScrapeStartTime", &lastScrapeStartTime ) &&
    990                         tr_bencDictFindBool( t, "lastScrapeSucceeded", &lastScrapeSucceeded ) &&
    991                         tr_bencDictFindInt ( t, "lastScrapeTime", &lastScrapeTime ) &&
    992                         tr_bencDictFindBool( t, "lastScrapeTimedOut", &lastScrapeTimedOut ) &&
    993                         tr_bencDictFindInt ( t, "leecherCount", &leecherCount ) &&
    994                         tr_bencDictFindInt ( t, "nextAnnounceTime", &nextAnnounceTime ) &&
    995                         tr_bencDictFindInt ( t, "nextScrapeTime", &nextScrapeTime ) &&
    996                         tr_bencDictFindInt ( t, "seederCount", &seederCount ) &&
    997                         tr_bencDictFindInt ( t, "tier", &tier ) )
    998                     {
    999                         const time_t now = time( NULL );
    1000 
    1001                         printf( "\n" );
    1002                         printf( "  Tracker #%d: %s\n", (int)(i+1), host );
    1003                         if( isBackup )
    1004                           printf( "  Backup on tier #%d\n", (int)tier );
    1005                         else
    1006                           printf( "  Active in tier #%d\n", (int)tier );
    1007 
    1008                         if( !isBackup )
    1009                         {
    1010                             if( hasAnnounced )
    1011                             {
    1012                                 tr_strltime( buf, now - lastAnnounceTime, sizeof( buf ) );
    1013                                 if( lastAnnounceSucceeded )
    1014                                     printf( "  Got a list of %'d peers %s ago\n",
    1015                                             (int)lastAnnouncePeerCount, buf );
    1016                                 else if( lastAnnounceTimedOut )
    1017                                     printf( "  Peer list request timed out; will retry\n" );
    1018                                 else
    1019                                     printf( "  Got an error \"%s\" %s ago\n",
    1020                                             lastAnnounceResult, buf );
    1021                             }
    1022 
    1023                             switch( announceState )
    1024                             {
    1025                                 case TR_TRACKER_INACTIVE:
    1026                                     printf( "  No updates scheduled\n" );
    1027                                     break;
    1028                                 case TR_TRACKER_WAITING:
    1029                                     tr_strltime( buf, nextAnnounceTime - now, sizeof( buf ) );
    1030                                     printf( "  Asking for more peers in %s\n", buf );
    1031                                     break;
    1032                                 case TR_TRACKER_QUEUED:
    1033                                     printf( "  Queued to ask for more peers\n" );
    1034                                     break;
    1035                                 case TR_TRACKER_ACTIVE:
    1036                                     tr_strltime( buf, now - lastAnnounceStartTime, sizeof( buf ) );
    1037                                     printf( "  Asking for more peers now... %s\n", buf );
    1038                                     break;
    1039                             }
    1040 
    1041                             if( hasScraped )
    1042                             {
    1043                                 tr_strltime( buf, now - lastScrapeTime, sizeof( buf ) );
    1044                                 if( lastScrapeSucceeded )
    1045                                     printf( "  Tracker had %'d seeders and %'d leechers %s ago\n",
    1046                                             (int)seederCount, (int)leecherCount, buf );
    1047                                 else if( lastScrapeTimedOut )
    1048                                     printf( "  Tracker scrape timed out; will retry\n" );
    1049                                 else
    1050                                     printf( "  Got a scrape error \"%s\" %s ago\n",
    1051                                             lastScrapeResult, buf );
    1052                             }
    1053 
    1054                             switch( scrapeState )
    1055                             {
    1056                                 case TR_TRACKER_INACTIVE:
    1057                                     break;
    1058                                 case TR_TRACKER_WAITING:
    1059                                     tr_strltime( buf, nextScrapeTime - now, sizeof( buf ) );
    1060                                     printf( "  Asking for peer counts in %s\n", buf );
    1061                                     break;
    1062                                 case TR_TRACKER_QUEUED:
    1063                                     printf( "  Queued to ask for peer counts\n" );
    1064                                     break;
    1065                                 case TR_TRACKER_ACTIVE:
    1066                                     tr_strltime( buf, now - lastScrapeStartTime, sizeof( buf ) );
    1067                                     printf( "  Asking for peer counts now... %s\n", buf );
    1068                                     break;
    1069                             }
    1070                         }
    1071                     }
    1072                 }
    1073                 printf( "\n" );
    1074             }
    1075 
    1076958            printf( "ORIGINS\n" );
    1077959            if( tr_bencDictFindInt( t, "dateCreated", &i ) && i )
     
    11191001                        bandwidthPriorityNames[(i + 1) & 3]);
    11201002   
    1121             printf( "\n" );
    1122 
    1123             printf( "PIECES\n" );
    1124             if( tr_bencDictFindRaw( t, "pieces", &raw, &rawlen ) && tr_bencDictFindInt( t, "pieceCount", &j ) ) {
    1125                 int len;
    1126                 char * str = tr_base64_decode( raw, rawlen, &len );
    1127                 printf( "  " );
    1128                 for( i=k=0; k<len; ++k ) {
    1129                     int e;
    1130                     for( e=0; i<j && e<8; ++e, ++i )
    1131                         printf( "%c", str[k] & (1<<(7-e)) ? '1' : '0' );
    1132                     printf( " " );
    1133                     if( !(i%64) )
    1134                         printf( "\n  " );
    1135                 }
    1136                 tr_free( str );
    1137             }
    11381003            printf( "\n" );
    11391004        }
     
    12621127
    12631128static void
     1129printPiecesImpl( const uint8_t * raw, size_t rawlen, int64_t j )
     1130{
     1131    int i, k, len;
     1132    char * str = tr_base64_decode( raw, rawlen, &len );
     1133    printf( "  " );
     1134    for( i=k=0; k<len; ++k ) {
     1135        int e;
     1136        for( e=0; i<j && e<8; ++e, ++i )
     1137            printf( "%c", str[k] & (1<<(7-e)) ? '1' : '0' );
     1138        printf( " " );
     1139        if( !(i%64) )
     1140            printf( "\n  " );
     1141    }
     1142    printf( "\n" );
     1143    tr_free( str );
     1144}
     1145
     1146static void
     1147printPieces( tr_benc * top )
     1148{
     1149    tr_benc *args, *torrents;
     1150
     1151    if( tr_bencDictFindDict( top, "arguments", &args )
     1152      && tr_bencDictFindList( args, "torrents", &torrents ) )
     1153    {
     1154        int i, n;
     1155        for( i=0, n=tr_bencListSize( torrents ); i<n; ++i )
     1156        {
     1157            int64_t j;
     1158            const uint8_t * raw;
     1159            size_t       rawlen;
     1160            tr_benc * torrent = tr_bencListChild( torrents, i );
     1161            if( tr_bencDictFindRaw( torrent, "pieces", &raw, &rawlen ) &&
     1162                tr_bencDictFindInt( torrent, "pieceCount", &j ) ) {
     1163                printPiecesImpl( raw, rawlen, j );
     1164                if( i+1<n )
     1165                    printf( "\n" );
     1166            }
     1167        }
     1168    }
     1169}
     1170
     1171static void
    12641172printPortTest( tr_benc * top )
    12651173{
     
    13521260                total_up,
    13531261                total_down );
     1262    }
     1263}
     1264
     1265static void
     1266printTrackersImpl( tr_benc * trackerStats )
     1267{
     1268    int i;
     1269    char         buf[512];
     1270    tr_benc * t;
     1271
     1272    for( i=0; (( t = tr_bencListChild( trackerStats, i ))); ++i )
     1273    {
     1274        int64_t downloadCount;
     1275        tr_bool hasAnnounced;
     1276        tr_bool hasScraped;
     1277        const char * host;
     1278        tr_bool isBackup;
     1279        int64_t lastAnnouncePeerCount;
     1280        const char * lastAnnounceResult;
     1281        int64_t lastAnnounceStartTime;
     1282        tr_bool lastAnnounceSucceeded;
     1283        int64_t lastAnnounceTime;
     1284        tr_bool lastAnnounceTimedOut;
     1285        const char * lastScrapeResult;
     1286        tr_bool lastScrapeSucceeded;
     1287        int64_t lastScrapeStartTime;
     1288        int64_t lastScrapeTime;
     1289        tr_bool lastScrapeTimedOut;
     1290        int64_t leecherCount;
     1291        int64_t nextAnnounceTime;
     1292        int64_t nextScrapeTime;
     1293        int64_t seederCount;
     1294        int64_t tier;
     1295        int64_t announceState;
     1296        int64_t scrapeState;
     1297
     1298        if( tr_bencDictFindInt ( t, "downloadCount", &downloadCount ) &&
     1299            tr_bencDictFindBool( t, "hasAnnounced", &hasAnnounced ) &&
     1300            tr_bencDictFindBool( t, "hasScraped", &hasScraped ) &&
     1301            tr_bencDictFindStr ( t, "host", &host ) &&
     1302            tr_bencDictFindBool( t, "isBackup", &isBackup ) &&
     1303            tr_bencDictFindInt ( t, "announceState", &announceState ) &&
     1304            tr_bencDictFindInt ( t, "scrapeState", &scrapeState ) &&
     1305            tr_bencDictFindInt ( t, "lastAnnouncePeerCount", &lastAnnouncePeerCount ) &&
     1306            tr_bencDictFindStr ( t, "lastAnnounceResult", &lastAnnounceResult ) &&
     1307            tr_bencDictFindInt ( t, "lastAnnounceStartTime", &lastAnnounceStartTime ) &&
     1308            tr_bencDictFindBool( t, "lastAnnounceSucceeded", &lastAnnounceSucceeded ) &&
     1309            tr_bencDictFindInt ( t, "lastAnnounceTime", &lastAnnounceTime ) &&
     1310            tr_bencDictFindBool( t, "lastAnnounceTimedOut", &lastAnnounceTimedOut ) &&
     1311            tr_bencDictFindStr ( t, "lastScrapeResult", &lastScrapeResult ) &&
     1312            tr_bencDictFindInt ( t, "lastScrapeStartTime", &lastScrapeStartTime ) &&
     1313            tr_bencDictFindBool( t, "lastScrapeSucceeded", &lastScrapeSucceeded ) &&
     1314            tr_bencDictFindInt ( t, "lastScrapeTime", &lastScrapeTime ) &&
     1315            tr_bencDictFindBool( t, "lastScrapeTimedOut", &lastScrapeTimedOut ) &&
     1316            tr_bencDictFindInt ( t, "leecherCount", &leecherCount ) &&
     1317            tr_bencDictFindInt ( t, "nextAnnounceTime", &nextAnnounceTime ) &&
     1318            tr_bencDictFindInt ( t, "nextScrapeTime", &nextScrapeTime ) &&
     1319            tr_bencDictFindInt ( t, "seederCount", &seederCount ) &&
     1320            tr_bencDictFindInt ( t, "tier", &tier ) )
     1321        {
     1322            const time_t now = time( NULL );
     1323
     1324            printf( "\n" );
     1325            printf( "  Tracker #%d: %s\n", (int)(i+1), host );
     1326            if( isBackup )
     1327                printf( "  Backup on tier #%d\n", (int)tier );
     1328            else
     1329                printf( "  Active in tier #%d\n", (int)tier );
     1330
     1331            if( !isBackup )
     1332            {
     1333                if( hasAnnounced )
     1334                {
     1335                    tr_strltime( buf, now - lastAnnounceTime, sizeof( buf ) );
     1336                    if( lastAnnounceSucceeded )
     1337                        printf( "  Got a list of %'d peers %s ago\n",
     1338                                (int)lastAnnouncePeerCount, buf );
     1339                    else if( lastAnnounceTimedOut )
     1340                        printf( "  Peer list request timed out; will retry\n" );
     1341                    else
     1342                        printf( "  Got an error \"%s\" %s ago\n",
     1343                                lastAnnounceResult, buf );
     1344                }
     1345
     1346                switch( announceState )
     1347                {
     1348                    case TR_TRACKER_INACTIVE:
     1349                        printf( "  No updates scheduled\n" );
     1350                        break;
     1351                    case TR_TRACKER_WAITING:
     1352                        tr_strltime( buf, nextAnnounceTime - now, sizeof( buf ) );
     1353                        printf( "  Asking for more peers in %s\n", buf );
     1354                        break;
     1355                    case TR_TRACKER_QUEUED:
     1356                        printf( "  Queued to ask for more peers\n" );
     1357                        break;
     1358                    case TR_TRACKER_ACTIVE:
     1359                        tr_strltime( buf, now - lastAnnounceStartTime, sizeof( buf ) );
     1360                        printf( "  Asking for more peers now... %s\n", buf );
     1361                        break;
     1362                }
     1363
     1364                if( hasScraped )
     1365                {
     1366                    tr_strltime( buf, now - lastScrapeTime, sizeof( buf ) );
     1367                    if( lastScrapeSucceeded )
     1368                        printf( "  Tracker had %'d seeders and %'d leechers %s ago\n",
     1369                                (int)seederCount, (int)leecherCount, buf );
     1370                    else if( lastScrapeTimedOut )
     1371                        printf( "  Tracker scrape timed out; will retry\n" );
     1372                    else
     1373                        printf( "  Got a scrape error \"%s\" %s ago\n",
     1374                                lastScrapeResult, buf );
     1375                }
     1376
     1377                switch( scrapeState )
     1378                {
     1379                    case TR_TRACKER_INACTIVE:
     1380                        break;
     1381                    case TR_TRACKER_WAITING:
     1382                        tr_strltime( buf, nextScrapeTime - now, sizeof( buf ) );
     1383                        printf( "  Asking for peer counts in %s\n", buf );
     1384                        break;
     1385                    case TR_TRACKER_QUEUED:
     1386                        printf( "  Queued to ask for peer counts\n" );
     1387                        break;
     1388                    case TR_TRACKER_ACTIVE:
     1389                        tr_strltime( buf, now - lastScrapeStartTime, sizeof( buf ) );
     1390                        printf( "  Asking for peer counts now... %s\n", buf );
     1391                        break;
     1392                }
     1393            }
     1394        }
     1395    }
     1396}
     1397
     1398static void
     1399printTrackers( tr_benc * top )
     1400{
     1401    tr_benc *args, *torrents;
     1402
     1403    if( tr_bencDictFindDict( top, "arguments", &args )
     1404      && tr_bencDictFindList( args, "torrents", &torrents ) )
     1405    {
     1406        int i, n;
     1407        for( i=0, n=tr_bencListSize( torrents ); i<n; ++i )
     1408        {
     1409            tr_benc * trackerStats;
     1410            tr_benc * torrent = tr_bencListChild( torrents, i );
     1411            if( tr_bencDictFindList( torrent, "trackerStats", &trackerStats ) ) {
     1412                printTrackersImpl( trackerStats );
     1413                if( i+1<n )
     1414                    printf( "\n" );
     1415            }
     1416        }
    13541417    }
    13551418}
     
    15491612                printSessionStats( &top ); break;
    15501613
     1614            case TAG_DETAILS:
     1615                printDetails( &top ); break;
     1616
    15511617            case TAG_FILES:
    15521618                printFileList( &top ); break;
    15531619
    1554             case TAG_DETAILS:
    1555                 printDetails( &top ); break;
    1556 
    15571620            case TAG_LIST:
    15581621                printTorrentList( &top ); break;
     
    15601623            case TAG_PEERS:
    15611624                printPeers( &top ); break;
     1625
     1626            case TAG_PIECES:
     1627                printPieces( &top ); break;
    15621628
    15631629            case TAG_PORTTEST:
     
    15731639                /* fall-through to default: to give success or failure msg */
    15741640            }
     1641
     1642            case TAG_TRACKERS:
     1643                printTrackers( &top ); break;
    15751644
    15761645            default:
     
    18001869            switch( c )
    18011870            {
    1802                 case 'f': tr_bencDictAddInt( top, "tag", TAG_FILES );
    1803                           n = TR_N_ELEMENTS( files_keys );
    1804                           for( i=0; i<n; ++i ) tr_bencListAddStr( fields, files_keys[i] );
    1805                           addIdArg( args, id );
    1806                           break;
    18071871                case 'i': tr_bencDictAddInt( top, "tag", TAG_DETAILS );
    18081872                          n = TR_N_ELEMENTS( details_keys );
     
    18141878                          for( i=0; i<n; ++i ) tr_bencListAddStr( fields, list_keys[i] );
    18151879                          break;
    1816                 case 940: tr_bencDictAddInt( top, "tag", TAG_PEERS );
     1880                case 940: tr_bencDictAddInt( top, "tag", TAG_FILES );
     1881                          n = TR_N_ELEMENTS( files_keys );
     1882                          for( i=0; i<n; ++i ) tr_bencListAddStr( fields, files_keys[i] );
     1883                          addIdArg( args, id );
     1884                          break;
     1885                case 941: tr_bencDictAddInt( top, "tag", TAG_PEERS );
    18171886                          tr_bencListAddStr( fields, "peers" );
     1887                          addIdArg( args, id );
     1888                          break;
     1889                case 942: tr_bencDictAddInt( top, "tag", TAG_PIECES );
     1890                          tr_bencListAddStr( fields, "pieces" );
     1891                          tr_bencListAddStr( fields, "pieceCount" );
     1892                          addIdArg( args, id );
     1893                          break;
     1894                case 943: tr_bencDictAddInt( top, "tag", TAG_TRACKERS );
     1895                          tr_bencListAddStr( fields, "trackerStats" );
    18181896                          addIdArg( args, id );
    18191897                          break;
Note: See TracChangeset for help on using the changeset viewer.