DataLife Engine > Unix > Unix+ Samba + ftpd, проблемы и решения
Unix+ Samba + ftpd, проблемы и решения9 ноября 2007. Разместил: podpole |
Есть такая проблема: сложно найти ftpd, понимающий перекодировку имен файлов. Если хранить файлы на сервере в koi8, то ftpшник выдает винде крякозябры. Если хранить в CP1251, то ftp не передает букву "Я", считая ее управляющим символом.
Как решать? Проблема буквы я возникает в случае, если ftpd весь сетевой i/o пропускает через telnet-фильтр, где буква Я - управляющий символ. В том числе к таким серверам относится ProFtpd Решаем проблему на его примере: 1. Управляющие символы в телнете называются IAC (Is A Command) 2. Распаковываем исходники и делаем поиск по строке IAC 3. Находим 2 файла: netio.c и netio.h, где эта строка встречается. 4. Смотрим файл netio.c и находим там следующий код: switch (mode) { case IAC: switch (cp) { case WILL: case WONT: case DO: case DONT: mode = cp; continue; case IAC: mode = 0; break; default: /* Ignore */ mode = 0; continue; } break; case WILL: case WONT: pr_netio_printf(out_nstrm, "%c%c%c", IAC, DONT, cp); mode = 0; continue; case DO: case DONT: pr_netio_printf(out_nstrm, "%c%c%c", IAC, WONT, cp); mode = 0; continue; default: if (cp == IAC) { mode = cp; continue; } break; } 5. Путем вдумчивого рассматривания понимаем, что именно эти строчки отвечают за проверку на телнет-вшивость. 6. Удаляем все это безобразие. 7. Компилим и радуемся! В итоге имеем: Все названия лежат на юникс-машине в CP1251- кодировке. Для передачи их винде по фтп ничего не меняется, и буква "Я" исправлена. Для передаче по Самбе используем следующие настройки: display charset = CP1251 unix charset = CP1251 dos charset = CP866 |