Changeset 2949
- Timestamp:
- Aug 30, 2007, 8:51:35 PM (15 years ago)
- Location:
- branches/encryption/libtransmission
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/encryption/libtransmission/inout.c
r2941 r2949 141 141 static int 142 142 readOrWritePiece ( tr_torrent * tor, 143 int 144 int 145 int 146 uint8_t 147 size_t 143 int ioMode, 144 int pieceIndex, 145 int pieceOffset, 146 uint8_t * buf, 147 size_t buflen ) 148 148 { 149 149 int ret = 0; … … 178 178 179 179 int 180 tr_ioRead( tr_ io_t * io, int pieceIndex, int begin, int len, uint8_t * buf )181 { 182 return readOrWritePiece ( io->tor, TR_IO_READ, pieceIndex, begin, buf, len );180 tr_ioRead( tr_torrent * tor, int pieceIndex, int begin, int len, uint8_t * buf ) 181 { 182 return readOrWritePiece ( tor, TR_IO_READ, pieceIndex, begin, buf, len ); 183 183 } 184 184 185 185 int 186 tr_ioWrite( tr_ io_t * io, int pieceIndex, int begin, int len, uint8_t * buf )187 { 188 return readOrWritePiece ( io->tor, TR_IO_WRITE, pieceIndex, begin, buf, len );186 tr_ioWrite( tr_torrent * tor, int pieceIndex, int begin, int len, uint8_t * buf ) 187 { 188 return readOrWritePiece ( tor, TR_IO_WRITE, pieceIndex, begin, buf, len ); 189 189 } 190 190 -
branches/encryption/libtransmission/inout.h
r2941 r2949 26 26 #define TR_IO_H 1 27 27 28 struct tr_torrent; 29 28 30 typedef struct tr_io_s tr_io_t; 29 31 … … 40 42 * TR_ERROR_IO_* otherwise. 41 43 **********************************************************************/ 42 int tr_ioRead ( tr_io_t*, int index, int begin, int len, uint8_t * );43 int tr_ioWrite ( tr_io_t *, int index, int begin, int len, uint8_t * );44 int tr_ioRead ( struct tr_torrent*, int index, int begin, int len, uint8_t * ); 45 int tr_ioWrite ( struct tr_torrent *, int index, int begin, int len, uint8_t * ); 44 46 45 47 /*********************************************************************** -
branches/encryption/libtransmission/p.c
r2946 r2949 8 8 * the Transmission project. 9 9 * 10 * $Id :$10 * $Id$ 11 11 */ 12 12 … … 25 25 #include "bencode.h" 26 26 #include "completion.h" 27 #include "inout.h" 27 28 #include "list.h" 28 29 #include "peer-connection.h" … … 59 60 { 60 61 AWAITING_BT_LENGTH, 61 AWAITING_BT_MESSAGE 62 AWAITING_BT_MESSAGE, 63 READING_BT_PIECE 62 64 }; 63 65 … … 73 75 fprintf (stderr, "PeerManager::getStateName: unhandled state %d\n", state ); 74 76 abort( ); 77 } 78 79 struct peer_request 80 { 81 uint32_t pieceIndex; 82 uint32_t offsetInPiece; 83 uint32_t length; 84 }; 85 86 static int 87 peer_request_compare_func( const void * va, const void * vb ) 88 { 89 struct peer_request * a = (struct peer_request*) va; 90 struct peer_request * b = (struct peer_request*) vb; 91 if( a->pieceIndex != b->pieceIndex ) 92 return a->pieceIndex - b->pieceIndex; 93 if( a->offsetInPiece != b->offsetInPiece ) 94 return a->offsetInPiece - b->offsetInPiece; 95 if( a->length != b->length ) 96 return a->length - b->length; 97 return 0; 75 98 } 76 99 … … 80 103 tr_torrent * torrent; 81 104 tr_peerConnection * connection; 82 tr_bitfield * bitfield; /* the peer's bitfield */ 83 tr_bitfield * banfield; /* bad pieces from the peer */ 105 tr_bitfield * bitfield; /* the peer's bitfield */ 106 tr_bitfield * banfield; /* bad pieces from the peer */ 107 tr_bitfield * blamefield; /* lists pieces that this peer helped us with */ 84 108 85 109 struct evbuffer * outMessages; /* buffer of all the non-piece messages */ 110 struct evbuffer * outBlock; /* the block we're currently sending */ 111 struct evbuffer * inBlock; /* the block we're currently receiving */ 112 tr_list * peerAskedFor; 86 113 tr_list * outPieces; 87 114 88 115 tr_timer_tag pulseTag; 89 116 90 tr_ratecontrol * rcIn; /* rate of bytes from the peer to us */ 91 tr_ratecontrol * rcOut; /* rate of bytes from us to the peer */ 92 93 unsigned int weAreChokingThem : 1; 94 unsigned int peerisChokingUs : 1; 95 unsigned int weAreInterested : 1; 96 unsigned int peerIsInterested : 1; 97 unsigned int isPrivate : 1; 117 tr_ratecontrol * rcToUs; /* rate of bytes from the peer to us */ 118 tr_ratecontrol * rcToPeer; /* rate of bytes from us to the peer */ 119 120 unsigned int peerIsChoked : 1; 121 unsigned int weAreChoked : 1; 122 unsigned int peerIsInterested : 1; 123 unsigned int weAreInterested : 1; 124 unsigned int isPrivate : 1; 125 unsigned int notListening : 1; 126 127 struct peer_request blockToUs; 98 128 99 129 int state; … … 106 136 107 137 uint16_t ut_pex; 108 uint 32_t listeningPort;138 uint16_t listeningPort; 109 139 110 140 /* the client name from the `v' string in LTEP's handshake dictionary */ … … 171 201 } 172 202 203 void 204 setChoke( tr_peer * peer, int choke ) 205 { 206 if( peer->peerIsChoked != !!choke ) 207 { 208 const uint32_t len = sizeof(uint8_t); 209 const uint8_t bt_msgid = choke ? BT_CHOKE : BT_UNCHOKE; 210 211 peer->peerIsChoked = choke ? 1 : 0; 212 if( peer->peerIsChoked ) 213 { 214 tr_list_foreach( peer->peerAskedFor, tr_free ); 215 tr_list_free( &peer->peerAskedFor ); 216 } 217 218 fprintf( stderr, "peer %p: enqueuing a %s message\n", peer, (choke ? "choke" : "unchoke") ); 219 tr_peerConnectionWriteUint32( peer->connection, peer->outMessages, len ); 220 tr_peerConnectionWriteBytes( peer->connection, peer->outMessages, &bt_msgid, 1 ); 221 } 222 } 223 173 224 /** 174 225 *** … … 208 259 for( i=0; i<sub->val.s.i; ++i ) fprintf( stderr, "[%c] (%d)\n", sub->val.s.s[i], (int)sub->val.s.s[i] ); 209 260 peer->client = tr_strndup( sub->val.s.s, sub->val.s.i ); 210 for( i=0; i<sub->val.s.i; ++i )211 if( !isprint(peer->client[i])) peer->client[i]='u';212 261 fprintf( stderr, "peer->client is now [%s]\n", peer->client ); 213 262 } … … 217 266 if( tr_bencIsInt( sub ) ) { 218 267 peer->listeningPort = htons( (uint16_t)sub->val.i ); 219 fprintf( stderr, "peer->port is now % d\n", peer->listeningPort );268 fprintf( stderr, "peer->port is now %hd\n", peer->listeningPort ); 220 269 } 221 270 … … 311 360 tr_peerConnectionReadBytes( peer->connection, inbuf, &id, 1 ); 312 361 msglen--; 313 fprintf( stderr, "got a message from the peer... bt id number is %d, and remaining len is %d\n", (int)id, (int)msglen ); 362 fprintf( stderr, "got a message from the peer... " 363 "bt id number is %d, and remaining len is %d\n", (int)id, (int)msglen ); 314 364 315 365 switch( id ) 316 366 { 317 367 case BT_CHOKE: 368 assert( msglen == 0 ); 318 369 fprintf( stderr, "got a BT_CHOKE\n" ); 319 peer->peerisChokingUs = 1; 370 peer->weAreChoked = 1; 371 tr_list_foreach( peer->peerAskedFor, tr_free ); 372 tr_list_free( &peer->peerAskedFor ); 320 373 /* FIXME: maybe choke them */ 321 /* FIXME: clear their outPieces queue */ 322 /* FIXME: unmark those outpieces as requested */ 374 /* FIXME: unmark anything we'd requested from them... */ 323 375 break; 324 376 325 377 case BT_UNCHOKE: 378 assert( msglen == 0 ); 326 379 fprintf( stderr, "got a BT_UNCHOKE\n" ); 327 peer-> peerisChokingUs= 0;380 peer->weAreChoked = 0; 328 381 /* FIXME: maybe unchoke them */ 329 382 /* FIXME: maybe send them requests */ … … 331 384 332 385 case BT_INTERESTED: 386 assert( msglen == 0 ); 333 387 fprintf( stderr, "got a BT_INTERESTED\n" ); 334 388 peer->peerIsInterested = 1; … … 337 391 338 392 case BT_NOT_INTERESTED: 393 assert( msglen == 0 ); 339 394 fprintf( stderr, "got a BT_NOT_INTERESTED\n" ); 340 395 peer->peerIsInterested = 0; … … 343 398 344 399 case BT_HAVE: 400 assert( msglen == 4 ); 345 401 fprintf( stderr, "got a BT_HAVE\n" ); 346 402 tr_peerConnectionReadUint32( peer->connection, inbuf, &ui32 ); … … 351 407 352 408 case BT_BITFIELD: 409 assert( msglen == peer->bitfield->len ); 353 410 fprintf( stderr, "got a BT_BITFIELD\n" ); 354 assert( msglen == peer->bitfield->len );355 411 tr_peerConnectionReadBytes( peer->connection, inbuf, peer->bitfield->bits, msglen ); 356 412 peer->progress = tr_bitfieldCountTrueBits( peer->bitfield ) / (float)peer->torrent->info.pieceCount; … … 360 416 break; 361 417 362 case BT_REQUEST: 418 case BT_REQUEST: { 419 struct peer_request * req; 420 assert( msglen == 12 ); 363 421 fprintf( stderr, "got a BT_REQUEST\n" ); 364 break; 365 366 case BT_PIECE: 422 req = tr_new( struct peer_request, 1 ); 423 tr_peerConnectionReadUint32( peer->connection, inbuf, &req->pieceIndex ); 424 tr_peerConnectionReadUint32( peer->connection, inbuf, &req->offsetInPiece ); 425 tr_peerConnectionReadUint32( peer->connection, inbuf, &req->length ); 426 if( !peer->peerIsChoked ) 427 tr_list_append( &peer->peerAskedFor, req ); 428 break; 429 } 430 431 case BT_CANCEL: { 432 struct peer_request req; 433 tr_list * node; 434 assert( msglen == 12 ); 435 fprintf( stderr, "got a BT_CANCEL\n" ); 436 tr_peerConnectionReadUint32( peer->connection, inbuf, &req.pieceIndex ); 437 tr_peerConnectionReadUint32( peer->connection, inbuf, &req.offsetInPiece ); 438 tr_peerConnectionReadUint32( peer->connection, inbuf, &req.length ); 439 node = tr_list_find( peer->peerAskedFor, &req, peer_request_compare_func ); 440 if( node != NULL ) { 441 fprintf( stderr, "found the req that peer is cancelling... cancelled.\n" ); 442 tr_list_remove_data( &peer->peerAskedFor, node->data ); 443 } 444 break; 445 } 446 447 case BT_PIECE: { 367 448 fprintf( stderr, "got a BT_PIECE\n" ); 368 break; 369 370 case BT_CANCEL: 371 fprintf( stderr, "got a BT_CANCEL\n" ); 372 break; 373 374 case BT_PORT: 449 assert( peer->blockToUs.length == 0 ); 450 peer->state = READING_BT_PIECE; 451 tr_peerConnectionReadUint32( peer->connection, inbuf, &peer->blockToUs.pieceIndex ); 452 tr_peerConnectionReadUint32( peer->connection, inbuf, &peer->blockToUs.offsetInPiece ); 453 peer->blockToUs.length = msglen - 8; 454 assert( peer->blockToUs.length > 0 ); 455 evbuffer_drain( peer->inBlock, ~0 ); 456 break; 457 } 458 459 case BT_PORT: { 460 assert( msglen == 2 ); 375 461 fprintf( stderr, "got a BT_PORT\n" ); 376 break; 462 tr_peerConnectionReadUint16( peer->connection, inbuf, &peer->listeningPort ); 463 break; 464 } 377 465 378 466 case BT_LTEP: … … 383 471 default: 384 472 fprintf( stderr, "got an unknown BT message type: %d\n", (int)id ); 473 tr_peerConnectionDrain( peer->connection, inbuf, msglen ); 385 474 assert( 0 ); 386 475 } … … 389 478 peer->state = AWAITING_BT_LENGTH; 390 479 return READ_AGAIN; 480 } 481 482 static int 483 canDownload( const tr_peer * peer ) 484 { 485 tr_torrent * tor = peer->torrent; 486 487 #if 0 488 /* FIXME: was swift worth it? did anyone notice a difference? :) */ 489 if( SWIFT_ENABLED && !isSeeding && (peer->credit<0) ) 490 return FALSE; 491 #endif 492 493 if( tor->downloadLimitMode == TR_SPEEDLIMIT_GLOBAL ) 494 return !tor->handle->useDownloadLimit || tr_rcCanTransfer( tor->handle->download ); 495 496 if( tor->downloadLimitMode == TR_SPEEDLIMIT_SINGLE ) 497 return tr_rcCanTransfer( tor->download ); 498 499 return TRUE; 500 } 501 502 static void 503 gotBlock( tr_peer * peer, int pieceIndex, int offset, struct evbuffer * inbuf ) 504 { 505 tr_torrent * tor = peer->torrent; 506 const size_t len = EVBUFFER_LENGTH( inbuf ); 507 const int block = _tr_block( tor, pieceIndex, offset ); 508 509 /* sanity clause */ 510 if( tr_cpBlockIsComplete( tor->completion, block ) ) { 511 tr_dbg( "have this block already..." ); 512 return; 513 } 514 if( (int)len != tr_torBlockCountBytes( tor, block ) ) { 515 tr_dbg( "block is the wrong length..." ); 516 return; 517 } 518 519 /* write to disk */ 520 if( tr_ioWrite( tor, pieceIndex, offset, len, EVBUFFER_DATA( inbuf ))) 521 return; 522 523 /* make a note that this peer helped us with this piece */ 524 if( !peer->blamefield ) 525 peer->blamefield = tr_bitfieldNew( tor->info.pieceCount ); 526 tr_bitfieldAdd( peer->blamefield, pieceIndex ); 527 528 tr_cpBlockAdd( tor->completion, block ); 529 530 tor->downloadedCur += len; 531 tr_rcTransferred( peer->rcToUs, len ); 532 tr_rcTransferred( tor->download, len ); 533 tr_rcTransferred( tor->handle->download, len ); 534 535 // broadcastCancel( tor, index, begin, len - 8 ); 536 } 537 538 539 static ReadState 540 readBtPiece( tr_peer * peer, struct evbuffer * inbuf ) 541 { 542 assert( peer->blockToUs.length > 0 ); 543 544 if( !canDownload( peer ) ) 545 { 546 peer->notListening = 1; 547 tr_peerConnectionSetIOMode ( peer->connection, 0, EV_READ ); 548 return READ_DONE; 549 } 550 else 551 { 552 /* inbuf -> inBlock */ 553 const uint32_t len = MIN( EVBUFFER_LENGTH(inbuf), peer->blockToUs.length ); 554 uint8_t * tmp = tr_new( uint8_t, len ); 555 tr_peerConnectionReadBytes( peer->connection, inbuf, tmp, len ); 556 evbuffer_add( peer->inBlock, tmp, len ); 557 tr_free( tmp ); 558 peer->blockToUs.length -= len; 559 560 if( !peer->blockToUs.length ) 561 { 562 gotBlock( peer, peer->blockToUs.pieceIndex, 563 peer->blockToUs.offsetInPiece, 564 peer->inBlock ); 565 evbuffer_drain( peer->outBlock, ~0 ); 566 peer->state = AWAITING_BT_LENGTH; 567 } 568 569 return READ_AGAIN; 570 } 391 571 } 392 572 … … 403 583 case AWAITING_BT_LENGTH: ret = readBtLength ( peer, inbuf ); break; 404 584 case AWAITING_BT_MESSAGE: ret = readBtMessage ( peer, inbuf ); break; 585 case READING_BT_PIECE: ret = readBtPiece ( peer, inbuf ); break; 405 586 default: assert( 0 ); 406 587 } 407 588 return ret; 408 }409 410 static void411 didWrite( struct bufferevent * evin UNUSED, void * vpeer )412 {413 tr_peer * peer = (tr_peer *) vpeer;414 fprintf( stderr, "peer %p got a didWrite...\n", peer );415 }416 417 static void418 gotError( struct bufferevent * evbuf UNUSED, short what, void * vpeer )419 {420 tr_peer * peer = (tr_peer *) vpeer;421 fprintf( stderr, "peer %p got an error in %d\n", peer, (int)what );422 589 } 423 590 … … 427 594 428 595 static int 596 canUpload( const tr_peer * peer ) 597 { 598 const tr_torrent * tor = peer->torrent; 599 600 if( tor->uploadLimitMode == TR_SPEEDLIMIT_GLOBAL ) 601 return !tor->handle->useUploadLimit || tr_rcCanTransfer( tor->handle->upload ); 602 603 if( tor->uploadLimitMode == TR_SPEEDLIMIT_SINGLE ) 604 return tr_rcCanTransfer( tor->upload ); 605 606 return TRUE; 607 } 608 609 static int 429 610 pulse( void * vpeer ) 430 611 { 431 612 tr_peer * peer = (tr_peer *) vpeer; 432 433 /* send out the non-piece messages. */ 434 if( EVBUFFER_LENGTH( peer->outMessages ) ) { 435 fprintf( stderr, "peer %p pulse is writing %d bytes worth of messages...\n", peer, (int)EVBUFFER_LENGTH(peer->outMessages) ); 613 size_t len; 614 615 /* if we froze out a downloaded block because of speed limits, 616 start listening to the peer again */ 617 if( peer->notListening ) 618 { 619 fprintf( stderr, "peer %p thawing out...\n", peer ); 620 peer->notListening = 0; 621 tr_peerConnectionSetIOMode ( peer->connection, EV_READ, 0 ); 622 } 623 624 if(( len = EVBUFFER_LENGTH( peer->outBlock ) )) 625 { 626 if( canUpload( peer ) ) 627 { 628 const size_t outlen = MIN( len, 2048 ); 629 tr_peerConnectionWrite( peer->connection, EVBUFFER_DATA(peer->outBlock), outlen ); 630 evbuffer_drain( peer->outBlock, outlen ); 631 } 632 } 633 else if(( len = EVBUFFER_LENGTH( peer->outMessages ) )) 634 { 635 fprintf( stderr, "peer %p pulse is writing %d bytes worth of messages...\n", peer, (int)len ); 436 636 tr_peerConnectionWriteBuf( peer->connection, peer->outMessages ); 437 evbuffer_drain( peer->outMessages, EVBUFFER_LENGTH( peer->outMessages ) ); 438 } 439 440 return TRUE; 637 evbuffer_drain( peer->outMessages, ~0 ); 638 } 639 else if(( peer->peerAskedFor )) 640 { 641 struct peer_request * req = (struct peer_request*) peer->peerAskedFor->data; 642 uint8_t * tmp = tr_new( uint8_t, req->length ); 643 const uint8_t msgid = BT_PIECE; 644 const uint32_t msglen = sizeof(uint8_t) + sizeof(uint32_t)*2 + req->length; 645 tr_ioRead( peer->torrent, req->pieceIndex, req->offsetInPiece, req->length, tmp ); 646 tr_peerConnectionWriteUint32( peer->connection, peer->outBlock, msglen ); 647 tr_peerConnectionWriteBytes ( peer->connection, peer->outBlock, &msgid, 1 ); 648 tr_peerConnectionWriteUint32( peer->connection, peer->outBlock, req->pieceIndex ); 649 tr_peerConnectionWriteUint32( peer->connection, peer->outBlock, req->offsetInPiece ); 650 tr_peerConnectionWriteBytes ( peer->connection, peer->outBlock, tmp, req->length ); 651 tr_free( tmp ); 652 } 653 654 return TRUE; /* loop forever */ 655 } 656 657 static void 658 didWrite( struct bufferevent * evin UNUSED, void * vpeer ) 659 { 660 tr_peer * peer = (tr_peer *) vpeer; 661 fprintf( stderr, "peer %p got a didWrite...\n", peer ); 662 pulse( vpeer ); 663 } 664 665 static void 666 gotError( struct bufferevent * evbuf UNUSED, short what, void * vpeer ) 667 { 668 tr_peer * peer = (tr_peer *) vpeer; 669 fprintf( stderr, "peer %p got an error in %d\n", peer, (int)what ); 441 670 } 442 671 … … 464 693 peer->torrent = torrent; 465 694 peer->connection = connection; 466 peer->rcIn = tr_rcInit( ); 467 peer->rcOut = tr_rcInit( ); 468 peer->weAreChokingThem = 1; 469 peer->peerisChokingUs = 1; 695 peer->weAreChoked = 1; 696 peer->peerIsChoked = 1; 470 697 peer->weAreInterested = 0; 471 698 peer->peerIsInterested = 0; … … 473 700 peer->bitfield = tr_bitfieldNew( torrent->info.pieceCount ); 474 701 peer->outMessages = evbuffer_new( ); 702 peer->outBlock = evbuffer_new( ); 703 peer->inBlock = evbuffer_new( ); 475 704 476 705 tr_peerConnectionSetIOFuncs( connection, canRead, didWrite, gotError, peer ); … … 479 708 sendBitfield( peer ); 480 709 } 710 711 void 712 tr_peerGetInfo( const tr_peer * peer, tr_peer_stat * setme ) 713 { 714 setme->client = peer->client; 715 setme->isConnected = TRUE; 716 setme->progress = peer->progress; 717 setme->downloadFromRate = tr_rcRate( peer->rcToUs ); 718 setme->downloadFromRate = tr_rcRate( peer->rcToPeer ); 719 720 //char addr[INET_ADDRSTRLEN]; 721 //int from; 722 //int port; 723 //int isDownloading; 724 //int isUploading; 725 726 } -
branches/encryption/libtransmission/peer-connection.c
r2946 r2949 419 419 *setme = ntohl( tmp ); 420 420 } 421 422 void 423 tr_peerConnectionDrain( tr_peerConnection * conn, 424 struct evbuffer * inbuf, 425 int byteCount ) 426 { 427 uint8_t * tmp = tr_new( uint8_t, byteCount ); 428 tr_peerConnectionReadBytes( conn, inbuf, tmp, byteCount ); 429 tr_free( tmp ); 430 } -
branches/encryption/libtransmission/peer-connection.h
r2946 r2949 152 152 uint32_t * setme ); 153 153 154 void tr_peerConnectionDrain ( tr_peerConnection * conn, 155 struct evbuffer * inbuf, 156 int byteCount ); 157 154 158 155 159 #endif -
branches/encryption/libtransmission/peermessages.h
r2941 r2949 144 144 buf += 4; 145 145 146 tr_ioRead( tor ->io, r->index, r->begin, r->length, buf );146 tr_ioRead( tor, r->index, r->begin, r->length, buf ); 147 147 148 148 peer_dbg( "SEND piece %d/%d (%d bytes)", -
branches/encryption/libtransmission/peerparse.h
r2942 r2949 335 335 336 336 /* Write to disk */ 337 if( ( ret = tr_ioWrite( tor ->io, index, begin, len - 8, &p[8] ) ) )337 if( ( ret = tr_ioWrite( tor, index, begin, len - 8, &p[8] ) ) ) 338 338 { 339 339 return ret; -
branches/encryption/libtransmission/torrent.c
r2942 r2949 894 894 ***/ 895 895 896 tr_peer_stat _t*896 tr_peer_stat * 897 897 tr_torrentPeers( const tr_torrent * tor, int * peerCount ) 898 898 { 899 tr_peer_stat _t* peers;899 tr_peer_stat * peers; 900 900 901 901 tr_torrentReaderLock( tor ); … … 903 903 *peerCount = tor->peerCount; 904 904 905 peers = tr_new0( tr_peer_stat _t, tor->peerCount );905 peers = tr_new0( tr_peer_stat, tor->peerCount ); 906 906 if (peers != NULL) 907 907 { … … 939 939 } 940 940 941 void tr_torrentPeersFree( tr_peer_stat _t* peers, int peerCount UNUSED )941 void tr_torrentPeersFree( tr_peer_stat * peers, int peerCount UNUSED ) 942 942 { 943 943 tr_free( peers ); -
branches/encryption/libtransmission/transmission.h
r2944 r2949 471 471 * tr_torrentPeers 472 472 ***********************************************************************/ 473 typedef struct tr_peer_stat_s tr_peer_stat_t; 474 tr_peer_stat_t * tr_torrentPeers( const tr_torrent *, int * peerCount ); 475 void tr_torrentPeersFree( tr_peer_stat_t *, int peerCount ); 473 typedef struct tr_peer_stat tr_peer_stat; 474 typedef struct tr_peer_stat tr_peer_stat_t; 475 tr_peer_stat * tr_torrentPeers( const tr_torrent *, int * peerCount ); 476 void tr_torrentPeersFree( tr_peer_stat *, int peerCount ); 476 477 477 478 typedef struct tr_file_stat_s tr_file_stat_t; … … 652 653 }; 653 654 654 struct tr_peer_stat _s655 struct tr_peer_stat 655 656 { 656 657 char addr[INET_ADDRSTRLEN];
Note: See TracChangeset
for help on using the changeset viewer.