Alexander V. Lukyanov
Wed, 16 Sep 2009 02:30:59 -0700
On Wed, Sep 16, 2009 at 10:55:20AM +0300, Hasso Tepper wrote: > The point is that "//TRANSLIT" is unnecessary and really invalid argument > for Citrus iconv_open. Also, shouldn't it behave more sanely if > iconv_open() is failing for whatever reason?
Please try this patch. It fixes both problems. -- Alexander.
Index: buffer.cc
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/buffer.cc,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -p -r1.74 -r1.75
--- buffer.cc 5 Aug 2009 06:27:13 -0000 1.74
+++ buffer.cc 16 Sep 2009 09:22:41 -0000 1.75
@@ -247,11 +247,6 @@ void DataTranslator::AppendTranslated(Bu
#ifdef HAVE_ICONV
void DataRecoder::PutTranslated(Buffer *target,const char *put_buf,int size)
{
- if(!backend_translate)
- {
- target->Put(put_buf,size);
- return;
- }
bool from_untranslated=false;
if(Size()>0)
{
@@ -261,6 +256,13 @@ void DataRecoder::PutTranslated(Buffer *
}
if(size<=0)
return;
+ if(!backend_translate)
+ {
+ target->Put(put_buf,size);
+ if(from_untranslated)
+ Skip(size);
+ return;
+ }
size_t put_size=size;
int size_coeff=6;
@@ -313,20 +315,23 @@ DataRecoder::~DataRecoder()
}
DataRecoder::DataRecoder(const char *from_code,const char *to_code,bool
translit)
{
- if(translit)
- {
- const char *add="//TRANSLIT";
- char *tmp_enc=alloca_strdup2(to_code,strlen(add));
- strcat(tmp_enc,add);
- to_code=tmp_enc;
+ backend_translate=0;
+
+ if(translit) {
+ const char *to_code_translit=xstring::cat(to_code,"//TRANSLIT",NULL);
+ backend_translate=iconv_open(to_code_translit,from_code);
+ if(backend_translate!=(iconv_t)-1)
+ return;
+ backend_translate=0;
}
+
backend_translate=iconv_open(to_code,from_code);
- if(backend_translate==(iconv_t)-1)
- {
- Log::global->Format(0,"iconv_open(%s,%s) failed: %s\n",
+ if(backend_translate!=(iconv_t)-1)
+ return;
+
+ Log::global->Format(0,"iconv_open(%s,%s) failed: %s\n",
to_code,from_code,strerror(errno));
- backend_translate=0;
- }
+ backend_translate=0;
}
void DirectedBuffer::SetTranslation(const char *enc,bool translit)