diff options
Diffstat (limited to 'ot_fullscrape.c')
| -rw-r--r-- | ot_fullscrape.c | 51 |
1 files changed, 38 insertions, 13 deletions
diff --git a/ot_fullscrape.c b/ot_fullscrape.c index 58e525f..25d6bd5 100644 --- a/ot_fullscrape.c +++ b/ot_fullscrape.c | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #include <pthread.h> | 8 | #include <pthread.h> |
| 9 | 9 | ||
| 10 | /* Libowfat */ | 10 | /* Libowfat */ |
| 11 | #include "textcode.h" | ||
| 11 | 12 | ||
| 12 | /* Opentracker */ | 13 | /* Opentracker */ |
| 13 | #include "trackerlogic.h" | 14 | #include "trackerlogic.h" |
| @@ -25,7 +26,11 @@ | |||
| 25 | #define OT_FULLSCRAPE_MAXENTRYLEN 100 | 26 | #define OT_FULLSCRAPE_MAXENTRYLEN 100 |
| 26 | 27 | ||
| 27 | /* Forward declaration */ | 28 | /* Forward declaration */ |
| 28 | static void fullscrape_make( int *iovec_entries, struct iovec **iovector ); | 29 | static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tasktype mode ); |
| 30 | |||
| 31 | /* Converter function from memory to human readable hex strings | ||
| 32 | XXX - Duplicated from ot_stats. Needs fix. */ | ||
| 33 | static char*to_hex(char*d,ot_byte*s){char*m="0123456789ABCDEF";char *t=d;char*e=d+40;while(d<e){*d++=m[*s>>4];*d++=m[*s++&15];}*d=0;return t;} | ||
| 29 | 34 | ||
| 30 | /* This is the entry point into this worker thread | 35 | /* This is the entry point into this worker thread |
| 31 | It grabs tasks from mutex_tasklist and delivers results back | 36 | It grabs tasks from mutex_tasklist and delivers results back |
| @@ -37,8 +42,9 @@ static void * fullscrape_worker( void * args) { | |||
| 37 | args = args; | 42 | args = args; |
| 38 | 43 | ||
| 39 | while( 1 ) { | 44 | while( 1 ) { |
| 40 | ot_taskid taskid = mutex_workqueue_poptask( OT_TASKTYPE_FULLSCRAPE ); | 45 | ot_tasktype tasktype = TASK_FULLSCRAPE; |
| 41 | fullscrape_make( &iovec_entries, &iovector ); | 46 | ot_taskid taskid = mutex_workqueue_poptask( &tasktype ); |
| 47 | fullscrape_make( &iovec_entries, &iovector, tasktype ); | ||
| 42 | if( mutex_workqueue_pushresult( taskid, iovec_entries, iovector ) ) | 48 | if( mutex_workqueue_pushresult( taskid, iovec_entries, iovector ) ) |
| 43 | iovec_free( &iovec_entries, &iovector ); | 49 | iovec_free( &iovec_entries, &iovector ); |
| 44 | } | 50 | } |
| @@ -50,11 +56,11 @@ void fullscrape_init( ) { | |||
| 50 | pthread_create( &thread_id, NULL, fullscrape_worker, NULL ); | 56 | pthread_create( &thread_id, NULL, fullscrape_worker, NULL ); |
| 51 | } | 57 | } |
| 52 | 58 | ||
| 53 | void fullscrape_deliver( int64 socket ) { | 59 | void fullscrape_deliver( int64 socket, ot_tasktype tasktype ) { |
| 54 | mutex_workqueue_pushtask( socket, OT_TASKTYPE_FULLSCRAPE ); | 60 | mutex_workqueue_pushtask( socket, tasktype ); |
| 55 | } | 61 | } |
| 56 | 62 | ||
| 57 | static void fullscrape_make( int *iovec_entries, struct iovec **iovector ) { | 63 | static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tasktype mode ) { |
| 58 | int bucket; | 64 | int bucket; |
| 59 | char *r, *re; | 65 | char *r, *re; |
| 60 | 66 | ||
| @@ -68,8 +74,11 @@ static void fullscrape_make( int *iovec_entries, struct iovec **iovector ) { | |||
| 68 | This works as a low watermark */ | 74 | This works as a low watermark */ |
| 69 | re = r + OT_SCRAPE_CHUNK_SIZE; | 75 | re = r + OT_SCRAPE_CHUNK_SIZE; |
| 70 | 76 | ||
| 71 | /* Start reply dictionary */ | 77 | /* Reply dictionary only needed for bencoded fullscrape */ |
| 72 | memmove( r, "d5:filesd", 9 ); r += 9; | 78 | if( mode == TASK_FULLSCRAPE ) { |
| 79 | memmove( r, "d5:filesd", 9 ); | ||
| 80 | r += 9; | ||
| 81 | } | ||
| 73 | 82 | ||
| 74 | /* For each bucket... */ | 83 | /* For each bucket... */ |
| 75 | for( bucket=0; bucket<OT_BUCKET_COUNT; ++bucket ) { | 84 | for( bucket=0; bucket<OT_BUCKET_COUNT; ++bucket ) { |
| @@ -83,15 +92,29 @@ static void fullscrape_make( int *iovec_entries, struct iovec **iovector ) { | |||
| 83 | ot_peerlist *peer_list = ( ((ot_torrent*)(torrents_list->data))[tor_offset] ).peer_list; | 92 | ot_peerlist *peer_list = ( ((ot_torrent*)(torrents_list->data))[tor_offset] ).peer_list; |
| 84 | ot_hash *hash =&( ((ot_torrent*)(torrents_list->data))[tor_offset] ).hash; | 93 | ot_hash *hash =&( ((ot_torrent*)(torrents_list->data))[tor_offset] ).hash; |
| 85 | 94 | ||
| 86 | /* If torrent has peers or download count, its interesting */ | 95 | switch( mode ) { |
| 87 | if( peer_list->peer_count || peer_list->down_count ) { | 96 | case TASK_FULLSCRAPE: |
| 88 | 97 | default: | |
| 89 | /* push hash as bencoded string */ | 98 | /* push hash as bencoded string */ |
| 90 | *r++='2'; *r++='0'; *r++=':'; | 99 | *r++='2'; *r++='0'; *r++=':'; |
| 91 | memmove( r, hash, 20 ); r+=20; | 100 | memmove( r, hash, 20 ); r+=20; |
| 92 | 101 | ||
| 93 | /* push rest of the scrape string */ | 102 | /* push rest of the scrape string */ |
| 94 | r += sprintf( r, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee", peer_list->seed_count, peer_list->down_count, peer_list->peer_count-peer_list->seed_count ); | 103 | r += sprintf( r, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee", peer_list->seed_count, peer_list->down_count, peer_list->peer_count-peer_list->seed_count ); |
| 104 | break; | ||
| 105 | case TASK_FULLSCRAPE_TPB_ASCII: | ||
| 106 | to_hex( r, *hash ); r+=40; | ||
| 107 | r += sprintf( r, ":%zd:%zd\n", peer_list->seed_count, peer_list->peer_count-peer_list->seed_count ); | ||
| 108 | break; | ||
| 109 | case TASK_FULLSCRAPE_TPB_BINARY: | ||
| 110 | memmove( r, hash, 20 ); r+=20; | ||
| 111 | *(ot_dword*)r++ = htonl( (uint32_t)peer_list->seed_count ); | ||
| 112 | *(ot_dword*)r++ = htonl( (uint32_t)( peer_list->peer_count-peer_list->seed_count) ); | ||
| 113 | break; | ||
| 114 | case TASK_FULLSCRAPE_TPB_URLENCODED: | ||
| 115 | r += fmt_urlencoded( r, (char *)*hash, 20 ); | ||
| 116 | r += sprintf( r, ":%zd:%zd\n", peer_list->seed_count, peer_list->peer_count-peer_list->seed_count ); | ||
| 117 | break; | ||
| 95 | } | 118 | } |
| 96 | 119 | ||
| 97 | /* If we reached our low watermark in buffer... */ | 120 | /* If we reached our low watermark in buffer... */ |
| @@ -120,8 +143,10 @@ static void fullscrape_make( int *iovec_entries, struct iovec **iovector ) { | |||
| 120 | mutex_bucket_unlock( bucket ); | 143 | mutex_bucket_unlock( bucket ); |
| 121 | } | 144 | } |
| 122 | 145 | ||
| 123 | /* Close bencoded scrape dictionary */ | 146 | /* Close bencoded scrape dictionary if necessary */ |
| 124 | *r++='e'; *r++='e'; | 147 | if( mode == TASK_FULLSCRAPE ) { |
| 148 | *r++='e'; *r++='e'; | ||
| 149 | } | ||
| 125 | 150 | ||
| 126 | /* Release unused memory in current output buffer */ | 151 | /* Release unused memory in current output buffer */ |
| 127 | iovec_fixlast( iovec_entries, iovector, OT_SCRAPE_CHUNK_SIZE - ( re - r ) ); | 152 | iovec_fixlast( iovec_entries, iovector, OT_SCRAPE_CHUNK_SIZE - ( re - r ) ); |
