LINUX.ORG.RU

iconv - почему получаю invalid argumests


0

0

патчу vsftpd, чтобы имена файлов из кодировки UTF-8 в CP1251 переводил.

сначала изменил функцию вывода списка файлов, все работало. потом изменил функцию обработки входящих команд - здесь несмотря на copy-paste iconv_open выдавал invalid arguments.

теперь просто хочу написать функцию, которая будет конвертировать заданную строку из одной кодировки в другую. но она тоже вылетает на iconv_open с invalid aruments, с параметрами "CP1251", "UTF-8", хотя отдельно написанная программа отлично перекодирует из юникода в cp. точно таким же способом.

хотел посмотреть, что скажет strace, но vsftpd при подключении клиентов форкается, и strace молчит..

void
str_iconv(struct mystr* p_str, char *to_enc, char *from_enc)
{
iconv_t cd;
char tmp[1024], *to_buf, *from_buf;
size_t sz_from, sz_to, nconv;

cd = iconv_open((const char *)to_enc, (const char *)from_enc);
if (cd == (iconv_t)(-1)) {
str_append_text(p_str, strerror(errno));
str_syslog(p_str, 1);
return;
}
from_buf = (char*)str_strdup(p_str);
to_buf = tmp;
sz_from = str_getlen(p_str);
sz_to = 1023;
nconv = iconv(cd, &from_buf, &sz_from, &to_buf, &sz_to);
iconv_close(cd);
str_empty(p_str);
str_append_text(p_str, tmp);
}


у strace есть ключ чтобы он и потомков трассировал. в мане все есть

x86 ★★
()

Вот моя маленькая функция для конверта из UTF-8  в  KOI8-R  и наоборот. Работает нормально.


//! Converting string from UTF-8 to KOI8-R or from KOI8-R to UTF-8
//! @return true if success
//! @param utf2koi true if conversion from KOI8-R to UTF-8, false if otherwise
bool utf2koi(char *src, unsigned int src_len, char *dst, unsigned int dst_len, bool utf2koi)
{
  iconv_t ic;
  if ( utf2koi )
	ic = iconv_open("KOI8-R","UTF-8");
  else
	ic = iconv_open("UTF-8","KOI8-R"); 
  if ( ic == (iconv_t)(-1)) {
    cerr << "[ DEBUG ] Error in iconv_open: " << strerror(errno) << endl;
    return false;
  }
  size_t ret = iconv(ic,&src,&src_len ,&dst,&dst_len);
  if ( ret == (size_t)(-1)) {
	cerr << "[ DEBUG ] Error in iconv: " << strerror(errno) << endl;
	iconv_close(ic);
	return false;
  }
  iconv_close(ic);
  return true;
}

Dead ★★★★
()
Ответ на: комментарий от Dead

может сын chroot делает? тогда iconv не будет работать, так как подгружает таблицы перекодирования.

anonymous
()
Ответ на: комментарий от anonymous

так и оказалось, все дело в chroot засунул iconv_open в main() и все получилось, спасибо! +)

теперь понимаю, что значило vsftpd was written with security in mind +)

x029ah
() автор топика
Ответ на: комментарий от x029ah

кстати будь добр. патч свой опубликуй, я давно хотел поковырятся
с ним на эту тему, да все руки не доходили...

signal11
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.