Это архив блога mr.The Блог больше не обновляется. статьи сохранены в ознакомительных целях.

Патчим libtorrent!

2010-04-17

В связи с переходом на линукс, встала проблема о использовании торрентов. И не просто использовании, а что бы как и раньше - не думать о рейтинге. Благо, тут всё opensource и всё намного проще чем в случае с uTorrent.
.

В качестве клиента я выбрал Deluge. Он лёгкий, достаточно быстрый и часто обновляется. Написан на питоне и использует libtorrent.
.

Так как патч будет для libtorrent, то он будет работать для всех клиентов, использующих эту либу.
И так, приступим.

.

Скачиваем свежий libtorrent-rasterbar, распаковываем в любую удобную папку.

Теперь, нужно найти в каком файле передаётся информация на трекер. Выполним поиск по содержимому файлов:

find -type f -exec grep -il "downloaded" {} ;

На выходе будет достаточно большой список файлов. Опытным путём, установлено, что нужные файлы:

./src/http_tracker_connection.cpp
./src/udp_tracker_connection.cpp

Их-то и предстоит патчить.
.

Как видно из названия, первый файл - для http соединений, а второй - для udp. Второй случай, конечно, много реже, но его так же не мешает пропатчить.
.

Теперь по порядку:
.

http_tracker_connection.cpp
Находим строку в которой есть "downloaded". У меня сразу был найдена нужная строка, выглядит примерно так:

      snprintf(str, sizeof(str), "&peer_id=%s&port=%d&uploaded=%"PRId64
            "&**downloaded**=%"PRId64"&**left**=%"PRId64"&corrupt=%"PRId64"&compact=1"
            "&numwant=%d&key=%x&no_peer_id=1"
            , escape_string((const char*)&tracker_req().pid[0], 20).c_str()
            , tracker_req().listen_port
            , stats ? tracker_req().uploaded : 0
            , stats ? tracker_req().downloaded : 0
            , stats ? tracker_req().left : 0
            , stats ? tracker_req().corrupt : 0
            , tracker_req().num_want
            , tracker_req().key);
        url += str;

Здесь нас интересуют параметры downloaded и left.
Теперь просто заменим строки

          , stats ? tracker_req().downloaded : 0
            , stats ? tracker_req().left : 0

на

          , 0 
            , 0

Тут, конечно, можно добавить деление реально скачанного, например, на 5. Что бы уменьшить риск бана, но это уже по вкусу.
.

Далее, udp_tracker_connection.cpp:
Находим строки вида

  detail::write_int64(stats ? req.downloaded : 0, out); // downloaded
    detail::write_int64(stats ? req.left : 0, out); // left

И по аналогии с http версией заменяем их на

  detail::write_int64(0, out); // downloaded
    detail::write_int64(0, out); // left

Вот собственно и всё. Осталось скомпилировать и установить libtorrent:

./configure && make && make install

В случае с ubuntu, не забывайте о sudo.
.

Надо сказать, собирается он довольно долго. На моём Athlon X2 2.1 Ghz и 3GB озу это заняло около 15-ти минут.
.

Да, всё описанное действительно для версии 0.15.0. Например в 0.14.9 строки выглядят немного по другому, хотя найти их не составляет труда.