Есть такая неприятная особенность нашего мира: как правило на наших хардах файлы лежат не в любимой виндоусом кодировке CP1251, а в koi8-r или utf-8. Что при использовании фтп приносит некоторую головную боль, т.к виндовые фтп-клиенты в большинстве своем желают видеть на сервере файлы в кодировке CP1251, а поисковик часто идет у них на поводу. Есть два пути решения проблемы: либо хранить файлы у себя уже в CP1251, либо осуществлять перекодирование "на лету". Первый вариант меня абсолютно не устраивает. Поэтому мы пойдем по второму. В некоторых фтп-серверах, например в pure-ftpd есть такая возможность "из коробки", а вот в столь любимом мной proftpd ее нет :(. Зато к версиям 1.2.10 и 1.3.0 есть патчик от наших японских друзей, который сию функциональность добавляет. Все было хорошо, даже в родном фряшном порте появилась опция, позволяющая наклыдвать этот патч прям из порта, поставил крестик - и доволен :). Но с приходом в мир версии 1.3.1 опция изчезла, а старые патчи не накладывались. Сначала не захотел возиться с кодом proftpd и разбираться почему не патчится, попробовал мигрировать на pure-ftpd, но прошел месяц, и я в очередной раз осознал, что функциональности этого сервера мне не хватает, слишком уж много у меня заморочек, большая их часть правда еще в проекте :). Итак было принято героическое решение разобраться и пропатчить таки proftpd. По привычке полез в гугл, вдруг кто уже все сделал, так нет, всем лень или никто не хочет делиться. Чтож, полез сам, оказалось все намного проще, чем думал :).
Как это было
Итак, идем в порт ftp/proftpd и делаем там make extract. Попутно качая патчи для версии 1.3.0 (ссылку на них я не привожу - лежат на каждом втором сервере, если надо - гугл вас спасет :)). Патчим, что-то где-то ругается. Говорим make. И очень быстро вылетаем с ошибкой в mod_ls.c, говорят, что переменную buf2 компилятор первый раз в глаза видит, а ей уже сто-то присваивают, даже не объявив, не хорошо. Идем разбираться. Открываем любимым текстовым редактором файл work/proftpd-1.3.1/modules/mod_ls.c (в моем случае это vim, но это так, к слову) и топаем к строке с ошибкой. В соседней консоли внимательно смотрим в соответствующий diff. Оказывается немного изменили строки выше, и объявления из патча просто не нашли куда себя вставлять :). Дописываем и продолжаем сборку. И о чудо! Все собралось, поставилось и даже заработало :). (В опциях порта я выбрал CYRFIX, чтоб не вырезать руками кусок netio.c).
После такого быстрого успеха руки зачесались, потому я сделал патч для новой версии, патч уже включает в себя патч CYRFIX, потому тот накладывать уже не надо.
Накладываем патч на родной порт:
Идем все туда же - ftp/proftpd, make extract, распаковываем архив с патчами в work, собственно накладываем патч :). Дальше make config install. Галку на пункте CYRFIX можно не ставить. Вуаля!
Ленивые обладатели FreeBSD могут сильно не думать, а сразу скачать архив с готовым портом, распаковать, и с помощью привычных make install && make clean, проставив нужные галки, получить готовый Proftpd. (Опция, включающая перекодирование - ICONV)
Файлы:
Переделанный патч, ничего после него править руками не надо, все сам делает, умный :) Берем его здесь