Changeset 11548
- Timestamp:
- Dec 20, 2010, 2:07:51 AM (12 years ago)
- Location:
- trunk
- Files:
-
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/configure.ac
r11505 r11548 41 41 CURL_MINIMUM=7.15.4 42 42 AC_SUBST(CURL_MINIMUM) 43 LIBEVENT_MINIMUM= 1.4.943 LIBEVENT_MINIMUM=2.0.10 44 44 AC_SUBST(LIBEVENT_MINIUM) 45 45 OPENSSL_MINIMUM=0.9.4 … … 86 86 if test "x$GCC" = "xyes" ; then 87 87 88 CFLAGS="$CFLAGS -std=gnu99 -ggdb3 -Wall -W -Wpointer-arith -Wformat-security -Wcast-align -Wundef -Wcast-align -Wstrict-prototypes -Wmissing-declarations -Wmissing-format-attribute -Wredundant-decls -Wnested-externs -Wunused-parameter -Wwrite-strings -W aggregate-return -Winline -Wfloat-equal"88 CFLAGS="$CFLAGS -std=gnu99 -ggdb3 -Wall -W -Wpointer-arith -Wformat-security -Wcast-align -Wundef -Wcast-align -Wstrict-prototypes -Wmissing-declarations -Wmissing-format-attribute -Wredundant-decls -Wnested-externs -Wunused-parameter -Wwrite-strings -Winline -Wfloat-equal" 89 89 90 90 dnl figure out gcc version … … 123 123 PKG_CHECK_MODULES(OPENSSL, [openssl >= $OPENSSL_MINIMUM], , [CHECK_SSL()]) 124 124 PKG_CHECK_MODULES(LIBCURL, [libcurl >= $CURL_MINIMUM]) 125 PKG_CHECK_MODULES(LIBEVENT, [libevent >= $LIBEVENT_MINIMUM]) 125 126 AC_PATH_ZLIB 126 127 … … 204 205 205 206 206 dnl libevent207 dnl if the user specified LIBEVENT_LIBS or208 if test -n "$LIBEVENT_LIBS"; then209 user_specified_libevent=yes210 elif test -n "$LIBEVENT_CFLAGS"; then211 user_specified_libevent=yes212 fi213 if test "x$user_specified_libevent" = "xyes"; then214 AC_MSG_NOTICE([Using user-specified LIBEVENT_LIBS and LIBEVENT_CFLAGS])215 else216 AC_CHECK_LIB([event],[evutil_vsnprintf],217 [],218 [AC_MSG_ERROR(libevent $LIBEVENT_MINIMUM or higher not found!)],219 [$libevent_extra_libs])220 AC_CHECK_HEADER([event-config.h],[],221 [AC_MSG_ERROR(event-config.h not found!)])222 LIBEVENT_CFLAGS=""223 LIBEVENT_LIBS="-levent $libevent_extra_libs"224 fi225 AC_ARG_VAR([LIBEVENT_CFLAGS], [C compiler flags for LIBEVENT, overriding pkg-config])dnl226 AC_ARG_VAR([LIBEVENT_LIBS], [linker flags for LIBEVENT, overriding pkg-config])dnl227 228 229 230 207 dnl ---------------------------------------------------------------------------- 231 208 dnl -
trunk/gtk/tr-core.c
r11546 r11548 34 34 #endif 35 35 36 #include <event2/buffer.h> 37 36 38 #include <libtransmission/transmission.h> 37 39 #include <libtransmission/bencode.h> … … 1598 1600 tr_benc top; 1599 1601 int64_t intVal; 1600 GByteArray* response = vresponse;1601 1602 tr_jsonParse( NULL, response->data, response->len, &top, NULL );1602 struct evbuffer * response = vresponse; 1603 1604 tr_jsonParse( NULL, evbuffer_pullup( response, -1 ), evbuffer_get_length( response ), &top, NULL ); 1603 1605 1604 1606 if( tr_bencDictFindInt( &top, "tag", &intVal ) ) … … 1614 1616 1615 1617 tr_bencFree( &top ); 1616 g_byte_array_free( response, TRUE);1618 evbuffer_free( response ); 1617 1619 return FALSE; 1618 1620 } … … 1620 1622 static void 1621 1623 readResponse( tr_session * session UNUSED, 1622 const char * response, 1623 size_t response_len, 1624 struct evbuffer * response, 1624 1625 void * unused UNUSED ) 1625 1626 { 1626 GByteArray * bytes = g_byte_array_new( ); 1627 #ifdef DEBUG_RPC 1628 g_message( "response: [%*.*s]", (int)response_len, (int)response_len, response ); 1629 #endif 1630 g_byte_array_append( bytes, (const uint8_t*)response, response_len ); 1631 gtr_idle_add( readResponseIdle, bytes ); 1627 struct evbuffer * buf = evbuffer_new( ); 1628 evbuffer_add_buffer( buf, response ); 1629 gtr_idle_add( readResponseIdle, buf ); 1632 1630 } 1633 1631 -
trunk/libtransmission/announcer.c
r11451 r11548 14 14 #include <limits.h> 15 15 16 #include <event.h> 17 #include <evhttp.h> /* for HTTP_OK */ 16 #include <event2/buffer.h> 17 #include <event2/event.h> 18 #include <event2/http.h> /* for HTTP_OK */ 18 19 19 20 #include "transmission.h" … … 264 265 a->slotsAvailable = MAX_CONCURRENT_TASKS; 265 266 a->lpdHouseKeepingAt = relaxUntil; 266 a->upkeepTimer = tr_new0( struct event, 1 ); 267 evtimer_set( a->upkeepTimer, onUpkeepTimer, a ); 267 a->upkeepTimer = evtimer_new( NULL, onUpkeepTimer, a ); 268 268 tr_timerAdd( a->upkeepTimer, UPKEEP_INTERVAL_SECS, 0 ); 269 269 … … 280 280 flushCloseMessages( announcer ); 281 281 282 evtimer_del( announcer->upkeepTimer ); 283 tr_free( announcer->upkeepTimer ); 282 event_free( announcer->upkeepTimer ); 284 283 announcer->upkeepTimer = NULL; 285 284 … … 725 724 const char * ann = tracker->announce; 726 725 struct evbuffer * buf = evbuffer_new( ); 727 char * ret;728 726 const char * str; 729 727 const unsigned char * ipv6; … … 785 783 } 786 784 787 ret = tr_strndup( EVBUFFER_DATA( buf ), EVBUFFER_LENGTH( buf ) ); 788 dbgmsg( tier, "announce URL is \"%s\"", ret ); 789 evbuffer_free( buf ); 790 return ret; 785 return evbuffer_free_to_str( buf ); 791 786 } 792 787 -
trunk/libtransmission/bencode-test.c
r10760 r11548 4 4 #include <string.h> 5 5 6 #include <event .h>6 #include <event2/buffer.h> 7 7 8 8 #include "transmission.h" … … 326 326 tr_bencLoad( benc_str, strlen( benc_str ), &top, NULL ); 327 327 tr_bencToBuf( &top, TR_FMT_JSON, buf ); 328 serialized = (char*) EVBUFFER_DATA( buf);328 serialized = (char*) evbuffer_pullup( buf, -1 ); 329 329 stripWhitespace( serialized ); 330 330 #if 0 -
trunk/libtransmission/bencode.c
r11544 r11548 30 30 #include <unistd.h> /* stat() */ 31 31 32 #include <event .h> /* struct evbuffer */32 #include <event2/buffer.h> 33 33 34 34 #include "ConvertUTF.h" … … 1587 1587 tr_bencToBuf( const tr_benc * top, tr_fmt_mode mode, struct evbuffer * buf ) 1588 1588 { 1589 evbuffer_drain( buf, EVBUFFER_LENGTH( buf ) );1589 evbuffer_drain( buf, evbuffer_get_length( buf ) ); 1590 1590 evbuffer_expand( buf, 4096 ); /* alloc a little memory to start off with */ 1591 1591 … … 1603 1603 data.parents = NULL; 1604 1604 bencWalk( top, &jsonWalkFuncs, &data ); 1605 if( EVBUFFER_LENGTH( buf ) )1605 if( evbuffer_get_length( buf ) ) 1606 1606 evbuffer_add_printf( buf, "\n" ); 1607 1607 break; … … 1615 1615 char * ret; 1616 1616 struct evbuffer * buf = evbuffer_new( ); 1617 size_t n; 1617 1618 tr_bencToBuf( top, mode, buf ); 1618 ret = tr_strndup( EVBUFFER_DATA( buf ), EVBUFFER_LENGTH( buf ) ); 1619 n = evbuffer_get_length( buf ); 1620 ret = evbuffer_free_to_str( buf ); 1619 1621 if( len != NULL ) 1620 *len = (int) EVBUFFER_LENGTH( buf ); 1621 evbuffer_free( buf ); 1622 *len = (int) n; 1622 1623 return ret; 1623 1624 } … … 1667 1668 if( fd >= 0 ) 1668 1669 { 1669 int len; 1670 char * str = tr_bencToStr( top, mode, &len ); 1671 1672 if( write( fd, str, len ) == (ssize_t)len ) 1670 int nleft; 1671 1672 /* save the benc to a temporary file */ 1673 { 1674 struct evbuffer * buffer = evbuffer_new( ); 1675 tr_bencToBuf( top, mode, buffer ); 1676 nleft = evbuffer_get_length( buffer ); 1677 while( nleft > 0 ) { 1678 const int n = evbuffer_write( buffer, fd ); 1679 if( n < nleft ) 1680 fprintf( stderr, "wrote %d of %d to %s\n", n, nleft, tmp ); 1681 if( n >= 0 ) 1682 nleft -= n; 1683 else if( errno != EAGAIN ) { 1684 err = errno; 1685 break; 1686 } 1687 } 1688 evbuffer_free( buffer ); 1689 } 1690 1691 if( nleft > 0 ) 1692 { 1693 tr_err( _( "Couldn't save temporary file \"%1$s\": %2$s" ), tmp, tr_strerror( err ) ); 1694 tr_close_file( fd ); 1695 unlink( tmp ); 1696 } 1697 else 1673 1698 { 1674 1699 struct stat sb; … … 1698 1723 } 1699 1724 } 1700 else1701 {1702 err = errno;1703 tr_err( _( "Couldn't save temporary file \"%1$s\": %2$s" ), tmp, tr_strerror( err ) );1704 tr_close_file( fd );1705 unlink( tmp );1706 }1707 1708 tr_free( str );1709 1725 } 1710 1726 else -
trunk/libtransmission/handshake.c
r10912 r11548 18 18 #include <stdio.h> 19 19 20 #include <event .h>20 #include <event2/event.h> 21 21 22 22 #include "transmission.h" … … 121 121 handshakeDoneCB doneCB; 122 122 void * doneUserData; 123 struct event 123 struct event * timeout_timer; 124 124 }; 125 125 … … 266 266 267 267 dbgmsg( handshake, "payload: need %d, got %zu", 268 (int)HANDSHAKE_SIZE, EVBUFFER_LENGTH( inbuf ) );269 270 if( EVBUFFER_LENGTH( inbuf ) < HANDSHAKE_SIZE )268 (int)HANDSHAKE_SIZE, evbuffer_get_length( inbuf ) ); 269 270 if( evbuffer_get_length( inbuf ) < HANDSHAKE_SIZE ) 271 271 return READ_LATER; 272 272 … … 347 347 /* send it */ 348 348 setReadState( handshake, AWAITING_YB ); 349 tr_peerIoWrite ( handshake->io, outbuf, walk - outbuf, FALSE );349 tr_peerIoWriteBytes( handshake->io, outbuf, walk - outbuf, FALSE ); 350 350 } 351 351 … … 402 402 403 403 static int 404 readYb( tr_handshake * handshake, 405 struct evbuffer * inbuf ) 404 readYb( tr_handshake * handshake, struct evbuffer * inbuf ) 406 405 { 407 406 int isEncrypted; … … 411 410 size_t needlen = HANDSHAKE_NAME_LEN; 412 411 413 if( EVBUFFER_LENGTH( inbuf ) < needlen )412 if( evbuffer_get_length( inbuf ) < needlen ) 414 413 return READ_LATER; 415 414 416 isEncrypted = memcmp( EVBUFFER_DATA( inbuf), HANDSHAKE_NAME, HANDSHAKE_NAME_LEN );415 isEncrypted = memcmp( evbuffer_pullup( inbuf, HANDSHAKE_NAME_LEN ), HANDSHAKE_NAME, HANDSHAKE_NAME_LEN ); 417 416 if( isEncrypted ) 418 417 { 419 418 needlen = KEY_LEN; 420 if( EVBUFFER_LENGTH( inbuf ) < needlen )419 if( evbuffer_get_length( inbuf ) < needlen ) 421 420 return READ_LATER; 422 421 } … … 476 475 tr_peerIoSetEncryption( handshake->io, PEER_ENCRYPTION_RC4 ); 477 476 478 tr_peerIoWriteBytes( handshake->io, outbuf, vc, VC_LENGTH ); 479 tr_peerIoWriteUint32( handshake->io, outbuf, 480 getCryptoProvide( handshake ) ); 481 tr_peerIoWriteUint16( handshake->io, outbuf, 0 ); 477 evbuffer_add ( outbuf, vc, VC_LENGTH ); 478 evbuffer_add_uint32 ( outbuf, getCryptoProvide( handshake ) ); 479 evbuffer_add_uint16 ( outbuf, 0 ); 482 480 } 483 481 … … 487 485 buildHandshakeMessage( handshake, msg ); 488 486 489 tr_peerIoWriteUint16( handshake->io,outbuf, sizeof( msg ) );490 tr_peerIoWriteBytes( handshake->io,outbuf, msg, sizeof( msg ) );487 evbuffer_add_uint16 ( outbuf, sizeof( msg ) ); 488 evbuffer_add ( outbuf, msg, sizeof( msg ) ); 491 489 492 490 handshake->haveSentBitTorrentHandshake = 1; … … 516 514 for( ; ; ) 517 515 { 518 if( EVBUFFER_LENGTH( inbuf ) < VC_LENGTH )516 if( evbuffer_get_length( inbuf ) < VC_LENGTH ) 519 517 { 520 518 dbgmsg( handshake, "not enough bytes... returning read_more" ); … … 522 520 } 523 521 524 memcpy( tmp, EVBUFFER_DATA( inbuf), key_len );522 memcpy( tmp, evbuffer_pullup( inbuf, key_len ), key_len ); 525 523 tr_cryptoDecryptInit( handshake->crypto ); 526 524 tr_cryptoDecrypt( handshake->crypto, key_len, tmp, tmp ); … … 545 543 const size_t needlen = sizeof( uint32_t ) + sizeof( uint16_t ); 546 544 547 if( EVBUFFER_LENGTH( inbuf ) < needlen )545 if( evbuffer_get_length( inbuf ) < needlen ) 548 546 return READ_LATER; 549 547 … … 581 579 582 580 dbgmsg( handshake, "pad d: need %zu, got %zu", 583 needlen, EVBUFFER_LENGTH( inbuf ) );584 if( EVBUFFER_LENGTH( inbuf ) < needlen )581 needlen, evbuffer_get_length( inbuf ) ); 582 if( evbuffer_get_length( inbuf ) < needlen ) 585 583 return READ_LATER; 586 584 … … 611 609 612 610 dbgmsg( handshake, "payload: need %d, got %zu", 613 (int)INCOMING_HANDSHAKE_LEN, EVBUFFER_LENGTH( inbuf ) );614 615 if( EVBUFFER_LENGTH( inbuf ) < INCOMING_HANDSHAKE_LEN )611 (int)INCOMING_HANDSHAKE_LEN, evbuffer_get_length( inbuf ) ); 612 613 if( evbuffer_get_length( inbuf ) < INCOMING_HANDSHAKE_LEN ) 616 614 return READ_LATER; 617 615 618 616 handshake->haveReadAnythingFromPeer = TRUE; 619 617 620 pstrlen = EVBUFFER_DATA( inbuf)[0]; /* peek, don't read. We may be621 handing inbuf to AWAITING_YA */618 pstrlen = evbuffer_pullup( inbuf, 1 )[0]; /* peek, don't read. We may be 619 handing inbuf to AWAITING_YA */ 622 620 623 621 if( pstrlen == 19 ) /* unencrypted */ … … 713 711 uint8_t msg[HANDSHAKE_SIZE]; 714 712 buildHandshakeMessage( handshake, msg ); 715 tr_peerIoWrite ( handshake->io, msg, sizeof( msg ), FALSE );713 tr_peerIoWriteBytes( handshake->io, msg, sizeof( msg ), FALSE ); 716 714 handshake->haveSentBitTorrentHandshake = 1; 717 715 } … … 731 729 uint8_t peer_id[PEER_ID_LEN]; 732 730 733 if( EVBUFFER_LENGTH( inbuf ) < PEER_ID_LEN )731 if( evbuffer_get_length( inbuf ) < PEER_ID_LEN ) 734 732 return READ_LATER; 735 733 … … 760 758 761 759 dbgmsg( handshake, "in readYa... need %d, have %zu", 762 (int)KEY_LEN, EVBUFFER_LENGTH( inbuf ) );763 if( EVBUFFER_LENGTH( inbuf ) < KEY_LEN )760 (int)KEY_LEN, evbuffer_get_length( inbuf ) ); 761 if( evbuffer_get_length( inbuf ) < KEY_LEN ) 764 762 return READ_LATER; 765 763 … … 781 779 782 780 setReadState( handshake, AWAITING_PAD_A ); 783 tr_peerIoWrite ( handshake->io, outbuf, walk - outbuf, FALSE );781 tr_peerIoWriteBytes( handshake->io, outbuf, walk - outbuf, FALSE ); 784 782 return READ_NOW; 785 783 } 786 784 787 785 static int 788 readPadA( tr_handshake * handshake, 789 struct evbuffer * inbuf ) 790 { 791 uint8_t * pch; 792 793 dbgmsg( handshake, "looking to get past pad a... & resync on hash('req',S) ... have %zu bytes", 794 EVBUFFER_LENGTH( inbuf ) ); 795 /** 796 *** Resynchronizing on HASH('req1',S) 797 **/ 798 799 pch = memchr( EVBUFFER_DATA( inbuf ), 800 handshake->myReq1[0], 801 EVBUFFER_LENGTH( inbuf ) ); 802 if( pch == NULL ) 803 { 804 dbgmsg( handshake, "no luck so far.. draining %zu bytes", 805 EVBUFFER_LENGTH( inbuf ) ); 806 evbuffer_drain( inbuf, EVBUFFER_LENGTH( inbuf ) ); 786 readPadA( tr_handshake * handshake, struct evbuffer * inbuf ) 787 { 788 /* resynchronizing on HASH('req1',S) */ 789 struct evbuffer_ptr ptr = evbuffer_search( inbuf, (const char*)handshake->myReq1, SHA_DIGEST_LENGTH, NULL ); 790 791 if( ptr.pos != -1 ) /* match */ 792 { 793 evbuffer_drain( inbuf, ptr.pos ); 794 dbgmsg( handshake, "found it... looking setting to awaiting_crypto_provide" ); 795 setState( handshake, AWAITING_CRYPTO_PROVIDE ); 796 return READ_NOW; 797 } 798 else 799 { 800 const size_t len = evbuffer_get_length( inbuf ); 801 if( len > SHA_DIGEST_LENGTH ) 802 evbuffer_drain( inbuf, len - SHA_DIGEST_LENGTH ); 807 803 return READ_LATER; 808 804 } 809 dbgmsg( handshake, "looking for hash('req',S) ... draining %d bytes",810 (int)( pch - EVBUFFER_DATA( inbuf ) ) );811 evbuffer_drain( inbuf, pch - EVBUFFER_DATA( inbuf ) );812 if( EVBUFFER_LENGTH( inbuf ) < SHA_DIGEST_LENGTH )813 return READ_LATER;814 if( memcmp( EVBUFFER_DATA( inbuf ), handshake->myReq1,815 SHA_DIGEST_LENGTH ) )816 {817 dbgmsg( handshake, "draining one more byte" );818 evbuffer_drain( inbuf, 1 );819 return READ_NOW;820 }821 822 dbgmsg( handshake,823 "found it... looking setting to awaiting_crypto_provide" );824 setState( handshake, AWAITING_CRYPTO_PROVIDE );825 return READ_NOW;826 805 } 827 806 … … 848 827 tr_torrent * tor = NULL; 849 828 850 if( EVBUFFER_LENGTH( inbuf ) < needlen )829 if( evbuffer_get_length( inbuf ) < needlen ) 851 830 return READ_LATER; 852 831 … … 906 885 const size_t needlen = handshake->pad_c_len + sizeof( uint16_t ); 907 886 908 if( EVBUFFER_LENGTH( inbuf ) < needlen )887 if( evbuffer_get_length( inbuf ) < needlen ) 909 888 return READ_LATER; 910 889 … … 927 906 928 907 dbgmsg( handshake, "reading IA... have %zu, need %zu", 929 EVBUFFER_LENGTH( inbuf ), needlen );930 if( EVBUFFER_LENGTH( inbuf ) < needlen )908 evbuffer_get_length( inbuf ), needlen ); 909 if( evbuffer_get_length( inbuf ) < needlen ) 931 910 return READ_LATER; 932 911 … … 943 922 uint8_t vc[VC_LENGTH]; 944 923 memset( vc, 0, VC_LENGTH ); 945 tr_peerIoWriteBytes( handshake->io,outbuf, vc, VC_LENGTH );924 evbuffer_add( outbuf, vc, VC_LENGTH ); 946 925 } 947 926 … … 951 930 { 952 931 dbgmsg( handshake, "selecting crypto mode '%d'", (int)crypto_select ); 953 tr_peerIoWriteUint32( handshake->io,outbuf, crypto_select );932 evbuffer_add_uint32( outbuf, crypto_select ); 954 933 } 955 934 else … … 966 945 { 967 946 const uint16_t len = 0; 968 tr_peerIoWriteUint16( handshake->io,outbuf, len );947 evbuffer_add_uint16( outbuf, len ); 969 948 } 970 949 … … 982 961 buildHandshakeMessage( handshake, msg ); 983 962 984 tr_peerIoWriteBytes( handshake->io,outbuf, msg, sizeof( msg ) );963 evbuffer_add( outbuf, msg, sizeof( msg ) ); 985 964 handshake->haveSentBitTorrentHandshake = 1; 986 965 } … … 1003 982 1004 983 dbgmsg( handshake, "reading payload stream... have %zu, need %zu", 1005 EVBUFFER_LENGTH( inbuf ), needlen );1006 if( EVBUFFER_LENGTH( inbuf ) < needlen )984 evbuffer_get_length( inbuf ), needlen ); 985 if( evbuffer_get_length( inbuf ) < needlen ) 1007 986 return READ_LATER; 1008 987 … … 1086 1065 readyForMore = FALSE; 1087 1066 else if( handshake->state == AWAITING_PAD_C ) 1088 readyForMore = EVBUFFER_LENGTH( inbuf ) >= handshake->pad_c_len;1067 readyForMore = evbuffer_get_length( inbuf ) >= handshake->pad_c_len; 1089 1068 else if( handshake->state == AWAITING_PAD_D ) 1090 readyForMore = EVBUFFER_LENGTH( inbuf ) >= handshake->pad_d_len;1069 readyForMore = evbuffer_get_length( inbuf ) >= handshake->pad_d_len; 1091 1070 else if( handshake->state == AWAITING_IA ) 1092 readyForMore = EVBUFFER_LENGTH( inbuf ) >= handshake->ia_len;1071 readyForMore = evbuffer_get_length( inbuf ) >= handshake->ia_len; 1093 1072 } 1094 1073 … … 1118 1097 tr_peerIoUnref( handshake->io ); /* balanced by the ref in tr_handshakeNew */ 1119 1098 1120 evtimer_del( &handshake->timeout_timer ); 1121 1099 event_free( handshake->timeout_timer ); 1122 1100 tr_free( handshake ); 1123 1101 } … … 1167 1145 handshake->haveSentBitTorrentHandshake = 1; 1168 1146 setReadState( handshake, AWAITING_HANDSHAKE ); 1169 tr_peerIoWrite ( handshake->io, msg, sizeof( msg ), FALSE );1147 tr_peerIoWriteBytes( handshake->io, msg, sizeof( msg ), FALSE ); 1170 1148 } 1171 1149 else … … 1202 1180 handshake->doneUserData = doneUserData; 1203 1181 handshake->session = tr_peerIoGetSession( io ); 1204 1205 evtimer_set( &handshake->timeout_timer, handshakeTimeout, handshake ); 1206 tr_timerAdd( &handshake->timeout_timer, HANDSHAKE_TIMEOUT_SEC, 0 ); 1182 handshake->timeout_timer = evtimer_new( NULL, handshakeTimeout, handshake ); 1183 tr_timerAdd( handshake->timeout_timer, HANDSHAKE_TIMEOUT_SEC, 0 ); 1207 1184 1208 1185 tr_peerIoRef( io ); /* balanced by the unref in tr_handshakeFree */ … … 1221 1198 handshake->haveSentBitTorrentHandshake = 1; 1222 1199 setReadState( handshake, AWAITING_HANDSHAKE ); 1223 tr_peerIoWrite ( handshake->io, msg, sizeof( msg ), FALSE );1200 tr_peerIoWriteBytes( handshake->io, msg, sizeof( msg ), FALSE ); 1224 1201 } 1225 1202 -
trunk/libtransmission/metainfo.c
r11398 r11548 20 20 #include <unistd.h> /* unlink, stat */ 21 21 22 #include <event .h> /* struct evbuffer */22 #include <event2/buffer.h> 23 23 24 24 #include "transmission.h" … … 155 155 { 156 156 int i; 157 char * tmp; 157 158 const int n = tr_bencListSize( path ); 158 159 struct evbuffer * buf = evbuffer_new( ); … … 169 170 } 170 171 171 *setme = tr_utf8clean( (char*)EVBUFFER_DATA( buf ), EVBUFFER_LENGTH( buf ) ); 172 tmp = evbuffer_free_to_str( buf ); 173 *setme = tr_utf8clean( tmp, -1 ); 174 tr_free( tmp ); 172 175 /* fprintf( stderr, "[%s]\n", *setme ); */ 173 evbuffer_free( buf );174 176 success = TRUE; 175 177 } -
trunk/libtransmission/peer-io.c
r11398 r11548 24 24 #endif 25 25 26 #include <event.h> 26 #include <event2/event.h> 27 #include <event2/bufferevent.h> 27 28 28 29 #include "transmission.h" … … 144 145 { 145 146 size_t piece = 0; 146 const size_t oldLen = EVBUFFER_LENGTH( io->inbuf );147 const size_t oldLen = evbuffer_get_length( io->inbuf ); 147 148 const int ret = io->canRead( io, io->userData, &piece ); 148 149 149 const size_t used = oldLen - EVBUFFER_LENGTH( io->inbuf );150 const size_t used = oldLen - evbuffer_get_length( io->inbuf ); 150 151 151 152 assert( tr_isPeerIo( io ) ); … … 165 166 { 166 167 case READ_NOW: 167 if( EVBUFFER_LENGTH( io->inbuf ) )168 if( evbuffer_get_length( io->inbuf ) ) 168 169 continue; 169 170 done = 1; … … 183 184 184 185 tr_sessionUnlock( session ); 185 }186 187 /* keep the iobuf's excess capacity from growing too large */188 if( EVBUFFER_LENGTH( io->inbuf ) == 0 ) {189 evbuffer_free( io->inbuf );190 io->inbuf = evbuffer_new( );191 186 } 192 187 … … 223 218 io->pendingEvents &= ~EV_READ; 224 219 225 curlen = EVBUFFER_LENGTH( io->inbuf );220 curlen = evbuffer_get_length( io->inbuf ); 226 221 howmuch = curlen >= max ? 0 : max - curlen; 227 222 howmuch = tr_bandwidthClamp( &io->bandwidth, TR_DOWN, howmuch ); … … 249 244 { 250 245 char errstr[512]; 251 short what = EVBUFFER_READ;246 short what = BEV_EVENT_READING; 252 247 253 248 if( res == 0 ) /* EOF */ 254 what |= EVBUFFER_EOF;249 what |= BEV_EVENT_EOF; 255 250 else if( res == -1 ) { 256 251 if( e == EAGAIN || e == EINTR ) { … … 258 253 return; 259 254 } 260 what |= EVBUFFER_ERROR;255 what |= BEV_EVENT_ERROR; 261 256 } 262 257 … … 275 270 int n; 276 271 char errstr[256]; 277 struct evbuffer * buffer = io->outbuf; 278 279 howmuch = MIN( EVBUFFER_LENGTH( buffer ), howmuch ); 272 const size_t len = evbuffer_get_length( io->outbuf ); 273 const int vecCount = evbuffer_peek( io->outbuf, len, NULL, NULL, 0 ); 280 274 281 275 EVUTIL_SET_SOCKET_ERROR( 0 ); 282 #ifdef WIN32 283 n = (int) send(fd, buffer->buffer, howmuch, 0 ); 284 #else 285 n = (int) write(fd, buffer->buffer, howmuch ); 286 #endif 276 n = evbuffer_write_atmost( io->outbuf, fd, howmuch ); 287 277 e = EVUTIL_SOCKET_ERROR( ); 288 278 dbgmsg( io, "wrote %d to peer (%s)", n, (n==-1?tr_net_strerror(errstr,sizeof(errstr),e):"") ); 289 279 290 if( n > 0 )291 evbuffer_drain( buffer, (size_t)n );292 293 /* keep the iobuf's excess capacity from growing too large */294 if( EVBUFFER_LENGTH( io->outbuf ) == 0 ) {295 evbuffer_free( io->outbuf );296 io->outbuf = evbuffer_new( );297 }298 299 280 return n; 300 281 } … … 305 286 int res = 0; 306 287 int e; 307 short what = EVBUFFER_WRITE;288 short what = BEV_EVENT_WRITING; 308 289 tr_peerIo * io = vio; 309 290 size_t howmuch; … … 319 300 /* Write as much as possible, since the socket is non-blocking, write() will 320 301 * return if it can't write any more data without blocking */ 321 howmuch = tr_bandwidthClamp( &io->bandwidth, dir, EVBUFFER_LENGTH( io->outbuf ) );302 howmuch = tr_bandwidthClamp( &io->bandwidth, dir, evbuffer_get_length( io->outbuf ) ); 322 303 323 304 /* if we don't have any bandwidth left, stop writing */ … … 332 313 333 314 if (res == -1) { 334 if ( e == EAGAIN || e == EINTR || e == EINPROGRESS)315 if (!e || e == EAGAIN || e == EINTR || e == EINPROGRESS) 335 316 goto reschedule; 336 317 /* error case */ 337 what |= EVBUFFER_ERROR;318 what |= BEV_EVENT_ERROR; 338 319 } else if (res == 0) { 339 320 /* eof case */ 340 what |= EVBUFFER_EOF;321 what |= BEV_EVENT_EOF; 341 322 } 342 323 if (res <= 0) 343 324 goto error; 344 325 345 if( EVBUFFER_LENGTH( io->outbuf ) )326 if( evbuffer_get_length( io->outbuf ) ) 346 327 tr_peerIoSetEnabled( io, dir, TRUE ); 347 328 … … 350 331 351 332 reschedule: 352 if( EVBUFFER_LENGTH( io->outbuf ) )333 if( evbuffer_get_length( io->outbuf ) ) 353 334 tr_peerIoSetEnabled( io, dir, TRUE ); 354 335 return; … … 416 397 io->inbuf = evbuffer_new( ); 417 398 io->outbuf = evbuffer_new( ); 399 io->event_read = event_new( NULL, io->socket, EV_READ, event_read_cb, io ); 400 io->event_write = event_new( NULL, io->socket, EV_WRITE, event_write_cb, io ); 418 401 tr_bandwidthConstruct( &io->bandwidth, session, parent ); 419 402 tr_bandwidthSetPeer( &io->bandwidth, io ); 420 403 dbgmsg( io, "bandwidth is %p; its parent is %p", &io->bandwidth, parent ); 421 422 event_set( &io->event_read, io->socket, EV_READ, event_read_cb, io );423 event_set( &io->event_write, io->socket, EV_WRITE, event_write_cb, io );424 404 425 405 return io; … … 471 451 assert( io->session != NULL ); 472 452 assert( io->session->events != NULL ); 473 assert( event_initialized( &io->event_read ) );474 assert( event_initialized( &io->event_write ) );453 assert( event_initialized( io->event_read ) ); 454 assert( event_initialized( io->event_write ) ); 475 455 476 456 if( io->socket < 0 ) … … 480 460 { 481 461 dbgmsg( io, "enabling libevent ready-to-read polling" ); 482 event_add( &io->event_read, NULL );462 event_add( io->event_read, NULL ); 483 463 io->pendingEvents |= EV_READ; 484 464 } … … 487 467 { 488 468 dbgmsg( io, "enabling libevent ready-to-write polling" ); 489 event_add( &io->event_write, NULL );469 event_add( io->event_write, NULL ); 490 470 io->pendingEvents |= EV_WRITE; 491 471 } … … 498 478 assert( io->session != NULL ); 499 479 assert( io->session->events != NULL ); 500 assert( event_initialized( &io->event_read ) );501 assert( event_initialized( &io->event_write ) );480 assert( event_initialized( io->event_read ) ); 481 assert( event_initialized( io->event_write ) ); 502 482 503 483 if( ( event & EV_READ ) && ( io->pendingEvents & EV_READ ) ) 504 484 { 505 485 dbgmsg( io, "disabling libevent ready-to-read polling" ); 506 event_del( &io->event_read );486 event_del( io->event_read ); 507 487 io->pendingEvents &= ~EV_READ; 508 488 } … … 511 491 { 512 492 dbgmsg( io, "disabling libevent ready-to-write polling" ); 513 event_del( &io->event_write );493 event_del( io->event_write ); 514 494 io->pendingEvents &= ~EV_WRITE; 515 495 } … … 549 529 dbgmsg( io, "in tr_peerIo destructor" ); 550 530 event_disable( io, EV_READ | EV_WRITE ); 531 event_free( io->event_read ); 532 event_free( io->event_write ); 551 533 tr_bandwidthDestruct( &io->bandwidth ); 552 534 evbuffer_free( io->outbuf ); … … 662 644 tr_netClose( session, io->socket ); 663 645 646 event_del( io->event_read ); 647 event_del( io->event_write ); 664 648 io->socket = tr_netOpenPeerSocket( session, &io->addr, io->port, io->isSeed ); 665 event_set( &io->event_read, io->socket, EV_READ, event_read_cb, io );666 event_set( &io->event_write, io->socket, EV_WRITE, event_write_cb, io );649 io->event_read = event_new( NULL, io->socket, EV_READ, event_read_cb, io ); 650 io->event_write = event_new( NULL, io->socket, EV_WRITE, event_write_cb, io ); 667 651 668 652 if( io->socket >= 0 ) … … 746 730 { 747 731 const size_t desiredLen = getDesiredOutputBufferSize( io, now ); 748 const size_t currentLen = EVBUFFER_LENGTH( io->outbuf );732 const size_t currentLen = evbuffer_get_length( io->outbuf ); 749 733 size_t freeSpace = 0; 750 734 … … 773 757 **/ 774 758 775 void 776 tr_peerIoWrite( tr_peerIo * io, 777 const void * bytes, 778 size_t byteCount, 779 tr_bool isPieceData ) 780 { 781 /* FIXME(libevent2): this implementation snould be moved to tr_peerIoWriteBuf. This function should be implemented as evbuffer_new() + evbuffer_add_reference() + a call to tr_peerIoWriteBuf() + evbuffer_free() */ 782 struct tr_datatype * datatype; 783 784 assert( tr_amInEventThread( io->session ) ); 785 dbgmsg( io, "adding %zu bytes into io->output", byteCount ); 786 787 datatype = tr_new( struct tr_datatype, 1 ); 788 datatype->isPieceData = isPieceData != 0; 789 datatype->length = byteCount; 790 tr_list_append( &io->outbuf_datatypes, datatype ); 791 792 switch( io->encryptionMode ) 793 { 794 case PEER_ENCRYPTION_RC4: 795 { 796 /* FIXME(libevent2): use evbuffer_reserve_space() and evbuffer_commit_space() instead of tmp */ 797 void * tmp = tr_sessionGetBuffer( io->session ); 798 const size_t tmplen = SESSION_BUFFER_SIZE; 799 const uint8_t * walk = bytes; 800 evbuffer_expand( io->outbuf, byteCount ); 801 while( byteCount > 0 ) 802 { 803 const size_t thisPass = MIN( byteCount, tmplen ); 804 tr_cryptoEncrypt( io->crypto, thisPass, walk, tmp ); 805 evbuffer_add( io->outbuf, tmp, thisPass ); 806 walk += thisPass; 807 byteCount -= thisPass; 808 } 809 tr_sessionReleaseBuffer( io->session ); 810 break; 811 } 812 813 case PEER_ENCRYPTION_NONE: 814 evbuffer_add( io->outbuf, bytes, byteCount ); 815 break; 816 817 default: 818 assert( 0 ); 819 break; 820 } 821 } 822 823 void 824 tr_peerIoWriteBuf( tr_peerIo * io, 825 struct evbuffer * buf, 826 tr_bool isPieceData ) 827 { 828 /* FIXME(libevent2): loop through calls to evbuffer_get_contiguous_space() + evbuffer_drain() */ 829 const size_t n = EVBUFFER_LENGTH( buf ); 830 tr_peerIoWrite( io, EVBUFFER_DATA( buf ), n, isPieceData ); 831 evbuffer_drain( buf, n ); 832 } 833 834 void 835 tr_peerIoWriteUint16( tr_peerIo * io, 836 struct evbuffer * outbuf, 837 uint16_t writeme ) 838 { 839 const uint16_t tmp = htons( writeme ); 840 tr_peerIoWriteBytes( io, outbuf, &tmp, sizeof( uint16_t ) ); 841 } 842 843 void 844 tr_peerIoWriteUint32( tr_peerIo * io, 845 struct evbuffer * outbuf, 846 uint32_t writeme ) 847 { 848 const uint32_t tmp = htonl( writeme ); 849 tr_peerIoWriteBytes( io, outbuf, &tmp, sizeof( uint32_t ) ); 759 static void 760 addDatatype( tr_peerIo * io, size_t byteCount, tr_bool isPieceData ) 761 { 762 struct tr_datatype * d; 763 764 d = tr_new( struct tr_datatype, 1 ); 765 d->isPieceData = isPieceData != 0; 766 d->length = byteCount; 767 tr_list_append( &io->outbuf_datatypes, d ); 768 } 769 770 static struct evbuffer_iovec * 771 evbuffer_peek_all( struct evbuffer * buf, size_t * setme_vecCount ) 772 { 773 const size_t byteCount = evbuffer_get_length( buf ); 774 const int vecCount = evbuffer_peek( buf, byteCount, NULL, NULL, 0 ); 775 struct evbuffer_iovec * iovec = tr_new0( struct evbuffer_iovec, vecCount ); 776 const int n = evbuffer_peek( buf, byteCount, NULL, iovec, vecCount ); 777 assert( vecCount == n ); 778 *setme_vecCount = vecCount; 779 return iovec; 780 } 781 782 static void 783 maybeEncryptBuffer( tr_peerIo * io, struct evbuffer * buf ) 784 { 785 if( io->encryptionMode == PEER_ENCRYPTION_RC4 ) 786 { 787 size_t i, n; 788 struct evbuffer_iovec * iovec = evbuffer_peek_all( buf, &n ); 789 790 for( i=0; i<n; ++i ) 791 tr_cryptoEncrypt( io->crypto, iovec[i].iov_len, iovec[i].iov_base, iovec[i].iov_base ); 792 793 tr_free( iovec ); 794 } 795 } 796 797 void 798 tr_peerIoWriteBuf( tr_peerIo * io, struct evbuffer * buf, tr_bool isPieceData ) 799 { 800 const size_t byteCount = evbuffer_get_length( buf ); 801 maybeEncryptBuffer( io, buf ); 802 evbuffer_add_buffer( io->outbuf, buf ); 803 addDatatype( io, byteCount, isPieceData ); 804 } 805 806 void 807 tr_peerIoWriteBytes( tr_peerIo * io, const void * bytes, size_t byteCount, tr_bool isPieceData ) 808 { 809 struct evbuffer * buf = evbuffer_new( ); 810 evbuffer_add( buf, bytes, byteCount ); 811 tr_peerIoWriteBuf( io, buf, isPieceData ); 812 evbuffer_free( buf ); 850 813 } 851 814 … … 855 818 856 819 void 857 tr_peerIoReadBytes( tr_peerIo * io, 858 struct evbuffer * inbuf, 859 void * bytes, 860 size_t byteCount ) 861 { 862 assert( tr_isPeerIo( io ) ); 863 /* FIXME(libevent2): use evbuffer_get_length() */ 864 assert( EVBUFFER_LENGTH( inbuf ) >= byteCount ); 820 evbuffer_add_uint16( struct evbuffer * outbuf, uint16_t addme_hs ) 821 { 822 const uint16_t ns = htons( addme_hs ); 823 evbuffer_add( outbuf, &ns, sizeof( ns ) ); 824 } 825 826 void 827 evbuffer_add_uint32( struct evbuffer * outbuf, uint32_t addme_hl ) 828 { 829 const uint32_t nl = htonl( addme_hl ); 830 evbuffer_add( outbuf, &nl, sizeof( nl ) ); 831 } 832 833 /*** 834 **** 835 ***/ 836 837 void 838 tr_peerIoReadBytes( tr_peerIo * io, struct evbuffer * inbuf, void * bytes, size_t byteCount ) 839 { 840 assert( tr_isPeerIo( io ) ); 841 assert( evbuffer_get_length( inbuf ) >= byteCount ); 865 842 866 843 switch( io->encryptionMode ) … … 871 848 872 849 case PEER_ENCRYPTION_RC4: 873 /* FIXME(libevent2): loop through calls to evbuffer_get_contiguous_space() + evbuffer_drain() */ 874 tr_cryptoDecrypt( io->crypto, byteCount, EVBUFFER_DATA(inbuf), bytes ); 875 evbuffer_drain(inbuf, byteCount ); 850 evbuffer_remove( inbuf, bytes, byteCount ); 851 tr_cryptoDecrypt( io->crypto, byteCount, bytes, bytes ); 876 852 break; 877 853 … … 937 913 dbgmsg( io, "read %d from peer (%s)", res, (res==-1?strerror(e):"") ); 938 914 939 if( EVBUFFER_LENGTH( io->inbuf ) )915 if( evbuffer_get_length( io->inbuf ) ) 940 916 canReadWrapper( io ); 941 917 … … 943 919 { 944 920 char errstr[512]; 945 short what = EVBUFFER_READ | EVBUFFER_ERROR;921 short what = BEV_EVENT_READING | BEV_EVENT_ERROR; 946 922 if( res == 0 ) 947 what |= EVBUFFER_EOF;923 what |= BEV_EVENT_EOF; 948 924 tr_net_strerror( errstr, sizeof( errstr ), e ); 949 925 dbgmsg( io, "tr_peerIoTryRead got an error. res is %d, what is %hd, errno is %d (%s)", res, what, e, errstr ); … … 970 946 didWriteWrapper( io, n ); 971 947 972 if( ( n < 0 ) && ( io->gotError ) && ( e != EPIPE ) && ( e != EAGAIN ) && ( e != EINTR ) && ( e != EINPROGRESS ) )948 if( ( n < 0 ) && ( io->gotError ) && e && ( e != EPIPE ) && ( e != EAGAIN ) && ( e != EINTR ) && ( e != EINPROGRESS ) ) 973 949 { 974 950 char errstr[512]; 975 const short what = EVBUFFER_WRITE | EVBUFFER_ERROR;951 const short what = BEV_EVENT_WRITING | BEV_EVENT_ERROR; 976 952 977 953 tr_net_strerror( errstr, sizeof( errstr ), e ); -
trunk/libtransmission/peer-io.h
r11299 r11548 24 24 #include <assert.h> 25 25 26 #include <event.h> 26 #include <event2/buffer.h> 27 #include <event2/event.h> 27 28 28 29 #include "transmission.h" … … 110 111 struct tr_list * outbuf_datatypes; /* struct tr_datatype */ 111 112 112 struct event 113 struct event 113 struct event * event_read; 114 struct event * event_write; 114 115 } 115 116 tr_peerIo; … … 249 250 **/ 250 251 251 void tr_peerIoWrite 252 void tr_peerIoWriteBytes ( tr_peerIo * io, 252 253 const void * writeme, 253 254 size_t writemeLen, … … 283 284 } 284 285 285 static inline void tr_peerIoWriteBytes( tr_peerIo * io UNUSED, 286 struct evbuffer * outbuf, 287 const void * bytes, 288 size_t byteCount ) 289 { 290 evbuffer_add( outbuf, bytes, byteCount ); 291 } 292 293 static inline void tr_peerIoWriteUint8( tr_peerIo * io, 294 struct evbuffer * outbuf, 295 uint8_t writeme ) 296 { 297 tr_peerIoWriteBytes( io, outbuf, &writeme, sizeof( uint8_t ) ); 298 } 299 300 void tr_peerIoWriteUint16( tr_peerIo * io, 301 struct evbuffer * outbuf, 302 uint16_t writeme ); 303 304 void tr_peerIoWriteUint32( tr_peerIo * io, 305 struct evbuffer * outbuf, 306 uint32_t writeme ); 286 static inline void 287 evbuffer_add_uint8( struct evbuffer * outbuf, uint8_t byte ) 288 { 289 evbuffer_add( outbuf, &byte, 1 ); 290 } 291 292 void evbuffer_add_uint16( struct evbuffer * outbuf, uint16_t hs ); 293 void evbuffer_add_uint32( struct evbuffer * outbuf, uint32_t hl ); 307 294 308 295 void tr_peerIoReadBytes( tr_peerIo * io, -
trunk/libtransmission/peer-msgs.c
r11509 r11548 19 19 #include <string.h> 20 20 21 #include <event.h> 21 #include <event2/bufferevent.h> 22 #include <event2/event.h> 22 23 23 24 #include "transmission.h" … … 228 229 int64_t reqq; 229 230 230 struct event 231 struct event * pexTimer; 231 232 }; 232 233 … … 278 279 va_end( args ); 279 280 evbuffer_add_printf( buf, " (%s:%d)\n", base, line ); 280 /* FIXME(libevent2) tr_getLog() should return an fd, then use evbuffer_write() here */ 281 fwrite( EVBUFFER_DATA( buf ), 1, EVBUFFER_LENGTH( buf ), fp ); 281 fwrite( evbuffer_pullup( buf, -1 ), 1, evbuffer_get_length( buf ), fp ); 282 282 283 283 tr_free( base ); … … 310 310 dbgOutMessageLen( tr_peermsgs * msgs ) 311 311 { 312 dbgmsg( msgs, "outMessage size is now %zu", EVBUFFER_LENGTH( msgs->outMessages ) );312 dbgmsg( msgs, "outMessage size is now %zu", evbuffer_get_length( msgs->outMessages ) ); 313 313 } 314 314 … … 316 316 protocolSendReject( tr_peermsgs * msgs, const struct peer_request * req ) 317 317 { 318 tr_peerIo * io = msgs->peer->io;319 318 struct evbuffer * out = msgs->outMessages; 320 319 321 320 assert( tr_peerIoSupportsFEXT( msgs->peer->io ) ); 322 321 323 tr_peerIoWriteUint32( io,out, sizeof( uint8_t ) + 3 * sizeof( uint32_t ) );324 tr_peerIoWriteUint8 ( io,out, BT_FEXT_REJECT );325 tr_peerIoWriteUint32( io,out, req->index );326 tr_peerIoWriteUint32( io,out, req->offset );327 tr_peerIoWriteUint32( io,out, req->length );322 evbuffer_add_uint32( out, sizeof( uint8_t ) + 3 * sizeof( uint32_t ) ); 323 evbuffer_add_uint8 ( out, BT_FEXT_REJECT ); 324 evbuffer_add_uint32( out, req->index ); 325 evbuffer_add_uint32( out, req->offset ); 326 evbuffer_add_uint32( out, req->length ); 328 327 329 328 dbgmsg( msgs, "rejecting %u:%u->%u...", req->index, req->offset, req->length ); … … 332 331 333 332 static void 334 protocolSendRequest( tr_peermsgs * msgs, 335 const struct peer_request * req ) 336 { 337 tr_peerIo * io = msgs->peer->io; 333 protocolSendRequest( tr_peermsgs * msgs, const struct peer_request * req ) 334 { 338 335 struct evbuffer * out = msgs->outMessages; 339 336 340 tr_peerIoWriteUint32( io,out, sizeof( uint8_t ) + 3 * sizeof( uint32_t ) );341 tr_peerIoWriteUint8 ( io,out, BT_REQUEST );342 tr_peerIoWriteUint32( io,out, req->index );343 tr_peerIoWriteUint32( io,out, req->offset );344 tr_peerIoWriteUint32( io,out, req->length );337 evbuffer_add_uint32( out, sizeof( uint8_t ) + 3 * sizeof( uint32_t ) ); 338 evbuffer_add_uint8 ( out, BT_REQUEST ); 339 evbuffer_add_uint32( out, req->index ); 340 evbuffer_add_uint32( out, req->offset ); 341 evbuffer_add_uint32( out, req->length ); 345 342 346 343 dbgmsg( msgs, "requesting %u:%u->%u...", req->index, req->offset, req->length ); … … 350 347 351 348 static void 352 protocolSendCancel( tr_peermsgs * msgs, 353 const struct peer_request * req ) 354 { 355 tr_peerIo * io = msgs->peer->io; 349 protocolSendCancel( tr_peermsgs * msgs, const struct peer_request * req ) 350 { 356 351 struct evbuffer * out = msgs->outMessages; 357 352 358 tr_peerIoWriteUint32( io,out, sizeof( uint8_t ) + 3 * sizeof( uint32_t ) );359 tr_peerIoWriteUint8 ( io,out, BT_CANCEL );360 tr_peerIoWriteUint32( io,out, req->index );361 tr_peerIoWriteUint32( io,out, req->offset );362 tr_peerIoWriteUint32( io,out, req->length );353 evbuffer_add_uint32( out, sizeof( uint8_t ) + 3 * sizeof( uint32_t ) ); 354 evbuffer_add_uint8 ( out, BT_CANCEL ); 355 evbuffer_add_uint32( out, req->index ); 356 evbuffer_add_uint32( out, req->offset ); 357 evbuffer_add_uint32( out, req->length ); 363 358 364 359 dbgmsg( msgs, "cancelling %u:%u->%u...", req->index, req->offset, req->length ); … … 370 365 protocolSendPort(tr_peermsgs *msgs, uint16_t port) 371 366 { 372 tr_peerIo * io = msgs->peer->io;373 367 struct evbuffer * out = msgs->outMessages; 374 368 375 369 dbgmsg( msgs, "sending Port %u", port); 376 tr_peerIoWriteUint32( io, out, 3 ); 377 tr_peerIoWriteUint8 ( io, out, BT_PORT ); 378 tr_peerIoWriteUint16( io, out, port); 379 } 380 381 static void 382 protocolSendHave( tr_peermsgs * msgs, 383 uint32_t index ) 384 { 385 tr_peerIo * io = msgs->peer->io; 370 evbuffer_add_uint32( out, 3 ); 371 evbuffer_add_uint8 ( out, BT_PORT ); 372 evbuffer_add_uint16( out, port); 373 } 374 375 static void 376 protocolSendHave( tr_peermsgs * msgs, uint32_t index ) 377 { 386 378 struct evbuffer * out = msgs->outMessages; 387 379 388 tr_peerIoWriteUint32( io,out, sizeof(uint8_t) + sizeof(uint32_t) );389 tr_peerIoWriteUint8 ( io,out, BT_HAVE );390 tr_peerIoWriteUint32( io,out, index );380 evbuffer_add_uint32( out, sizeof(uint8_t) + sizeof(uint32_t) ); 381 evbuffer_add_uint8 ( out, BT_HAVE ); 382 evbuffer_add_uint32( out, index ); 391 383 392 384 dbgmsg( msgs, "sending Have %u", index ); … … 404 396 assert( tr_peerIoSupportsFEXT( msgs->peer->io ) ); 405 397 406 tr_peerIoWriteUint32( io, out, sizeof(uint8_t) + sizeof(uint32_t) );407 tr_peerIoWriteUint8 ( io, out, BT_FEXT_ALLOWED_FAST );408 tr_peerIoWriteUint32( io, out, pieceIndex );398 evbuffer_add_uint32( io, out, sizeof(uint8_t) + sizeof(uint32_t) ); 399 evbuffer_add_uint8 ( io, out, BT_FEXT_ALLOWED_FAST ); 400 evbuffer_add_uint32( io, out, pieceIndex ); 409 401 410 402 dbgmsg( msgs, "sending Allowed Fast %u...", pieceIndex ); … … 414 406 415 407 static void 416 protocolSendChoke( tr_peermsgs * msgs, 417 int choke ) 418 { 419 tr_peerIo * io = msgs->peer->io; 408 protocolSendChoke( tr_peermsgs * msgs, int choke ) 409 { 420 410 struct evbuffer * out = msgs->outMessages; 421 411 422 tr_peerIoWriteUint32( io,out, sizeof( uint8_t ) );423 tr_peerIoWriteUint8 ( io,out, choke ? BT_CHOKE : BT_UNCHOKE );412 evbuffer_add_uint32( out, sizeof( uint8_t ) ); 413 evbuffer_add_uint8 ( out, choke ? BT_CHOKE : BT_UNCHOKE ); 424 414 425 415 dbgmsg( msgs, "sending %s...", choke ? "Choke" : "Unchoke" ); … … 431 421 protocolSendHaveAll( tr_peermsgs * msgs ) 432 422 { 433 tr_peerIo * io = msgs->peer->io;434 423 struct evbuffer * out = msgs->outMessages; 435 424 436 425 assert( tr_peerIoSupportsFEXT( msgs->peer->io ) ); 437 426 438 tr_peerIoWriteUint32( io,out, sizeof( uint8_t ) );439 tr_peerIoWriteUint8 ( io,out, BT_FEXT_HAVE_ALL );427 evbuffer_add_uint32( out, sizeof( uint8_t ) ); 428 evbuffer_add_uint8 ( out, BT_FEXT_HAVE_ALL ); 440 429 441 430 dbgmsg( msgs, "sending HAVE_ALL..." ); … … 447 436 protocolSendHaveNone( tr_peermsgs * msgs ) 448 437 { 449 tr_peerIo * io = msgs->peer->io;450 438 struct evbuffer * out = msgs->outMessages; 451 439 452 440 assert( tr_peerIoSupportsFEXT( msgs->peer->io ) ); 453 441 454 tr_peerIoWriteUint32( io,out, sizeof( uint8_t ) );455 tr_peerIoWriteUint8 ( io,out, BT_FEXT_HAVE_NONE );442 evbuffer_add_uint32( out, sizeof( uint8_t ) ); 443 evbuffer_add_uint8 ( out, BT_FEXT_HAVE_NONE ); 456 444 457 445 dbgmsg( msgs, "sending HAVE_NONE..." ); … … 676 664 msgs->peer->clientIsInterested = clientIsInterested; 677 665 dbgmsg( msgs, "Sending %s", clientIsInterested ? "Interested" : "Not Interested" ); 678 tr_peerIoWriteUint32( msgs->peer->io,out, sizeof( uint8_t ) );679 tr_peerIoWriteUint8 ( msgs->peer->io,out, clientIsInterested ? BT_INTERESTED : BT_NOT_INTERESTED );666 evbuffer_add_uint32( out, sizeof( uint8_t ) ); 667 evbuffer_add_uint8 ( out, clientIsInterested ? BT_INTERESTED : BT_NOT_INTERESTED ); 680 668 681 669 pokeBatchPeriod( msgs, HIGH_PRIORITY_INTERVAL_SECS ); … … 858 846 buf = tr_bencToStr( &val, TR_FMT_BENC, &len ); 859 847 860 tr_peerIoWriteUint32( msgs->peer->io,out, 2 * sizeof( uint8_t ) + len );861 tr_peerIoWriteUint8 ( msgs->peer->io,out, BT_LTEP );862 tr_peerIoWriteUint8 ( msgs->peer->io,out, LTEP_HANDSHAKE );863 tr_peerIoWriteBytes ( msgs->peer->io,out, buf, len );848 evbuffer_add_uint32( out, 2 * sizeof( uint8_t ) + len ); 849 evbuffer_add_uint8 ( out, BT_LTEP ); 850 evbuffer_add_uint8 ( out, LTEP_HANDSHAKE ); 851 evbuffer_add ( out, buf, len ); 864 852 pokeBatchPeriod( msgs, IMMEDIATE_PRIORITY_INTERVAL_SECS ); 865 853 dbgOutMessageLen( msgs ); … … 1016 1004 int payloadLen; 1017 1005 char * payload; 1018 tr_peerIo * io = msgs->peer->io;1019 1006 struct evbuffer * out = msgs->outMessages; 1020 1007 … … 1027 1014 1028 1015 /* write it out as a LTEP message to our outMessages buffer */ 1029 tr_peerIoWriteUint32( io,out, 2 * sizeof( uint8_t ) + payloadLen );1030 tr_peerIoWriteUint8 ( io,out, BT_LTEP );1031 tr_peerIoWriteUint8 ( io,out, msgs->ut_metadata_id );1032 tr_peerIoWriteBytes ( io,out, payload, payloadLen );1016 evbuffer_add_uint32( out, 2 * sizeof( uint8_t ) + payloadLen ); 1017 evbuffer_add_uint8 ( out, BT_LTEP ); 1018 evbuffer_add_uint8 ( out, msgs->ut_metadata_id ); 1019 evbuffer_add ( out, payload, payloadLen ); 1033 1020 pokeBatchPeriod( msgs, HIGH_PRIORITY_INTERVAL_SECS ); 1034 1021 dbgOutMessageLen( msgs ); … … 1304 1291 struct peer_request * req = &msgs->incoming.blockReq; 1305 1292 1306 assert( EVBUFFER_LENGTH( inbuf ) >= inlen );1293 assert( evbuffer_get_length( inbuf ) >= inlen ); 1307 1294 dbgmsg( msgs, "In readBtPiece" ); 1308 1295 … … 1323 1310 1324 1311 /* read in another chunk of data */ 1325 const size_t nLeft = req->length - EVBUFFER_LENGTH( msgs->incoming.block );1312 const size_t nLeft = req->length - evbuffer_get_length( msgs->incoming.block ); 1326 1313 size_t n = MIN( nLeft, inlen ); 1327 1314 size_t i = n; … … 1344 1331 dbgmsg( msgs, "got %zu bytes for block %u:%u->%u ... %d remain", 1345 1332 n, req->index, req->offset, req->length, 1346 (int)( req->length - EVBUFFER_LENGTH( msgs->incoming.block ) ) );1347 if( EVBUFFER_LENGTH( msgs->incoming.block ) < req->length )1333 (int)( req->length - evbuffer_get_length( msgs->incoming.block ) ) ); 1334 if( evbuffer_get_length( msgs->incoming.block ) < req->length ) 1348 1335 return READ_LATER; 1349 1336 1350 1337 /* we've got the whole block ... process it */ 1351 err = clientGotBlock( msgs, EVBUFFER_DATA( msgs->incoming.block), req );1338 err = clientGotBlock( msgs, evbuffer_pullup( msgs->incoming.block, -1 ), req ); 1352 1339 1353 1340 /* cleanup */ … … 1369 1356 const uint8_t id = msgs->incoming.id; 1370 1357 #ifndef NDEBUG 1371 const size_t startBufLen = EVBUFFER_LENGTH( inbuf );1358 const size_t startBufLen = evbuffer_get_length( inbuf ); 1372 1359 #endif 1373 1360 const tr_bool fext = tr_peerIoSupportsFEXT( msgs->peer->io ); … … 1559 1546 1560 1547 assert( msglen + 1 == msgs->incoming.length ); 1561 assert( EVBUFFER_LENGTH( inbuf ) == startBufLen - msglen );1548 assert( evbuffer_get_length( inbuf ) == startBufLen - msglen ); 1562 1549 1563 1550 msgs->state = AWAITING_BT_LENGTH; … … 1633 1620 tr_peermsgs * msgs = vmsgs; 1634 1621 struct evbuffer * in = tr_peerIoGetReadBuffer( io ); 1635 const size_t inlen = EVBUFFER_LENGTH( in );1622 const size_t inlen = evbuffer_get_length( in ); 1636 1623 1637 1624 dbgmsg( msgs, "canRead: inlen is %zu, msgs->state is %d", inlen, msgs->state ); … … 1664 1651 1665 1652 /* log the raw data that was read */ 1666 if( ( ret != READ_ERR ) && ( EVBUFFER_LENGTH( in ) != inlen ) )1667 fireClientGotData( msgs, inlen - EVBUFFER_LENGTH( in ), FALSE );1653 if( ( ret != READ_ERR ) && ( evbuffer_get_length( in ) != inlen ) ) 1654 fireClientGotData( msgs, inlen - evbuffer_get_length( in ), FALSE ); 1668 1655 1669 1656 return ret; … … 1745 1732 int payloadLen; 1746 1733 char * payload; 1747 tr_peerIo * io = msgs->peer->io;1748 1734 struct evbuffer * out = msgs->outMessages; 1749 1735 … … 1758 1744 1759 1745 /* write it out as a LTEP message to our outMessages buffer */ 1760 tr_peerIoWriteUint32( io,out, 2 * sizeof( uint8_t ) + payloadLen );1761 tr_peerIoWriteUint8 ( io,out, BT_LTEP );1762 tr_peerIoWriteUint8 ( io,out, msgs->ut_metadata_id );1763 tr_peerIoWriteBytes ( io,out, payload, payloadLen );1746 evbuffer_add_uint32( out, 2 * sizeof( uint8_t ) + payloadLen ); 1747 evbuffer_add_uint8 ( out, BT_LTEP ); 1748 evbuffer_add_uint8 ( out, msgs->ut_metadata_id ); 1749 evbuffer_add ( out, payload, payloadLen ); 1764 1750 pokeBatchPeriod( msgs, HIGH_PRIORITY_INTERVAL_SECS ); 1765 1751 dbgOutMessageLen( msgs ); … … 1800 1786 size_t bytesWritten = 0; 1801 1787 struct peer_request req; 1802 const tr_bool haveMessages = EVBUFFER_LENGTH( msgs->outMessages ) != 0;1788 const tr_bool haveMessages = evbuffer_get_length( msgs->outMessages ) != 0; 1803 1789 const tr_bool fext = tr_peerIoSupportsFEXT( msgs->peer->io ); 1804 1790 … … 1809 1795 if( haveMessages && !msgs->outMessagesBatchedAt ) /* fresh batch */ 1810 1796 { 1811 dbgmsg( msgs, "started an outMessages batch (length is %zu)", EVBUFFER_LENGTH( msgs->outMessages ) );1797 dbgmsg( msgs, "started an outMessages batch (length is %zu)", evbuffer_get_length( msgs->outMessages ) ); 1812 1798 msgs->outMessagesBatchedAt = now; 1813 1799 } 1814 1800 else if( haveMessages && ( ( now - msgs->outMessagesBatchedAt ) >= msgs->outMessagesBatchPeriod ) ) 1815 1801 { 1816 const size_t len = EVBUFFER_LENGTH( msgs->outMessages );1802 const size_t len = evbuffer_get_length( msgs->outMessages ); 1817 1803 /* flush the protocol messages */ 1818 1804 dbgmsg( msgs, "flushing outMessages... to %p (length is %zu)", msgs->peer->io, len ); … … 1841 1827 int payloadLen; 1842 1828 char * payload; 1843 tr_peerIo * io = msgs->peer->io;1844 1829 struct evbuffer * out = msgs->outMessages; 1845 1830 … … 1853 1838 1854 1839 /* write it out as a LTEP message to our outMessages buffer */ 1855 tr_peerIoWriteUint32( io,out, 2 * sizeof( uint8_t ) + payloadLen + dataLen );1856 tr_peerIoWriteUint8 ( io,out, BT_LTEP );1857 tr_peerIoWriteUint8 ( io,out, msgs->ut_metadata_id );1858 tr_peerIoWriteBytes ( io,out, payload, payloadLen );1859 tr_peerIoWriteBytes ( io,out, data, dataLen );1840 evbuffer_add_uint32( out, 2 * sizeof( uint8_t ) + payloadLen + dataLen ); 1841 evbuffer_add_uint8 ( out, BT_LTEP ); 1842 evbuffer_add_uint8 ( out, msgs->ut_metadata_id ); 1843 evbuffer_add ( out, payload, payloadLen ); 1844 evbuffer_add ( out, data, dataLen ); 1860 1845 pokeBatchPeriod( msgs, HIGH_PRIORITY_INTERVAL_SECS ); 1861 1846 dbgOutMessageLen( msgs ); … … 1872 1857 int payloadLen; 1873 1858 char * payload; 1874 tr_peerIo * io = msgs->peer->io;1875 1859 struct evbuffer * out = msgs->outMessages; 1876 1860 … … 1883 1867 1884 1868 /* write it out as a LTEP message to our outMessages buffer */ 1885 tr_peerIoWriteUint32( io,out, 2 * sizeof( uint8_t ) + payloadLen );1886 tr_peerIoWriteUint8 ( io,out, BT_LTEP );1887 tr_peerIoWriteUint8 ( io,out, msgs->ut_metadata_id );1888 tr_peerIoWriteBytes ( io,out, payload, payloadLen );1869 evbuffer_add_uint32( out, 2 * sizeof( uint8_t ) + payloadLen ); 1870 evbuffer_add_uint8 ( out, BT_LTEP ); 1871 evbuffer_add_uint8 ( out, msgs->ut_metadata_id ); 1872 evbuffer_add ( out, payload, payloadLen ); 1889 1873 pokeBatchPeriod( msgs, HIGH_PRIORITY_INTERVAL_SECS ); 1890 1874 dbgOutMessageLen( msgs ); … … 1906 1890 && tr_cpPieceIsComplete( &msgs->torrent->completion, req.index ) ) 1907 1891 { 1908 /* FIXME(libevent2) use evbuffer_reserve_space() + evbuffer_commit_space() */1909 1892 int err; 1910 1893 const uint32_t msglen = 4 + 1 + 4 + 4 + req.length; 1911 1894 struct evbuffer * out; 1912 tr_peerIo * io = msgs->peer->io;1895 struct evbuffer_iovec iovec[1]; 1913 1896 1914 1897 out = evbuffer_new( ); 1915 1898 evbuffer_expand( out, msglen ); 1916 1899 1917 tr_peerIoWriteUint32( io, out, sizeof( uint8_t ) + 2 * sizeof( uint32_t ) + req.length ); 1918 tr_peerIoWriteUint8 ( io, out, BT_PIECE ); 1919 tr_peerIoWriteUint32( io, out, req.index ); 1920 tr_peerIoWriteUint32( io, out, req.offset ); 1921 1922 err = tr_cacheReadBlock( getSession(msgs)->cache, msgs->torrent, req.index, req.offset, req.length, EVBUFFER_DATA(out)+EVBUFFER_LENGTH(out) ); 1900 evbuffer_add_uint32( out, sizeof( uint8_t ) + 2 * sizeof( uint32_t ) + req.length ); 1901 evbuffer_add_uint8 ( out, BT_PIECE ); 1902 evbuffer_add_uint32( out, req.index ); 1903 evbuffer_add_uint32( out, req.offset ); 1904 1905 evbuffer_reserve_space( out, req.length, iovec, 1 ); 1906 err = tr_cacheReadBlock( getSession(msgs)->cache, msgs->torrent, req.index, req.offset, req.length, iovec[0].iov_base ); 1907 iovec[0].iov_len = req.length; 1908 evbuffer_commit_space( out, iovec, 1 ); 1923 1909 1924 1910 /* check the piece if it needs checking... */ … … 1934 1920 else 1935 1921 { 1922 const size_t n = evbuffer_get_length( out ); 1936 1923 dbgmsg( msgs, "sending block %u:%u->%u", req.index, req.offset, req.length ); 1937 EVBUFFER_LENGTH(out) += req.length; 1938 assert( EVBUFFER_LENGTH( out ) == msglen ); 1939 tr_peerIoWriteBuf( io, out, TRUE ); 1940 bytesWritten += EVBUFFER_LENGTH( out ); 1924 assert( n == msglen ); 1925 tr_peerIoWriteBuf( msgs->peer->io, out, TRUE ); 1926 bytesWritten += n; 1941 1927 msgs->clientSentAnythingAt = now; 1942 1928 tr_historyAdd( msgs->peer->blocksSentToPeer, tr_time( ), 1 ); … … 1969 1955 { 1970 1956 dbgmsg( msgs, "sending a keepalive message" ); 1971 tr_peerIoWriteUint32( msgs->peer->io,msgs->outMessages, 0 );1957 evbuffer_add_uint32( msgs->outMessages, 0 ); 1972 1958 pokeBatchPeriod( msgs, IMMEDIATE_PRIORITY_INTERVAL_SECS ); 1973 1959 } … … 2007 1993 void * vmsgs ) 2008 1994 { 2009 if( what & EVBUFFER_TIMEOUT )1995 if( what & BEV_EVENT_TIMEOUT ) 2010 1996 dbgmsg( vmsgs, "libevent got a timeout, what=%hd", what ); 2011 if( what & ( EVBUFFER_EOF | EVBUFFER_ERROR ) )1997 if( what & ( BEV_EVENT_EOF | BEV_EVENT_ERROR ) ) 2012 1998 dbgmsg( vmsgs, "libevent got an error! what=%hd, errno=%d (%s)", 2013 1999 what, errno, tr_strerror( errno ) ); … … 2054 2040 } 2055 2041 2056 tr_peerIoWriteUint32( msgs->peer->io, out, 2057 sizeof( uint8_t ) + field->byteCount ); 2058 tr_peerIoWriteUint8 ( msgs->peer->io, out, BT_BITFIELD ); 2059 /* FIXME(libevent2): use evbuffer_add_reference() */ 2060 tr_peerIoWriteBytes ( msgs->peer->io, out, field->bits, field->byteCount ); 2042 evbuffer_add_uint32( out, sizeof( uint8_t ) + field->byteCount ); 2043 evbuffer_add_uint8 ( out, BT_BITFIELD ); 2044 evbuffer_add ( out, field->bits, field->byteCount ); 2061 2045 dbgmsg( msgs, "sending bitfield... outMessage size is now %zu", 2062 EVBUFFER_LENGTH( out ) );2046 evbuffer_get_length( out ) ); 2063 2047 pokeBatchPeriod( msgs, IMMEDIATE_PRIORITY_INTERVAL_SECS ); 2064 2048 … … 2200 2184 int bencLen; 2201 2185 uint8_t * tmp, *walk; 2202 tr_peerIo * io = msgs->peer->io;2203 2186 struct evbuffer * out = msgs->outMessages; 2204 2187 … … 2289 2272 /* write the pex message */ 2290 2273 benc = tr_bencToStr( &val, TR_FMT_BENC, &bencLen ); 2291 tr_peerIoWriteUint32( io,out, 2 * sizeof( uint8_t ) + bencLen );2292 tr_peerIoWriteUint8 ( io,out, BT_LTEP );2293 tr_peerIoWriteUint8 ( io,out, msgs->ut_pex_id );2294 tr_peerIoWriteBytes ( io,out, benc, bencLen );2274 evbuffer_add_uint32( out, 2 * sizeof( uint8_t ) + bencLen ); 2275 evbuffer_add_uint8 ( out, BT_LTEP ); 2276 evbuffer_add_uint8 ( out, msgs->ut_pex_id ); 2277 evbuffer_add ( out, benc, bencLen ); 2295 2278 pokeBatchPeriod( msgs, HIGH_PRIORITY_INTERVAL_SECS ); 2296 dbgmsg( msgs, "sending a pex message; outMessage size is now %zu", EVBUFFER_LENGTH( out ) );2279 dbgmsg( msgs, "sending a pex message; outMessage size is now %zu", evbuffer_get_length( out ) ); 2297 2280 dbgOutMessageLen( msgs ); 2298 2281 … … 2320 2303 sendPex( msgs ); 2321 2304 2322 tr_timerAdd( &msgs->pexTimer, PEX_INTERVAL_SECS, 0 );2305 tr_timerAdd( msgs->pexTimer, PEX_INTERVAL_SECS, 0 ); 2323 2306 } 2324 2307 … … 2352 2335 m->outMessagesBatchPeriod = LOW_PRIORITY_INTERVAL_SECS; 2353 2336 m->incoming.block = evbuffer_new( ); 2354 evtimer_set( &m->pexTimer, pexPulse, m ); 2355 tr_timerAdd( &m->pexTimer, PEX_INTERVAL_SECS, 0 ); 2337 m->pexTimer = evtimer_new( NULL, pexPulse, m ); 2356 2338 peer->msgs = m; 2339 tr_timerAdd( m->pexTimer, PEX_INTERVAL_SECS, 0 ); 2357 2340 2358 2341 if( tr_peerIoSupportsLTEP( peer->io ) ) … … 2381 2364 if( msgs ) 2382 2365 { 2383 ev timer_del( &msgs->pexTimer );2366 event_free( msgs->pexTimer ); 2384 2367 2385 2368 evbuffer_free( msgs->incoming.block ); -
trunk/libtransmission/rpc-server.c
r11524 r11548 31 31 #include "bencode.h" 32 32 #include "crypto.h" 33 #include "fdlimit.h" 33 34 #include "list.h" 34 35 #include "net.h" … … 156 157 static void 157 158 extract_parts_from_multipart( const struct evkeyvalq * headers, 158 conststruct evbuffer * body,159 struct evbuffer * body, 159 160 tr_ptrArray * setme_parts ) 160 161 { 161 162 const char * content_type = evhttp_find_header( headers, "Content-Type" ); 162 163 const char * in = (const char*) EVBUFFER_DATA( body ); 163 size_t inlen = EVBUFFER_LENGTH( body );164 size_t inlen = evbuffer_get_length( body ); 164 165 165 166 const char * boundary_key = "boundary="; … … 278 279 tr_rpc_request_exec_json( server->session, 279 280 EVBUFFER_DATA( json ), 280 EVBUFFER_LENGTH( json ),281 evbuffer_get_length( json ), 281 282 NULL, NULL ); 282 283 evbuffer_free( json ); … … 328 329 329 330 static void 330 add_response( struct evhttp_request * req, 331 struct tr_rpc_server * server, 332 struct evbuffer * out, 333 const void * content, 334 size_t content_len ) 331 add_response( struct evhttp_request * req, struct tr_rpc_server * server, 332 struct evbuffer * out, struct evbuffer * content ) 335 333 { 336 334 #ifndef HAVE_ZLIB 337 evbuffer_add ( out, content, content_len);335 evbuffer_add_buffer( out, content ); 338 336 #else 339 337 const char * key = "Accept-Encoding"; … … 343 341 if( !do_compress ) 344 342 { 345 evbuffer_add ( out, content, content_len);343 evbuffer_add_buffer( out, content ); 346 344 } 347 345 else 348 346 { 349 347 int state; 350 351 /* FIXME(libevent2): this won't compile under libevent2.352 but we can use evbuffer_reserve_space() + evbuffer_commit_space() instead */348 struct evbuffer_iovec iovec[1]; 349 void * content_ptr = evbuffer_pullup( content, -1 ); 350 const size_t content_len = evbuffer_get_length( content ); 353 351 354 352 if( !server->isStreamInitialized ) … … 371 369 } 372 370 373 server->stream.next_in = (Bytef*) content;371 server->stream.next_in = content_ptr; 374 372 server->stream.avail_in = content_len; 375 373 … … 377 375 * we won't use the deflated data if it's longer than the raw data, 378 376 * so it's okay to let deflate() run out of output buffer space */ 379 evbuffer_expand( out, content_len ); 380 server->stream.next_out = EVBUFFER_DATA( out ); 381 server->stream.avail_out = content_len; 382 377 evbuffer_reserve_space( out, content_len, iovec, 1 ); 378 server->stream.next_out = iovec[0].iov_base; 379 server->stream.avail_out = iovec[0].iov_len; 383 380 state = deflate( &server->stream, Z_FINISH ); 384 381 385 382 if( state == Z_STREAM_END ) 386 383 { 387 EVBUFFER_LENGTH( out ) = content_len -server->stream.avail_out;384 iovec[0].iov_len -= server->stream.avail_out; 388 385 389 386 #if 0 390 387 fprintf( stderr, "compressed response is %.2f of original (raw==%zu bytes; compressed==%zu)\n", 391 (double) EVBUFFER_LENGTH(out)/content_len,392 content_len, EVBUFFER_LENGTH(out) );388 (double)evbuffer_get_length(out)/content_len, 389 content_len, evbuffer_get_length(out) ); 393 390 #endif 394 391 evhttp_add_header( req->output_headers, … … 397 394 else 398 395 { 399 evbuffer_drain( out, EVBUFFER_LENGTH( out ) ); 400 evbuffer_add( out, content, content_len ); 401 } 402 396 memcpy( iovec[0].iov_base, content_ptr, content_len ); 397 iovec[0].iov_len = content_len; 398 } 399 400 evbuffer_commit_space( out, iovec, 1 ); 403 401 deflateReset( &server->stream ); 404 402 } … … 429 427 else 430 428 { 431 size_t content_len; 432 uint8_t * content; 429 void * file; 430 size_t file_len; 431 struct evbuffer * content = evbuffer_new( ); 433 432 const int error = errno; 434 433 435 434 errno = 0; 436 content_len = 0; 437 content = tr_loadFile( filename, &content_len ); 435 file_len = 0; 436 file = tr_loadFile( filename, &file_len ); 437 content = evbuffer_new( ); 438 evbuffer_add_reference( content, file, file_len, evbuffer_ref_cleanup_tr_free, file ); 438 439 439 440 if( errno ) … … 453 454 add_time_header( req->output_headers, "Date", now ); 454 455 add_time_header( req->output_headers, "Expires", now+(24*60*60) ); 455 add_response( req, server, out, content , content_len);456 add_response( req, server, out, content ); 456 457 evhttp_send_reply( req, HTTP_OK, "OK", out ); 457 458 458 459 evbuffer_free( out ); 459 tr_free( content ); 460 } 460 } 461 462 evbuffer_free( content ); 461 463 } 462 464 } … … 513 515 }; 514 516 515 /* FIXME(libevent2): make "response" an evbuffer and remove response_len */516 517 static void 517 518 rpc_response_func( tr_session * session UNUSED, 518 const char * response, 519 size_t response_len, 519 struct evbuffer * response, 520 520 void * user_data ) 521 521 { … … 523 523 struct evbuffer * buf = evbuffer_new( ); 524 524 525 add_response( data->req, data->server, buf, response , response_len);525 add_response( data->req, data->server, buf, response ); 526 526 evhttp_add_header( data->req->output_headers, 527 527 "Content-Type", "application/json; charset=UTF-8" ); … … 552 552 tr_rpc_request_exec_json( server->session, 553 553 EVBUFFER_DATA( req->input_buffer ), 554 EVBUFFER_LENGTH( req->input_buffer ),554 evbuffer_get_length( req->input_buffer ), 555 555 rpc_response_func, data ); 556 556 } -
trunk/libtransmission/rpcimpl.c
r11538 r11548 103 103 104 104 tr_bencToBuf( data->response, TR_FMT_JSON_LEAN, buf ); 105 (*data->callback)( data->session, (const char*)EVBUFFER_DATA(buf), 106 EVBUFFER_LENGTH(buf), data->callback_user_data ); 105 (*data->callback)( data->session, buf, data->callback_user_data ); 107 106 108 107 evbuffer_free( buf ); … … 1648 1647 1649 1648 static void 1650 noop_response_callback( tr_session * session UNUSED, 1651 const char * response UNUSED, 1652 size_t response_len UNUSED, 1653 void * user_data UNUSED ) 1649 noop_response_callback( tr_session * session UNUSED, 1650 struct evbuffer * response UNUSED, 1651 void * user_data UNUSED ) 1654 1652 { 1655 1653 } … … 1694 1692 tr_bencDictAddInt( &response, "tag", tag ); 1695 1693 tr_bencToBuf( &response, TR_FMT_JSON_LEAN, buf ); 1696 (*callback)( session, (const char*)EVBUFFER_DATA(buf), 1697 EVBUFFER_LENGTH( buf ), callback_user_data ); 1694 (*callback)( session, buf, callback_user_data ); 1698 1695 1699 1696 evbuffer_free( buf ); … … 1716 1713 tr_bencDictAddInt( &response, "tag", tag ); 1717 1714 tr_bencToBuf( &response, TR_FMT_JSON_LEAN, buf ); 1718 (*callback)( session, (const char*)EVBUFFER_DATA(buf), 1719 EVBUFFER_LENGTH(buf), callback_user_data ); 1715 (*callback)( session, buf, callback_user_data ); 1720 1716 1721 1717 evbuffer_free( buf ); -
trunk/libtransmission/rpcimpl.h
r9868 r11548 23 23 24 24 struct tr_benc; 25 struct evbuffer; 25 26 26 27 /* FIXME(libevent2): make "response" an evbuffer and remove response_len */ 27 28 typedef void( *tr_rpc_response_func )( tr_session * session, 28 const char * response, 29 size_t response_len, 29 struct evbuffer * response, 30 30 void * user_data ); 31 31 /* http://www.json.org/ */ -
trunk/libtransmission/torrent-magnet.c
r11301 r11548 12 12 13 13 #include <assert.h> 14 #include <event.h> /* struct evbuffer */15 14 #include <stdio.h> /* remove() */ 15 16 #include <event2/buffer.h> 16 17 17 18 #include "transmission.h" … … 371 372 { 372 373 int i; 373 char * ret;374 374 const char * name; 375 375 struct evbuffer * s; … … 391 391 } 392 392 393 ret = tr_strndup( EVBUFFER_DATA( s ), EVBUFFER_LENGTH( s ) ); 394 evbuffer_free( s ); 395 return ret; 396 } 393 return evbuffer_free_to_str( s ); 394 } -
trunk/libtransmission/tr-dht.c
r11359 r11548 44 44 45 45 /* third party */ 46 #include <event .h>46 #include <event2/event.h> 47 47 #include <dht/dht.h> 48 48 … … 61 61 62 62 static int dht_socket = -1, dht6_socket = -1; 63 static struct event dht_event, dht6_event; 63 static struct event * dht_event = NULL; 64 static struct event * dht6_event = NULL; 64 65 static tr_port dht_port; 65 66 static unsigned char myid[20]; … … 400 401 tr_threadNew( dht_bootstrap, cl ); 401 402 402 event_set( &dht_event, dht_socket, EV_READ, event_callback, NULL );403 tr_timerAdd( &dht_event, 0, tr_cryptoWeakRandInt( 1000000 ) );403 dht_event = event_new( NULL, dht_socket, EV_READ, event_callback, NULL ); 404 tr_timerAdd( dht_event, 0, tr_cryptoWeakRandInt( 1000000 ) ); 404 405 405 406 if( dht6_socket >= 0 ) 406 407 { 407 event_set( &dht6_event, dht6_socket, EV_READ, event_callback, NULL );408 tr_timerAdd( &dht6_event, 0, tr_cryptoWeakRandInt( 1000000 ) );408 dht6_event = event_new( NULL, dht6_socket, EV_READ, event_callback, NULL ); 409 tr_timerAdd( dht6_event, 0, tr_cryptoWeakRandInt( 1000000 ) ); 409 410 } 410 411 … … 436 437 tr_ndbg( "DHT", "Uninitializing DHT" ); 437 438 438 event_del( &dht_event ); 439 440 if( dht6_socket >= 0 ) 441 event_del( &dht6_event ); 439 event_free( dht_event ); 440 dht_event = NULL; 441 442 if( dht6_event ) { 443 event_free( dht6_event ); 444 dht6_event = NULL; 445 } 442 446 443 447 /* Since we only save known good nodes, avoid erasing older data if we … … 692 696 event_callback(int s, short type, void *ignore UNUSED ) 693 697 { 694 struct event *event = (s == dht_socket) ? &dht_event : &dht6_event;698 struct event *event = (s == dht_socket) ? dht_event : dht6_event; 695 699 time_t tosleep; 696 700 static int count = 0; -
trunk/libtransmission/tr-lpd.c
r11357 r11548 43 43 44 44 /* third party */ 45 #include <event .h>46 #include <ev util.h>45 #include <event2/event.h> 46 #include <event2/util.h> 47 47 48 48 /* libT */ … … 71 71 static int lpd_socket; /**<separate multicast receive socket */ 72 72 static int lpd_socket2; /**<and multicast send socket */ 73 static struct event lpd_event;73 static struct event * lpd_event = NULL; 74 74 static tr_port lpd_port; 75 75 … … 339 339 * any announcement received during the initial interval will be discarded. */ 340 340 341 event_set( &lpd_event, lpd_socket, EV_READ | EV_PERSIST, event_callback, NULL );342 event_add( &lpd_event, NULL );341 lpd_event = event_new( NULL, lpd_socket, EV_READ | EV_PERSIST, event_callback, NULL ); 342 event_add( lpd_event, NULL ); 343 343 344 344 tr_ndbg( "LPD", "Local Peer Discovery initialised" ); … … 368 368 tr_ndbg( "LPD", "Uninitialising Local Peer Discovery" ); 369 369 370 event_del( &lpd_event ); 370 event_free( lpd_event ); 371 lpd_event = NULL; 371 372 372 373 /* just shut down, we won't remember any former nodes */ -
trunk/libtransmission/trevent.c
r10913 r11548 127 127 #include <unistd.h> 128 128 129 #include <event.h>130 131 129 #include "transmission.h" 132 130 #include "platform.h" -
trunk/libtransmission/utils.c
r11490 r11548 43 43 #include <unistd.h> /* stat(), getcwd(), getpagesize() */ 44 44 45 #include "event.h" 45 #include <event2/buffer.h> 46 #include <event2/event.h> 46 47 47 48 #ifdef WIN32 … … 248 249 evbuffer_add_printf( buf, " (%s:%d)\n", base, line ); 249 250 /* FIXME(libevent2) ifdef this out for nonwindows platforms */ 250 OutputDebugString( EVBUFFER_DATA( buf) );251 OutputDebugString( evbuffer_pullup( buf, -1 ) ); 251 252 if(fp) /* FIXME(libevent2) tr_getLog() should return an fd, then use evbuffer_write() here ) */ 252 (void) fwrite( EVBUFFER_DATA( buf ), 1, EVBUFFER_LENGTH( buf ), fp );253 (void) fwrite( evbuffer_pullup( buf, -1 ), 1, evbuffer_get_length( buf ), fp ); 253 254 254 255 tr_free( base ); … … 693 694 694 695 char* 696 evbuffer_free_to_str( struct evbuffer * buf ) 697 { 698 const size_t n = evbuffer_get_length( buf ); 699 char * ret = tr_new( char, n + 1 ); 700 evbuffer_copyout( buf, ret, n ); 701 evbuffer_free( buf ); 702 ret[n] = '\0'; 703 return ret; 704 } 705 706 char* 695 707 tr_strdup( const void * in ) 696 708 { … … 1250 1262 strip_non_utf8( const char * in, size_t inlen ) 1251 1263 { 1252 char * ret;1253 1264 const char * end; 1254 1265 const char zero = '\0'; … … 1267 1278 evbuffer_add( buf, in, inlen ); 1268 1279 evbuffer_add( buf, &zero, 1 ); 1269 ret = tr_memdup( EVBUFFER_DATA( buf ), EVBUFFER_LENGTH( buf ) ); 1270 evbuffer_free( buf ); 1271 return ret; 1280 return evbuffer_free_to_str( buf ); 1272 1281 } 1273 1282 -
trunk/libtransmission/utils.h
r11490 r11548 304 304 void tr_free( void * p ); 305 305 306 static inline 307 void evbuffer_ref_cleanup_tr_free( const void * data UNUSED, size_t datalen UNUSED, void * extra ) 308 { 309 tr_free( extra ); 310 } 311 306 312 /** 307 313 * @brief make a newly-allocated copy of a chunk of memory … … 337 343 */ 338 344 char* tr_strdup( const void * in ); 345 346 347 struct evbuffer; 348 349 char* evbuffer_free_to_str( struct evbuffer * buf ); 339 350 340 351 /** @brief similar to bsearch() but returns the index of the lower bound */ -
trunk/libtransmission/web.c
r11512 r11548 18 18 19 19 #include <curl/curl.h> 20 #include <event.h> 20 21 #include <event2/buffer.h> 21 22 22 23 #include "transmission.h" … … 193 194 task->done_func( task->session, 194 195 task->code, 195 EVBUFFER_DATA( task->response),196 EVBUFFER_LENGTH( task->response ),196 evbuffer_pullup( task->response, -1 ), 197 evbuffer_get_length( task->response ), 197 198 task->done_func_user_data ); 198 199 … … 351 352 curl_multi_remove_handle( multi, e ); 352 353 curl_easy_cleanup( e ); 353 /*fprintf( stderr, "removing a completed task.. taskCount is now %d (response code: %d, response len: %d)\n", taskCount, (int)task->code, (int) EVBUFFER_LENGTH(task->response) );*/354 /*fprintf( stderr, "removing a completed task.. taskCount is now %d (response code: %d, response len: %d)\n", taskCount, (int)task->code, (int)evbuffer_get_length(task->response) );*/ 354 355 tr_runInEventThread( task->session, task_finish_func, task ); 355 356 --taskCount; -
trunk/libtransmission/webseed.c
r10931 r11548 13 13 #include <string.h> /* strlen */ 14 14 15 #include <event .h>15 #include <event2/buffer.h> 16 16 17 17 #include "transmission.h" … … 98 98 const tr_file * file ) 99 99 { 100 char * ret;101 100 struct evbuffer * out = evbuffer_new( ); 102 101 const char * url = w->url; … … 109 108 tr_http_escape( out, file->name, strlen(file->name), FALSE ); 110 109 111 ret = tr_strndup( EVBUFFER_DATA( out ), EVBUFFER_LENGTH( out ) ); 112 evbuffer_free( out ); 113 return ret; 110 return evbuffer_free_to_str( out ); 114 111 } 115 112 … … 142 139 } 143 140 144 if( EVBUFFER_LENGTH( w->content ) < w->byteCount )141 if( evbuffer_get_length( w->content ) < w->byteCount ) 145 142 requestNextChunk( w ); 146 143 else { 147 tr_ioWrite( tor, w->pieceIndex, w->pieceOffset, w->byteCount, EVBUFFER_DATA(w->content) );148 evbuffer_drain( w->content, EVBUFFER_LENGTH( w->content ) );144 tr_ioWrite( tor, w->pieceIndex, w->pieceOffset, w->byteCount, evbuffer_pullup( w->content, -1 ) ); 145 evbuffer_drain( w->content, evbuffer_get_length( w->content ) ); 149 146 w->busy = 0; 150 147 if( w->dead ) … … 166 163 { 167 164 const tr_info * inf = tr_torrentInfo( tor ); 168 const uint32_t have = EVBUFFER_LENGTH( w->content );165 const uint32_t have = evbuffer_get_length( w->content ); 169 166 const uint32_t left = w->byteCount - have; 170 167 const uint32_t pieceOffset = w->pieceOffset + have; … … 207 204 w->pieceOffset = pieceOffset; 208 205 w->byteCount = byteCount; 209 evbuffer_drain( w->content, EVBUFFER_LENGTH( w->content ) );206 evbuffer_drain( w->content, evbuffer_get_length( w->content ) ); 210 207 requestNextChunk( w ); 211 208 ret = TR_ADDREQ_OK; -
trunk/utils/edit.c
r11522 r11548 13 13 #include <stdio.h> 14 14 15 #include <event .h> /* evbuffer */15 #include <event2/buffer.h> 16 16 17 17 #include <libtransmission/transmission.h> … … 157 157 } 158 158 159 walk = tr_strndup( EVBUFFER_DATA( buf ), EVBUFFER_LENGTH( buf ) ); 160 evbuffer_free( buf ); 161 return walk; 159 return evbuffer_free_to_str( buf ); 162 160 } 163 161 -
trunk/utils/show.c
r11522 r11548 17 17 #include <curl/curl.h> 18 18 19 #include <event .h> /* struct evbuffer */19 #include <event2/buffer.h> 20 20 21 21 #include <libtransmission/transmission.h> … … 222 222 tr_benc * files; 223 223 tr_bool matched = FALSE; 224 const char * begin = (const char*) EVBUFFER_DATA( buf);225 const char * end = begin + EVBUFFER_LENGTH( buf );224 const char * begin = (const char*) evbuffer_pullup( buf, -1 ); 225 const char * end = begin + evbuffer_get_length( buf ); 226 226 227 227 if( !tr_bencParse( begin, end, &top, NULL ) )
Note: See TracChangeset
for help on using the changeset viewer.