由于现在部分 PT 网站屏蔽 rtorrent 0.9.6(据说一些 nexusphp 会记录到异常流量),于是需要使用rtorrent-0.9.4,但是通常情况下 ubuntu 18.04 是无法编译 rt-0.9.4 的。在 config 过程中会有 warning: macro ‘AM_PATH_CPPUNIT’ not found in library 以及 libtoolize: Consider adding ‘-I m4’ to ACLOCAL_AMFLAGS in Makefile.am,除此以外还会有 openssl 版本的不匹配问题。
那么为了解决这两个主要问题,我将后来更新的部分代码合并到 rt-0.9.4 中制作了下述两个补丁:
libtorrent-0.13.4补丁
diff -Nur libtorrent-0.13.4/configure.ac libtorrent-0.13.4-patched/configure.ac --- libtorrent-0.13.4/configure.ac 2019-01-12 14:09:46.769154822 -0500 +++ libtorrent-0.13.4-patched/configure.ac 2014-05-14 10:18:48.000000000 -0400 @@ -19,6 +19,7 @@ AM_INIT_AUTOMAKE AC_CONFIG_HEADERS(config.h) +AM_PATH_CPPUNIT(1.9.6) AC_PROG_CXX @@ -55,25 +56,21 @@ CC_ATTRIBUTE_VISIBILITY AX_PTHREAD([], AC_MSG_ERROR([requires pthread])) -PKG_CHECK_MODULES([CPPUNIT], [cppunit],, [no_cppunit="yes"]) -CFLAGS="$PTHREAD_CFLAGS $CPPUNIT_CFLAGS $CFLAGS" -CXXFLAGS="$PTHREAD_CFLAGS $CPPUNIT_CFLAGS $CXXFLAGS" -LIBS="$PTHREAD_LIBS $CPPUNIT_LIBS $LIBS" +CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" +LIBS="$PTHREAD_LIBS $LIBS" AC_ARG_ENABLE(openssl, [ --disable-openssl Don't use OpenSSL's SHA1 implementation.], [ if test "$enableval" = "yes"; then -dnl move to scripts. PKG_CHECK_MODULES(OPENSSL, libcrypto, CXXFLAGS="$CXXFLAGS $OPENSSL_CFLAGS"; LIBS="$LIBS $OPENSSL_LIBS") AC_DEFINE(USE_OPENSSL, 1, Using OpenSSL.) AC_DEFINE(USE_OPENSSL_SHA, 1, Using OpenSSL's SHA1 implementation.) - AC_CHECK_LIB([crypto], [DH_set0_pqg], [AC_DEFINE(USE_OPENSSL_1_1, 1, Using OpenSSL 1.1.)]) - else AC_DEFINE(USE_NSS_SHA, 1, Using Mozilla's SHA1 implementation.) fi @@ -84,7 +81,6 @@ AC_DEFINE(USE_OPENSSL, 1, Using OpenSSL.) AC_DEFINE(USE_OPENSSL_SHA, 1, Using OpenSSL's SHA1 implementation.) - AC_CHECK_LIB([crypto], [DH_set0_pqg], [AC_DEFINE(USE_OPENSSL_1_1, 1, Using OpenSSL 1.1.)]) ] ) diff -Nur libtorrent-0.13.4/src/utils/diffie_hellman.cc libtorrent-0.13.4-patched/src/utils/diffie_hellman.cc --- libtorrent-0.13.4/src/utils/diffie_hellman.cc 2019-01-12 14:09:46.773154827 -0500 +++ libtorrent-0.13.4-patched/src/utils/diffie_hellman.cc 2014-05-14 10:18:48.000000000 -0400 @@ -48,29 +48,16 @@ namespace torrent { -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" DiffieHellman::DiffieHellman(const unsigned char *prime, int primeLength, const unsigned char *generator, int generatorLength) : m_secret(NULL), m_size(0) { #ifdef USE_OPENSSL - m_dh = DH_new(); - -#ifdef USE_OPENSSL_1_1 - BIGNUM * const dh_p = BN_bin2bn(prime, primeLength, NULL); - BIGNUM * const dh_g = BN_bin2bn(generator, generatorLength, NULL); - - if (dh_p == NULL || dh_g == NULL || - !DH_set0_pqg(m_dh, dh_p, NULL, dh_g)) - throw internal_error("Could not generate Diffie-Hellman parameters"); -#else m_dh->p = BN_bin2bn(prime, primeLength, NULL); m_dh->g = BN_bin2bn(generator, generatorLength, NULL); -#endif DH_generate_key(m_dh); - #else throw internal_error("Compiled without encryption support."); #endif @@ -86,25 +73,13 @@ bool DiffieHellman::is_valid() const { #ifdef USE_OPENSSL - if (m_dh == NULL) - return false; - -#ifdef USE_OPENSSL_1_1 - const BIGNUM *pub_key; - - DH_get0_key(m_dh, &pub_key, NULL); - - return pub_key != NULL; -#else return m_dh != NULL && m_dh->pub_key != NULL; -#endif - #else return false; #endif } -bool +void DiffieHellman::compute_secret(const unsigned char *pubkey, unsigned int length) { #ifdef USE_OPENSSL BIGNUM* k = BN_bin2bn(pubkey, length, NULL); @@ -115,10 +90,6 @@ m_size = DH_compute_key((unsigned char*)m_secret, k, m_dh); BN_free(k); - - return m_size != -1; -#else - return false; #endif }; @@ -127,16 +98,8 @@ #ifdef USE_OPENSSL std::memset(dest, 0, length); - const BIGNUM *pub_key; - -#ifdef USE_OPENSSL_1_1 - DH_get0_key(m_dh, &pub_key, NULL); -#else - pub_key = m_dh->pub_key; -#endif - - if ((int)length >= BN_num_bytes(pub_key)) - BN_bn2bin(pub_key, dest + length - BN_num_bytes(pub_key)); + if ((int)length >= BN_num_bytes(m_dh->pub_key)) + BN_bn2bin(m_dh->pub_key, dest + length - BN_num_bytes(m_dh->pub_key)); #endif } diff -Nur libtorrent-0.13.4/src/utils/diffie_hellman.h libtorrent-0.13.4-patched/src/utils/diffie_hellman.h --- libtorrent-0.13.4/src/utils/diffie_hellman.h 2019-01-12 14:09:46.773154827 -0500 +++ libtorrent-0.13.4-patched/src/utils/diffie_hellman.h 2014-05-06 04:22:57.000000000 -0400 @@ -53,7 +53,7 @@ const unsigned char generator[], int generatorLength); ~DiffieHellman(); - bool compute_secret(const unsigned char pubkey[], unsigned int length); + void compute_secret(const unsigned char pubkey[], unsigned int length); void store_pub_key(unsigned char* dest, unsigned int length); bool is_valid() const;
rtorrent-0.9.4补丁
diff -Nur rtorrent-0.9.4/configure.ac rtorrent-0.9.4-patched/configure.ac --- rtorrent-0.9.4/configure.ac 2014-05-14 10:30:51.000000000 -0400 +++ rtorrent-0.9.4-patched/configure.ac 2019-01-12 14:16:32.845640059 -0500 @@ -4,7 +4,7 @@ AM_INIT_AUTOMAKE AC_CONFIG_HEADERS(config.h) -AM_PATH_CPPUNIT(1.9.6) + AC_PROG_CXX AC_PROG_LIBTOOL @@ -37,17 +37,13 @@ AC_MSG_ERROR([requires either NcursesW or Ncurses library]) fi -CFLAGS="$CFLAGS $PTHREAD_CFLAGS $CURSES_CFLAGS" -CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS $CURSES_CFLAGS" -LIBS="$PTHREAD_LIBS $CURSES_LIB $LIBS" - -PKG_CHECK_MODULES([libcurl], libcurl >= 7.15.4, - CXXFLAGS="$CXXFLAGS $libcurl_CFLAGS"; - LIBS="$LIBS $libcurl_LIBS") - -PKG_CHECK_MODULES([libtorrent], libtorrent >= 0.13.4, - CXXFLAGS="$CXXFLAGS $libtorrent_CFLAGS"; - LIBS="$LIBS $libtorrent_LIBS") +PKG_CHECK_MODULES([LIBCURL], [libcurl], , [LIBCURL_CHECK_CONFIG]) +PKG_CHECK_MODULES([CPPUNIT], [cppunit],, [no_cppunit="yes"]) +PKG_CHECK_MODULES([DEPENDENCIES], [libtorrent >= 0.13.4]) + +LIBS="$PTHREAD_LIBS $CURSES_LIB $CPPUNIT_LIBS $LIBCURL $LIBCURL_LIBS $DEPENDENCIES_LIBS $LIBS" +CFLAGS="$CFLAGS $PTHREAD_CFLAGS $CPPUNIT_CFLAGS $LIBCURL_CPPFLAGS $LIBCURL_CFLAGS $DEPENDENCIES_CFLAGS $CURSES_CFLAGS" +CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS $CPPUNIT_CFLAGS $LIBCURL_CPPFLAGS $LIBCURL_CFLAGS $DEPENDENCIES_CFLAGS $CURSES_CFLAGS" AC_LANG_PUSH(C++) TORRENT_WITH_XMLRPC_C