{ { "peer", TASK_STATS_PEERS }, { "conn", TASK_STATS_CONNS }, { "scrp", TASK_STATS_SCRAPE }, { "udp4", TASK_STATS_UDP }, { "tcp4", TASK_STATS_TCP },
{ "busy", TASK_STATS_BUSY_NETWORKS }, { "torr", TASK_STATS_TORRENTS }, { "fscr", TASK_STATS_FULLSCRAPE },
{ "s24s", TASK_STATS_SLASH24S }, { "tpbs", TASK_STATS_TPB }, { "herr", TASK_STATS_HTTPERRORS }, { "completed", TASK_STATS_COMPLETED },
- { "top10", TASK_STATS_TOP10 }, { "renew", TASK_STATS_RENEW }, { "syncs", TASK_STATS_SYNCS }, { "version", TASK_STATS_VERSION },
+ { "top100", TASK_STATS_TOP100 }, { "top10", TASK_STATS_TOP10 }, { "renew", TASK_STATS_RENEW }, { "syncs", TASK_STATS_SYNCS }, { "version", TASK_STATS_VERSION },
{ "everything", TASK_STATS_EVERYTHING }, { "statedump", TASK_FULLSCRAPE_TRACKERSTATE }, { "fulllog", TASK_STATS_FULLLOG },
{ "woodpeckers", TASK_STATS_WOODPECKERS},
#ifdef WANT_LOG_NUMWANT
TASK_STATS_PEERS = 0x0102,
TASK_STATS_SLASH24S = 0x0103,
TASK_STATS_TOP10 = 0x0104,
- TASK_STATS_EVERYTHING = 0x0105,
- TASK_STATS_FULLLOG = 0x0106,
- TASK_STATS_WOODPECKERS = 0x0107,
+ TASK_STATS_TOP100 = 0x0105,
+ TASK_STATS_EVERYTHING = 0x0106,
+ TASK_STATS_FULLLOG = 0x0107,
+ TASK_STATS_WOODPECKERS = 0x0108,
TASK_FULLSCRAPE = 0x0200, /* Default mode */
TASK_FULLSCRAPE_TPB_BINARY = 0x0201,
static int stat_increase_network_count( stats_network_node **pnode, int depth, uintptr_t ip ) {
int foo = __LDR(ip,depth);
stats_network_node *node;
-
+
if( !*pnode ) {
*pnode = malloc( sizeof( stats_network_node ) );
if( !*pnode )
free( *node );
*node = NULL;
}
-
+
return rest;
}
typedef struct { size_t val; ot_torrent * torrent; } ot_record;
/* Fetches stats from tracker */
-size_t stats_top10_txt( char * reply ) {
+size_t stats_top_txt( char * reply, int amount ) {
size_t j;
- ot_record top10s[10], top10c[10];
+ ot_record top100s[100], top100c[100];
char *r = reply, hex_out[42];
int idx, bucket;
- byte_zero( top10s, sizeof( top10s ) );
- byte_zero( top10c, sizeof( top10c ) );
+ if( amount > 100 )
+ amount = 100;
+
+ byte_zero( top100s, sizeof( top100s ) );
+ byte_zero( top100c, sizeof( top100c ) );
for( bucket=0; bucket<OT_BUCKET_COUNT; ++bucket ) {
ot_vector *torrents_list = mutex_bucket_lock( bucket );
for( j=0; j<torrents_list->size; ++j ) {
ot_peerlist *peer_list = ( ((ot_torrent*)(torrents_list->data))[j] ).peer_list;
- int idx = 9; while( (idx >= 0) && ( peer_list->peer_count > top10c[idx].val ) ) --idx;
- if ( idx++ != 9 ) {
- memmove( top10c + idx + 1, top10c + idx, ( 9 - idx ) * sizeof( ot_record ) );
- top10c[idx].val = peer_list->peer_count;
- top10c[idx].torrent = (ot_torrent*)(torrents_list->data) + j;
+ int idx = amount - 1; while( (idx >= 0) && ( peer_list->peer_count > top100c[idx].val ) ) --idx;
+ if ( idx++ != amount - 1 ) {
+ memmove( top100c + idx + 1, top100c + idx, ( amount - 1 - idx ) * sizeof( ot_record ) );
+ top100c[idx].val = peer_list->peer_count;
+ top100c[idx].torrent = (ot_torrent*)(torrents_list->data) + j;
}
- idx = 9; while( (idx >= 0) && ( peer_list->seed_count > top10s[idx].val ) ) --idx;
- if ( idx++ != 9 ) {
- memmove( top10s + idx + 1, top10s + idx, ( 9 - idx ) * sizeof( ot_record ) );
- top10s[idx].val = peer_list->seed_count;
- top10s[idx].torrent = (ot_torrent*)(torrents_list->data) + j;
+ idx = amount - 1; while( (idx >= 0) && ( peer_list->seed_count > top100s[idx].val ) ) --idx;
+ if ( idx++ != amount - 1 ) {
+ memmove( top100s + idx + 1, top100s + idx, ( amount - 1 - idx ) * sizeof( ot_record ) );
+ top100s[idx].val = peer_list->seed_count;
+ top100s[idx].torrent = (ot_torrent*)(torrents_list->data) + j;
}
}
mutex_bucket_unlock( bucket, 0 );
return 0;
}
- r += sprintf( r, "Top 10 torrents by peers:\n" );
- for( idx=0; idx<10; ++idx )
- if( top10c[idx].torrent )
- r += sprintf( r, "\t%zd\t%s\n", top10c[idx].val, to_hex( hex_out, top10c[idx].torrent->hash) );
- r += sprintf( r, "Top 10 torrents by seeds:\n" );
- for( idx=0; idx<10; ++idx )
- if( top10s[idx].torrent )
- r += sprintf( r, "\t%zd\t%s\n", top10s[idx].val, to_hex( hex_out, top10s[idx].torrent->hash) );
+ r += sprintf( r, "Top %d torrents by peers:\n", amount );
+ for( idx=0; idx<amount; ++idx )
+ if( top100c[idx].torrent )
+ r += sprintf( r, "\t%zd\t%s\n", top100c[idx].val, to_hex( hex_out, top100c[idx].torrent->hash) );
+ r += sprintf( r, "Top %d torrents by seeds:\n", amount );
+ for( idx=0; idx<amount; ++idx )
+ if( top100s[idx].torrent )
+ r += sprintf( r, "\t%zd\t%s\n", top100s[idx].val, to_hex( hex_out, top100s[idx].torrent->hash) );
return r - reply;
}
case TASK_STATS_TORRENTS: r += stats_torrents_mrtg( r ); break;
case TASK_STATS_PEERS: r += stats_peers_mrtg( r ); break;
case TASK_STATS_SLASH24S: r += stats_slash24s_txt( r, 128 ); break;
- case TASK_STATS_TOP10: r += stats_top10_txt( r ); break;
+ case TASK_STATS_TOP10: r += stats_top_txt( r, 10 ); break;
+ case TASK_STATS_TOP100: r += stats_top_txt( r, 100 ); break;
case TASK_STATS_EVERYTHING: r += stats_return_everything( r ); break;
#ifdef WANT_SPOT_WOODPECKER
case TASK_STATS_WOODPECKERS: r += stats_return_woodpeckers( r, 128 ); break;