diff options
Diffstat (limited to 'trackerlogic.c')
| -rw-r--r-- | trackerlogic.c | 61 |
1 files changed, 30 insertions, 31 deletions
diff --git a/trackerlogic.c b/trackerlogic.c index 74fea6d..1f38f07 100644 --- a/trackerlogic.c +++ b/trackerlogic.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | /* Opentracker */ | 14 | /* Opentracker */ |
| 15 | #include "ot_accesslist.h" | 15 | #include "ot_accesslist.h" |
| 16 | #include "ot_clean.h" | 16 | #include "ot_clean.h" |
| 17 | #include "ot_fmt.h" | ||
| 17 | #include "ot_fullscrape.h" | 18 | #include "ot_fullscrape.h" |
| 18 | #include "ot_http.h" | 19 | #include "ot_http.h" |
| 19 | #include "ot_ip.h" | 20 | #include "ot_ip.h" |
| @@ -299,11 +300,12 @@ static size_t return_peers_for_torrent_udp(struct ot_workstruct *ws, ot_torrent | |||
| 299 | } | 300 | } |
| 300 | 301 | ||
| 301 | static size_t return_peers_for_torrent_tcp(struct ot_workstruct *ws, ot_torrent *torrent, size_t amount, char *reply) { | 302 | static size_t return_peers_for_torrent_tcp(struct ot_workstruct *ws, ot_torrent *torrent, size_t amount, char *reply) { |
| 302 | char *r = reply; | 303 | char *r = reply; |
| 303 | int erval = OT_CLIENT_REQUEST_INTERVAL_RANDOM; | 304 | const char *r_end = ws->outbuf + G_OUTBUF_SIZE; |
| 304 | size_t seed_count = torrent->peer_list6->seed_count + torrent->peer_list4->seed_count; | 305 | int erval = OT_CLIENT_REQUEST_INTERVAL_RANDOM; |
| 305 | size_t down_count = torrent->peer_list6->down_count + torrent->peer_list4->down_count; | 306 | size_t seed_count = torrent->peer_list6->seed_count + torrent->peer_list4->seed_count; |
| 306 | size_t peer_count = torrent->peer_list6->peer_count + torrent->peer_list4->peer_count - seed_count; | 307 | size_t down_count = torrent->peer_list6->down_count + torrent->peer_list4->down_count; |
| 308 | size_t peer_count = torrent->peer_list6->peer_count + torrent->peer_list4->peer_count - seed_count; | ||
| 307 | 309 | ||
| 308 | /* Simple case: amount of peers in both lists is less than requested, here we return all results */ | 310 | /* Simple case: amount of peers in both lists is less than requested, here we return all results */ |
| 309 | size_t amount_v4 = torrent->peer_list4->peer_count; | 311 | size_t amount_v4 = torrent->peer_list4->peer_count; |
| @@ -341,11 +343,11 @@ static size_t return_peers_for_torrent_tcp(struct ot_workstruct *ws, ot_torrent | |||
| 341 | ++amount_v4; | 343 | ++amount_v4; |
| 342 | } | 344 | } |
| 343 | 345 | ||
| 344 | r += | 346 | fmt_append(&r, r_end, "d8:completei%zde10:downloadedi%zde10:incompletei%zde8:intervali%ie12:min intervali%ie", seed_count, down_count, peer_count, erval, |
| 345 | sprintf(r, "d8:completei%zde10:downloadedi%zde10:incompletei%zde8:intervali%ie12:min intervali%ie", seed_count, down_count, peer_count, erval, erval / 2); | 347 | erval / 2); |
| 346 | 348 | ||
| 347 | if (amount_v4) { | 349 | if (amount_v4) { |
| 348 | r += sprintf(r, PEERS_BENCODED4 "%zd:", OT_PEER_COMPARE_SIZE4 * amount_v4); | 350 | fmt_append(&r, r_end, PEERS_BENCODED4 "%zd:", OT_PEER_COMPARE_SIZE4 * amount_v4); |
| 349 | if (amount_v4 == torrent->peer_list4->peer_count) | 351 | if (amount_v4 == torrent->peer_list4->peer_count) |
| 350 | r += return_peers_all(torrent->peer_list4, OT_PEER_SIZE4, r); | 352 | r += return_peers_all(torrent->peer_list4, OT_PEER_SIZE4, r); |
| 351 | else | 353 | else |
| @@ -353,14 +355,14 @@ static size_t return_peers_for_torrent_tcp(struct ot_workstruct *ws, ot_torrent | |||
| 353 | } | 355 | } |
| 354 | 356 | ||
| 355 | if (amount_v6) { | 357 | if (amount_v6) { |
| 356 | r += sprintf(r, PEERS_BENCODED6 "%zd:", OT_PEER_COMPARE_SIZE6 * amount_v6); | 358 | fmt_append(&r, r_end, PEERS_BENCODED6 "%zd:", OT_PEER_COMPARE_SIZE6 * amount_v6); |
| 357 | if (amount_v6 == torrent->peer_list6->peer_count) | 359 | if (amount_v6 == torrent->peer_list6->peer_count) |
| 358 | r += return_peers_all(torrent->peer_list6, OT_PEER_SIZE6, r); | 360 | r += return_peers_all(torrent->peer_list6, OT_PEER_SIZE6, r); |
| 359 | else | 361 | else |
| 360 | r += return_peers_selection(ws, torrent->peer_list6, OT_PEER_SIZE6, amount_v6, r); | 362 | r += return_peers_selection(ws, torrent->peer_list6, OT_PEER_SIZE6, amount_v6, r); |
| 361 | } | 363 | } |
| 362 | 364 | ||
| 363 | *r++ = 'e'; | 365 | fmt_append(&r, r_end, "e"); |
| 364 | 366 | ||
| 365 | return r - reply; | 367 | return r - reply; |
| 366 | } | 368 | } |
| @@ -381,7 +383,7 @@ size_t return_peers_for_torrent(struct ot_workstruct *ws, ot_torrent *torrent, s | |||
| 381 | size_t return_udp_scrape_for_torrent(ot_hash const hash, char *reply) { | 383 | size_t return_udp_scrape_for_torrent(ot_hash const hash, char *reply) { |
| 382 | int exactmatch, delta_torrentcount = 0; | 384 | int exactmatch, delta_torrentcount = 0; |
| 383 | ot_vector *torrents_list = mutex_bucket_lock_by_hash(hash); | 385 | ot_vector *torrents_list = mutex_bucket_lock_by_hash(hash); |
| 384 | ot_torrent *torrent = binary_search(hash, torrents_list->data, torrents_list->size, sizeof(ot_torrent), OT_HASH_COMPARE_SIZE, &exactmatch); | 386 | ot_torrent *torrent = vector_binary_search(hash, torrents_list->data, torrents_list->size, sizeof(ot_torrent), OT_HASH_COMPARE_SIZE, &exactmatch); |
| 385 | 387 | ||
| 386 | if (!exactmatch) { | 388 | if (!exactmatch) { |
| 387 | memset(reply, 0, 12); | 389 | memset(reply, 0, 12); |
| @@ -403,47 +405,41 @@ size_t return_udp_scrape_for_torrent(ot_hash const hash, char *reply) { | |||
| 403 | } | 405 | } |
| 404 | 406 | ||
| 405 | /* Fetches scrape info for a specific torrent */ | 407 | /* Fetches scrape info for a specific torrent */ |
| 406 | size_t return_tcp_scrape_for_torrent(ot_hash const *hash_list, size_t amount, char *reply) { | 408 | void return_tcp_scrape_for_torrent(ot_hash const *hash_list, size_t amount, char **reply, const char *reply_end) { |
| 407 | char *r = reply; | 409 | int exactmatch; |
| 408 | int exactmatch; | ||
| 409 | size_t i; | 410 | size_t i; |
| 410 | 411 | ||
| 411 | r += sprintf(r, "d5:filesd"); | 412 | fmt_append(reply, reply_end, "d5:filesd"); |
| 412 | 413 | ||
| 413 | for (i = 0; i < amount; ++i) { | 414 | for (i = 0; i < amount; ++i) { |
| 414 | int delta_torrentcount = 0; | 415 | int delta_torrentcount = 0; |
| 415 | ot_hash const *hash = hash_list + i; | 416 | ot_hash const *hash = hash_list + i; |
| 416 | ot_vector *torrents_list = mutex_bucket_lock_by_hash(*hash); | 417 | ot_vector *torrents_list = mutex_bucket_lock_by_hash(*hash); |
| 417 | ot_torrent *torrent = binary_search(hash, torrents_list->data, torrents_list->size, sizeof(ot_torrent), OT_HASH_COMPARE_SIZE, &exactmatch); | 418 | ot_torrent *torrent = vector_binary_search(hash, torrents_list->data, torrents_list->size, sizeof(ot_torrent), OT_HASH_COMPARE_SIZE, &exactmatch); |
| 418 | 419 | ||
| 419 | if (exactmatch) { | 420 | if (exactmatch) { |
| 420 | if (clean_single_torrent(torrent)) { | 421 | if (clean_single_torrent(torrent)) { |
| 421 | vector_remove_torrent(torrents_list, torrent); | 422 | vector_remove_torrent(torrents_list, torrent); |
| 422 | delta_torrentcount = -1; | 423 | delta_torrentcount = -1; |
| 423 | } else { | 424 | } else { |
| 424 | *r++ = '2'; | 425 | fmt_append(reply, reply_end, "20:"); |
| 425 | *r++ = '0'; | 426 | fmt_bytes(reply, reply_end, hash, sizeof(ot_hash)); |
| 426 | *r++ = ':'; | 427 | fmt_append(reply, reply_end, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee", |
| 427 | memcpy(r, hash, sizeof(ot_hash)); | 428 | torrent->peer_list6->seed_count + torrent->peer_list4->seed_count, torrent->peer_list6->down_count + torrent->peer_list4->down_count, |
| 428 | r += sizeof(ot_hash); | 429 | torrent->peer_list6->peer_count + torrent->peer_list4->peer_count - torrent->peer_list6->seed_count - torrent->peer_list4->seed_count); |
| 429 | r += sprintf(r, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee", torrent->peer_list6->seed_count + torrent->peer_list4->seed_count, | ||
| 430 | torrent->peer_list6->down_count + torrent->peer_list4->down_count, | ||
| 431 | torrent->peer_list6->peer_count + torrent->peer_list4->peer_count - torrent->peer_list6->seed_count - torrent->peer_list4->seed_count); | ||
| 432 | } | 430 | } |
| 433 | } | 431 | } |
| 434 | mutex_bucket_unlock_by_hash(*hash, delta_torrentcount); | 432 | mutex_bucket_unlock_by_hash(*hash, delta_torrentcount); |
| 435 | } | 433 | } |
| 436 | 434 | ||
| 437 | *r++ = 'e'; | 435 | fmt_append(reply, reply_end, "ee"); |
| 438 | *r++ = 'e'; | ||
| 439 | return r - reply; | ||
| 440 | } | 436 | } |
| 441 | 437 | ||
| 442 | static ot_peerlist dummy_list; | 438 | static ot_peerlist dummy_list; |
| 443 | size_t remove_peer_from_torrent(PROTO_FLAG proto, struct ot_workstruct *ws) { | 439 | size_t remove_peer_from_torrent(PROTO_FLAG proto, struct ot_workstruct *ws) { |
| 444 | int exactmatch; | 440 | int exactmatch; |
| 445 | ot_vector *torrents_list = mutex_bucket_lock_by_hash(*ws->hash); | 441 | ot_vector *torrents_list = mutex_bucket_lock_by_hash(*ws->hash); |
| 446 | ot_torrent *torrent = binary_search(ws->hash, torrents_list->data, torrents_list->size, sizeof(ot_torrent), OT_HASH_COMPARE_SIZE, &exactmatch); | 442 | ot_torrent *torrent = vector_binary_search(ws->hash, torrents_list->data, torrents_list->size, sizeof(ot_torrent), OT_HASH_COMPARE_SIZE, &exactmatch); |
| 447 | ot_peerlist *peer_list = &dummy_list; | 443 | ot_peerlist *peer_list = &dummy_list; |
| 448 | size_t peer_size; /* initialized in next line */ | 444 | size_t peer_size; /* initialized in next line */ |
| 449 | ot_peer const *peer_src = peer_from_peer6(&ws->peer, &peer_size); | 445 | ot_peer const *peer_src = peer_from_peer6(&ws->peer, &peer_size); |
| @@ -472,9 +468,12 @@ size_t remove_peer_from_torrent(PROTO_FLAG proto, struct ot_workstruct *ws) { | |||
| 472 | } | 468 | } |
| 473 | 469 | ||
| 474 | if (proto == FLAG_TCP) { | 470 | if (proto == FLAG_TCP) { |
| 475 | int erval = OT_CLIENT_REQUEST_INTERVAL_RANDOM; | 471 | int erval = OT_CLIENT_REQUEST_INTERVAL_RANDOM; |
| 476 | ws->reply_size = sprintf(ws->reply, "d8:completei%zde10:incompletei%zde8:intervali%ie12:min intervali%ie%s0:e", seed_count, peer_count - seed_count, erval, | 472 | char *r = ws->reply; |
| 477 | erval / 2, peer_size == OT_PEER_SIZE6 ? PEERS_BENCODED6 : PEERS_BENCODED4); | 473 | |
| 474 | fmt_append(&r, ws->outbuf + G_OUTBUF_SIZE, "d8:completei%zde10:incompletei%zde8:intervali%ie12:min intervali%ie%s0:e", seed_count, peer_count - seed_count, | ||
| 475 | erval, erval / 2, peer_size == OT_PEER_SIZE6 ? PEERS_BENCODED6 : PEERS_BENCODED4); | ||
| 476 | ws->reply_size = r - ws->reply; | ||
| 478 | } | 477 | } |
| 479 | 478 | ||
| 480 | /* Handle UDP reply */ | 479 | /* Handle UDP reply */ |
