URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 51187
[ Назад ]

Исходное сообщение
"proftpd и буква 'я'"

Отправлено scout , 03-Дек-04 10:08 
При закачке файлов windows-клиентами на ftp-сервер в именах файлов поглощается буква "я" (код 0xFF) и один символ, идущий за ней. Например: "Скрытая угроза.avi" превращается в "Скрытаугроза.avi". Это как-нибудь можно побороть ?

Содержание

Сообщения в этом обсуждении
"proftpd и буква 'я'"
Отправлено Keeper , 03-Дек-04 10:41 
>При закачке файлов windows-клиентами на ftp-сервер в именах файлов поглощается буква "я"
>(код 0xFF) и один символ, идущий за ней. Например: "Скрытая угроза.avi"
>превращается в "Скрытаугроза.avi". Это как-нибудь можно побороть ?

Поиск по форуму. Lavr постил решения для и для proftpd, и для FreeBSD ftpd.


"proftpd и буква 'я'"
Отправлено scout , 03-Дек-04 11:13 
>>При закачке файлов windows-клиентами на ftp-сервер в именах файлов поглощается буква "я"
>>(код 0xFF) и один символ, идущий за ней. Например: "Скрытая угроза.avi"
>>превращается в "Скрытаугроза.avi". Это как-нибудь можно побороть ?
>
>Поиск по форуму. Lavr постил решения для и для proftpd, и для
>FreeBSD ftpd.

Так и сделал первым делом. Может я плохо искал, - решения проблемы 0xFF не нашел. Конечно замечательно заставить всех пользоваться клиентами, поддерживающими KOI8-R, но это просто нереально.


"proftpd и буква 'я'"
Отправлено Keeper , 03-Дек-04 11:20 
>>>При закачке файлов windows-клиентами на ftp-сервер в именах файлов поглощается буква "я"
>>>(код 0xFF) и один символ, идущий за ней. Например: "Скрытая угроза.avi"
>>>превращается в "Скрытаугроза.avi". Это как-нибудь можно побороть ?
>>
>>Поиск по форуму. Lavr постил решения для и для proftpd, и для
>>FreeBSD ftpd.
>
>Так и сделал первым делом. Может я плохо искал, - решения проблемы
>0xFF не нашел. Конечно замечательно заставить всех пользоваться клиентами, поддерживающими KOI8-R,
>но это просто нереально.

Было, было на форуме. Сам оттуда брал. Идея такая - ищем кусок кода с "IAC" и комментим его нафиг.


"proftpd и буква 'я'"
Отправлено scout , 03-Дек-04 11:26 
>Было, было на форуме. Сам оттуда брал. Идея такая - ищем кусок
>кода с "IAC" и комментим его нафиг.

Во! Судя по коду - это оно. Попробую вечером.


"proftpd и буква 'я'"
Отправлено scout , 05-Дек-04 11:45 
>>Было, было на форуме. Сам оттуда брал. Идея такая - ищем кусок
>>кода с "IAC" и комментим его нафиг.
>
>Во! Судя по коду - это оно. Попробую вечером.

Все работает. В файле netio.c заменить реализацию функции pr_netio_telnet_gets на следующее:

char *pr_netio_telnet_gets(char *buf, size_t buflen,
    pr_netio_stream_t *in_nstrm, pr_netio_stream_t *out_nstrm) {

  char *bp = buf;
  unsigned char cp;
  static unsigned char mode = 0;
  int toread;
  pr_buffer_t *pbuf = NULL;
  buflen--;

  if (in_nstrm->strm_buf)
    pbuf = in_nstrm->strm_buf;
  else
    pbuf = netio_buffer_alloc(in_nstrm);

  while (buflen) {

    /* Is the buffer empty? */
    if (!pbuf->current ||
        pbuf->remaining == pbuf->buflen) {

      toread = pr_netio_read(in_nstrm, pbuf->buf,
        (buflen < pbuf->buflen ?  buflen : pbuf->buflen), 1);

      if (toread <= 0) {
        if (bp != buf) {
          *bp = '\0';
          return buf;

        } else
          return NULL;
      }

      pbuf->remaining = pbuf->buflen - toread;
      pbuf->current = pbuf->buf;

    } else
      toread = pbuf->buflen - pbuf->remaining;

    while (buflen && toread > 0 && *pbuf->current != '\n' && toread--) {
      cp = *pbuf->current++;
      pbuf->remaining++;
      *bp++ = cp;
      buflen--;
    }

    if (buflen && toread && *pbuf->current == '\n') {
      buflen--;
      toread--;
      *bp++ = *pbuf->current++;
      pbuf->remaining++;
      break;
    }

    if (!toread)
      pbuf->current = NULL;
  }

  *bp = '\0';
  return buf;
}


PS Верно для proftpd-1.2.10.