BTPD (The BitTorrent Protocol Daemon) - отличный консольный bittorrent-клиент, построенный по принципу демона.
Клиент довольно минималистичный ("a good choice for the casual user", как пишут сами разработчики), но благодаря этому нетребователен к ресурсам, быстр и не сложен в освоении.
Состоит из двух основных частей - btpd (собственно демона) и btcli (управляющей программы). Параметры командной строки этих команд подробно описаны в README на сайте разработчиков.
Проблемы.
1) Кириллица в выводе btcli.
При вызове команды btcli list нарушается форматирования строчек с торрентами, в названиях которых присутствуют русские буквы:
Это возникает из-за того, что имена хранятся в UTF-8 и русские буквы занимают 2 байта, при форматировании же команда печати считает все буквы однобайтовыми.
Я предлагаю простенькое решение данной проблемы в виде патча list.c.patch:
1a2
> #include <iconv.h>
78a80
>
82c84,99
< struct item *p;
---
> // Параметр кодирования -->
> iconv_t ss_iconv_t;
> ss_iconv_t = iconv_open("CP1251", "UTF-8");
> // Параметр кодирования <--
>
> // Буфер для перекодированного имени торрента и переменные длин строк
> char *ss_name = NULL;
> int ss_size;
> int ss_inbytesleft;
> int ss_outbytesleft;
> char *ss_inbuf;
> char *ss_outbuf;
> int ss_i;
>
> struct item *p;
>
84c101,120
< printf("%-40.40s %4u %c. ", p->name, p->num, p->st);
---
> // Перекодируем имя торрента в CP-1251 -->
> ss_size = strlen(p->name);
> ss_inbytesleft = ss_size;
> ss_outbytesleft = ss_size;
>
> ss_name = realloc(ss_name, ss_size + 1);
>
> for(ss_i = 0; ss_i < ss_size + 1; ss_i++)
> ss_name[ss_i] = '\0';
>
> ss_inbuf = p->name;
> ss_outbuf = ss_name;
>
> if(iconv(ss_iconv_t, &ss_inbuf, &ss_inbytesleft, &ss_outbuf, &ss_outbytesleft) == -1)
> perror("Iconv failed");
> // Перекодируем имя торрента в CP-1251 <--
>
> printf("%-40.40s %4u %c. ", ss_name, p->num, p->st);
>
> //printf("%-40.40s %4u %c. ", p->name, p->num, p->st);
89a126,129
>
> // Закрываем параметр кодирования и освобождаем память для перекодированного имени
> iconv_close(ss_iconv_t);
> free(ss_name);
Патч накладывается стандартным способом ($patch list.c list.c.patch) на файл btpd-0.13/cli/list.c.
Суть изменений в конвертации имен в кодировку CP1251 перед печатью, где очевидно 1 буква всегда равна одному байту.
Конечно в случае кодировки терминала UTF-8 вывод будет выглядить примерно так:
Что легко исправляется тем же iconv'ом (я предлагаю прописать алиас в bashrc вида
alias b='btcli list | iconv -f CP1251 -t UTF-8' ).
Как видите в результате получается нормально отформатированный список:
Тестированием особым я конечно не занимался, поэтому рекомендую сохранить непропатченную версию файла btcli на случай, если будут какие-либо неприятности с исправленной.
Замечу также, что патч создавался для версии 0.13 и может не работать на других версиях.
2) Запуск btpd.
Проблема удобного запуска btpd решается стандартным скриптом для init.d, который можно как вручную ссылками добавить в rc*.d, так и с помощью chkconfig.
Привожу свой вариант скрипта "btpd":
#!/bin/sh
#
# chkconfig: 2345 33 33
# description: BitTorrent Protocol Daemon
# Source function library.
. /etc/init.d/functions
start()
{
echo -n "Starting BTPD: "
echo_success
su - $USER -c "btpd --bw-out 1000"
echo
}
stop()
{
echo -n "Stopping BTPD: "
echo_success
su - $USER -c "btcli kill 1"
sleep 1
echo
}
restart()
{
stop
sleep 5
start
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
msg_usage "${0##*/} {start|stop|restart}"
esac
exit
Естественно $USER замените на пользователя, под которым хотите запускать btpd, либо определите данную переменную.
Есть смысл конечно задать и свои параметры (зд. демон запускается с параметром --bw-out 1000).
Ключевые слова: BitTorrent, BTPD, Linux
Спасибо за полезный пост, сейчас как раз хотел заняться настройкой btpd, избавил от лишних движений и сэкономил время, спасиоб (:
современный btpd уже имеет стандартный init.d-скрипт не некрофильствуйте)