aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Sokolovsky <pmiscml@gmail.com>2008-01-14 14:17:38 +0000
committerPaul Sokolovsky <pmiscml@gmail.com>2008-01-14 14:17:38 +0000
commitb103a3b2eba497064248d9877c1f1bc02bdb2656 (patch)
treeec9ea015019613040a4a24715a755f525b6b3296
parent5eb8a56cfeee0bc50ce17334bbd8895bef4be5f4 (diff)
downloadopenembedded-b103a3b2eba497064248d9877c1f1bc02bdb2656.tar.gz
vsftpd-charconv 2.0.5: Add version patched for on-the-file filenames transcoding,
* This patch is extracted and cleaned up version of filename character set conversion patches for vsftpd by Dmitriy Balashov, http://vsftpd.devnet.ru/eng/ . It provides dirty-pragmatics approach towards serving Windows codepages encoded filenames to Windows clients out of normal utf-8 filesystem. These patches will never be accepted upstream, they should never be merged to main vsftpd package, and they for sure void "vs" in "vsftpd". So again, they are for users to prefer stone-dead pragmatics. Use at you own risk.
-rw-r--r--packages/vsftpd/vsftpd-charconv-2.0.5/.mtn2git_empty0
-rw-r--r--packages/vsftpd/vsftpd-charconv-2.0.5/vsftpd-charconv.patch4365
-rw-r--r--packages/vsftpd/vsftpd-charconv_2.0.5.bb50
3 files changed, 4415 insertions, 0 deletions
diff --git a/packages/vsftpd/vsftpd-charconv-2.0.5/.mtn2git_empty b/packages/vsftpd/vsftpd-charconv-2.0.5/.mtn2git_empty
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/packages/vsftpd/vsftpd-charconv-2.0.5/.mtn2git_empty
diff --git a/packages/vsftpd/vsftpd-charconv-2.0.5/vsftpd-charconv.patch b/packages/vsftpd/vsftpd-charconv-2.0.5/vsftpd-charconv.patch
new file mode 100644
index 0000000000..affdd32075
--- /dev/null
+++ b/packages/vsftpd/vsftpd-charconv-2.0.5/vsftpd-charconv.patch
@@ -0,0 +1,4365 @@
+This patch is extracted and cleaned up version of filename character
+set conversion patches for vsftpd by Dmitriy Balashov,
+http://vsftpd.devnet.ru/eng/ . It provides dirty-pragmatics approach
+towards serving Windows codepages encoded filenames to Windows clients
+out of normal utf-8 filesystem.
+
+These patches will never be accepted upstream, they should never be merged
+to main vsftpd package, and they for sure void "vs" in "vsftpd". So again,
+they are for users to prefer stone-dead pragmatics. Use at you own risk.
+
+- Paul Sokolovsky, pmiscml@gmail.com
+
+diff -urN vsftpd-2.0.5.org/charconv.c vsftpd-2.0.5/charconv.c
+--- vsftpd-2.0.5.org/charconv.c 1970-01-01 03:00:00.000000000 +0300
++++ vsftpd-2.0.5/charconv.c 2008-01-13 20:39:49.000000000 +0200
+@@ -0,0 +1,462 @@
++/*
++ * Part of Very Secure FTPd
++ * Licence: GPL v2
++ * Author: Dmitriy Balashov
++ * charconv.c
++ */
++
++#include "charconv.h"
++#include "tunables.h"
++#include "session.h"
++#include "str.h"
++#include "sysutil.h"
++
++#include "char_maps/utf8.map"
++#ifdef VSFTP_CHARCONV_SUPPORT_CYRILLIC
++#include "char_maps/cyrillic.map"
++#endif
++#ifdef VSFTP_CHARCONV_SUPPORT_WESTERN
++#include "char_maps/western.map"
++#endif
++#ifdef VSFTP_CHARCONV_SUPPORT_CENTRAL
++#include "char_maps/central.map"
++#endif
++#ifdef VSFTP_CHARCONV_SUPPORT_SOUTERN
++#include "char_maps/soutern.map"
++#endif
++
++/* Tables mapping supported codepage names to runtime variables */
++static struct available_charsets
++{
++ const char* p_charset_name;
++ int p_variable;
++}
++available_charsets_array[] =
++{
++ { VSFTP_CP_NONE , VSFTP_C_NONE },
++ // Cyrillic
++#ifdef VSFTP_CHARCONV_SUPPORT_CYRILLIC
++ { VSFTP_CP_UTF_8 , VSFTP_C_UTF8 },
++ { VSFTP_CP_UTF8 , VSFTP_C_UTF8 },
++ { VSFTP_CP_WIN_1251 , VSFTP_C_1251 },
++ { VSFTP_CP_WIN1251 , VSFTP_C_1251 },
++ { VSFTP_CP_CP1251 , VSFTP_C_1251 },
++ { VSFTP_CP_1251 , VSFTP_C_1251 },
++ { VSFTP_CP_KOI8_R , VSFTP_C_878R },
++ { VSFTP_CP_KOI8R , VSFTP_C_878R },
++ { VSFTP_CP_CP878 , VSFTP_C_878R },
++ { VSFTP_CP_878 , VSFTP_C_878R },
++ { VSFTP_CP_CP878R , VSFTP_C_878R },
++ { VSFTP_CP_878R , VSFTP_C_878R },
++ { VSFTP_CP_KOI8_U , VSFTP_C_878U },
++ { VSFTP_CP_KOI8U , VSFTP_C_878U },
++ { VSFTP_CP_CP878U , VSFTP_C_878U },
++ { VSFTP_CP_878U , VSFTP_C_878U },
++ { VSFTP_CP_IBM866 , VSFTP_C_866 },
++ { VSFTP_CP_CP866 , VSFTP_C_866 },
++ { VSFTP_CP_866 , VSFTP_C_866 },
++ { VSFTP_CP_ISO8859_5 , VSFTP_C_ISO5 },
++ { VSFTP_CP_ISO5 , VSFTP_C_ISO5 },
++#endif
++ // Western European
++#ifdef VSFTP_CHARCONV_SUPPORT_WESTERN
++ { VSFTP_CP_ISO8859_1 , VSFTP_C_ISO1 },
++ { VSFTP_CP_ISO1 , VSFTP_C_ISO1 },
++ { VSFTP_CP_LATIN1 , VSFTP_C_ISO1 },
++ { VSFTP_CP_ISO8859_15, VSFTP_C_ISO15 },
++ { VSFTP_CP_ISO15 , VSFTP_C_ISO15 },
++ { VSFTP_CP_LATIN9 , VSFTP_C_ISO15 },
++ { VSFTP_CP_WIN_1252 , VSFTP_C_1252 },
++ { VSFTP_CP_WIN1252 , VSFTP_C_1252 },
++ { VSFTP_CP_CP1252 , VSFTP_C_1252 },
++ { VSFTP_CP_1252 , VSFTP_C_1252 },
++#endif
++ // Central European
++#ifdef VSFTP_CHARCONV_SUPPORT_CENTRAL
++ { VSFTP_CP_ISO8859_2 , VSFTP_C_ISO2 },
++ { VSFTP_CP_ISO2 , VSFTP_C_ISO2 },
++ { VSFTP_CP_LATIN2 , VSFTP_C_ISO2 },
++ { VSFTP_CP_ISO8859_16, VSFTP_C_ISO16 },
++ { VSFTP_CP_ISO16 , VSFTP_C_ISO16 },
++ { VSFTP_CP_WIN_1250 , VSFTP_C_1250 },
++ { VSFTP_CP_WIN1250 , VSFTP_C_1250 },
++ { VSFTP_CP_CP1250 , VSFTP_C_1250 },
++ { VSFTP_CP_1250 , VSFTP_C_1250 },
++#endif
++ // Soutern European
++#ifdef VSFTP_CHARCONV_SUPPORT_SOUTERN
++ { VSFTP_CP_ISO8859_3 , VSFTP_C_ISO3 },
++ { VSFTP_CP_ISO3 , VSFTP_C_ISO3 },
++ { VSFTP_CP_LATIN3 , VSFTP_C_ISO3 },
++#endif
++ { 0, 0 }
++};
++
++/* Available convertions */
++static struct available_convertions
++{
++ int local;
++ int remote;
++ int localCharset;
++ int remoteCharset;
++}
++available_convertions_array[] =
++{ // Cyrillic
++#ifdef VSFTP_CHARCONV_SUPPORT_CYRILLIC
++ { VSFTP_C_UTF8 , VSFTP_C_1251 , VSFTP_CS_UTF8CYR , VSFTP_CS_1251 },
++ { VSFTP_C_UTF8 , VSFTP_C_878R , VSFTP_CS_UTF8CYR , VSFTP_CS_878R },
++ { VSFTP_C_UTF8 , VSFTP_C_878U , VSFTP_CS_UTF8CYR , VSFTP_CS_878U },
++ { VSFTP_C_UTF8 , VSFTP_C_866 , VSFTP_CS_UTF8CYR , VSFTP_CS_866 },
++ { VSFTP_C_UTF8 , VSFTP_C_ISO5 , VSFTP_CS_UTF8CYR , VSFTP_CS_ISO5 },
++ { VSFTP_C_1251 , VSFTP_C_UTF8 , VSFTP_CS_1251 , VSFTP_CS_UTF8CYR },
++ { VSFTP_C_1251 , VSFTP_C_878R , VSFTP_CS_1251 , VSFTP_CS_878R },
++ { VSFTP_C_1251 , VSFTP_C_878U , VSFTP_CS_1251 , VSFTP_CS_878U },
++ { VSFTP_C_1251 , VSFTP_C_866 , VSFTP_CS_1251 , VSFTP_CS_866 },
++ { VSFTP_C_1251 , VSFTP_C_ISO5 , VSFTP_CS_1251 , VSFTP_CS_ISO5 },
++ { VSFTP_C_878R , VSFTP_C_UTF8 , VSFTP_CS_878R , VSFTP_CS_UTF8CYR },
++ { VSFTP_C_878R , VSFTP_C_1251 , VSFTP_CS_878R , VSFTP_CS_1251 },
++ { VSFTP_C_878R , VSFTP_C_878U , VSFTP_CS_878R , VSFTP_CS_878U },
++ { VSFTP_C_878R , VSFTP_C_866 , VSFTP_CS_878R , VSFTP_CS_866 },
++ { VSFTP_C_878R , VSFTP_C_ISO5 , VSFTP_CS_878R , VSFTP_CS_ISO5 },
++ { VSFTP_C_866 , VSFTP_C_UTF8 , VSFTP_CS_866 , VSFTP_CS_UTF8CYR },
++ { VSFTP_C_866 , VSFTP_C_1251 , VSFTP_CS_866 , VSFTP_CS_1251 },
++ { VSFTP_C_866 , VSFTP_C_878R , VSFTP_CS_866 , VSFTP_CS_878R },
++ { VSFTP_C_866 , VSFTP_C_878U , VSFTP_CS_866 , VSFTP_CS_878U },
++ { VSFTP_C_866 , VSFTP_C_ISO5 , VSFTP_CS_866 , VSFTP_CS_ISO5 },
++ { VSFTP_C_ISO5 , VSFTP_C_UTF8 , VSFTP_CS_ISO5 , VSFTP_CS_UTF8CYR },
++ { VSFTP_C_ISO5 , VSFTP_C_1251 , VSFTP_CS_ISO5 , VSFTP_CS_1251 },
++ { VSFTP_C_ISO5 , VSFTP_C_878R , VSFTP_CS_ISO5 , VSFTP_CS_878R },
++ { VSFTP_C_ISO5 , VSFTP_C_878U , VSFTP_CS_ISO5 , VSFTP_CS_878U },
++ { VSFTP_C_ISO5 , VSFTP_C_866 , VSFTP_CS_ISO5 , VSFTP_CS_866 },
++#endif
++ // Western European
++#ifdef VSFTP_CHARCONV_SUPPORT_WESTERN
++ { VSFTP_C_UTF8 , VSFTP_C_ISO1 , VSFTP_CS_UTF8WEST , VSFTP_CS_ISO1 },
++ { VSFTP_C_UTF8 , VSFTP_C_ISO15 , VSFTP_CS_UTF8WEST , VSFTP_CS_ISO15 },
++ { VSFTP_C_UTF8 , VSFTP_C_1252 , VSFTP_CS_UTF8WEST , VSFTP_CS_1252 },
++ { VSFTP_C_ISO1 , VSFTP_C_UTF8 , VSFTP_CS_ISO1 , VSFTP_CS_UTF8WEST },
++ { VSFTP_C_ISO1 , VSFTP_C_ISO15 , VSFTP_CS_ISO1 , VSFTP_CS_ISO15 },
++ { VSFTP_C_ISO1 , VSFTP_C_1252 , VSFTP_CS_ISO1 , VSFTP_CS_1252 },
++ { VSFTP_C_ISO15 , VSFTP_C_UTF8 , VSFTP_CS_ISO15 , VSFTP_CS_UTF8WEST },
++ { VSFTP_C_ISO15 , VSFTP_C_ISO1 , VSFTP_CS_ISO15 , VSFTP_CS_ISO1 },
++ { VSFTP_C_ISO15 , VSFTP_C_1252 , VSFTP_CS_ISO15 , VSFTP_CS_1252 },
++ { VSFTP_C_1252 , VSFTP_C_UTF8 , VSFTP_CS_1252 , VSFTP_CS_UTF8WEST },
++ { VSFTP_C_1252 , VSFTP_C_ISO1 , VSFTP_CS_1252 , VSFTP_CS_ISO1 },
++ { VSFTP_C_1252 , VSFTP_C_ISO15 , VSFTP_CS_1252 , VSFTP_CS_ISO15 },
++#endif
++ // Central European
++#ifdef VSFTP_CHARCONV_SUPPORT_CENTRAL
++ { VSFTP_C_UTF8 , VSFTP_C_ISO2 , VSFTP_CS_UTF8CENT , VSFTP_CS_ISO2 },
++ { VSFTP_C_UTF8 , VSFTP_C_ISO16 , VSFTP_CS_UTF8CENT , VSFTP_CS_ISO16 },
++ { VSFTP_C_UTF8 , VSFTP_C_1250 , VSFTP_CS_UTF8CENT , VSFTP_CS_1250 },
++ { VSFTP_C_ISO2 , VSFTP_C_UTF8 , VSFTP_CS_ISO2 , VSFTP_CS_UTF8CENT },
++ { VSFTP_C_ISO2 , VSFTP_C_ISO16 , VSFTP_CS_ISO2 , VSFTP_CS_ISO16 },
++ { VSFTP_C_ISO2 , VSFTP_C_1250 , VSFTP_CS_ISO2 , VSFTP_CS_1250 },
++ { VSFTP_C_ISO16 , VSFTP_C_UTF8 , VSFTP_CS_ISO16 , VSFTP_CS_UTF8CENT },
++ { VSFTP_C_ISO16 , VSFTP_C_ISO2 , VSFTP_CS_ISO16 , VSFTP_CS_ISO2 },
++ { VSFTP_C_ISO16 , VSFTP_C_1250 , VSFTP_CS_ISO16 , VSFTP_CS_1250 },
++ { VSFTP_C_1250 , VSFTP_C_UTF8 , VSFTP_CS_1250 , VSFTP_CS_UTF8CENT },
++ { VSFTP_C_1250 , VSFTP_C_ISO2 , VSFTP_CS_1250 , VSFTP_CS_ISO2 },
++ { VSFTP_C_1250 , VSFTP_C_ISO16 , VSFTP_CS_1250 , VSFTP_CS_ISO16 },
++#endif
++ // Soutern European
++#ifdef VSFTP_CHARCONV_SUPPORT_SOUTERN
++ { VSFTP_C_UTF8 , VSFTP_C_ISO3 , VSFTP_CS_UTF8SOUT , VSFTP_CS_ISO3 },
++ { VSFTP_C_ISO3 , VSFTP_C_UTF8 , VSFTP_CS_ISO3 , VSFTP_CS_UTF8SOUT },
++#endif
++
++ { 0, 0, 0, 0 }
++};
++
++map_ptr map_array[] =
++{
++ 0,
++#ifdef VSFTP_CHARCONV_SUPPORT_CYRILLIC
++ codepage_utf8cyr_array, codepage_win1251_array, codepage_koi8r_array,
++ codepage_ibm866_array, codepage_iso5_array, codepage_koi8u_array,
++#else
++ 0, 0, 0, 0, 0,
++#endif
++
++#ifdef VSFTP_CHARCONV_SUPPORT_WESTERN
++ codepage_utf8west_array, codepage_iso1_array, codepage_iso15_array,
++ codepage_win1252_array,
++#else
++ 0, 0, 0, 0,
++#endif
++
++#ifdef VSFTP_CHARCONV_SUPPORT_CENTRAL
++ codepage_utf8cent_array, codepage_iso2_array, codepage_iso16_array,
++ codepage_win1250_array,
++#else
++ 0, 0, 0, 0,
++#endif
++
++#ifdef VSFTP_CHARCONV_SUPPORT_SOUTERN
++ codepage_utf8sout_array, codepage_iso3_array,
++#else
++ 0, 0,
++#endif
++
++ 0
++};
++
++/* Initial table for work with unprintable chars */
++map_ptr init_array[] =
++{
++ 0,
++ codepage_utf8_array,
++#ifdef VSFTP_CHARCONV_SUPPORT_CYRILLIC
++ codepage_win1251_array, codepage_koi8r_array, codepage_ibm866_array,
++ codepage_iso5_array, codepage_koi8u_array,
++#else
++ 0, 0, 0, 0,
++#endif
++
++#ifdef VSFTP_CHARCONV_SUPPORT_WESTERN
++ codepage_iso1_array, codepage_iso15_array, codepage_win1252_array,
++#else
++ 0, 0, 0,
++#endif
++
++#ifdef VSFTP_CHARCONV_SUPPORT_CENTRAL
++ codepage_iso2_array, codepage_iso16_array, codepage_win1250_array,
++#else
++ 0, 0, 0,
++#endif
++
++#ifdef VSFTP_CHARCONV_SUPPORT_SOUTERN
++ codepage_iso3_array,
++#else
++ 0,
++#endif
++
++ 0
++};
++
++map_ptr localMap = 0, remoteMap = 0;
++map_ptr localTbl = 0, remoteTbl = 0;
++
++void char_convertion(struct mystr* p_str, int direction, char unprintable);
++void InitTables(map_ptr* map, map_ptr* table, int indexx);
++static int char_len(unsigned int s);
++static unsigned int bsearch_index(map_ptr map, unsigned int low, unsigned int high, unsigned int char_code);
++
++const char* vsf_charconv_charset_name(int code)
++{
++ int i = 0;
++ while (available_charsets_array [i].p_charset_name && available_charsets_array [i].p_variable != code) i++;
++ return available_charsets_array [i].p_charset_name;
++}
++
++int vsf_charconv_codepage(const char* p_str)
++{
++ const struct available_charsets* charsets = available_charsets_array;
++
++ while (charsets->p_charset_name != 0)
++ {
++ if (!vsf_sysutil_strcmp(charsets->p_charset_name, p_str))
++ {
++ return charsets->p_variable;
++ }
++ charsets++;
++ }
++
++ return 0;
++}
++
++int vsf_charconv_avail_convertion(int localCode, int remoteCode)
++{
++ const struct available_convertions* aconv = available_convertions_array;
++
++ while (aconv->local != 0)
++ {
++ if (localCode == aconv->local && remoteCode == aconv->remote)
++ {
++ InitTables(&localMap, &localTbl, aconv->localCharset);
++ InitTables(&remoteMap, &remoteTbl, aconv->remoteCharset);
++ return 1;
++ }
++ aconv++;
++ }
++
++ return 0;
++}
++
++void vsf_charconv_init_local_codepage(int localCode)
++{
++ if (!localCode)
++ {
++ return;
++ }
++
++ localTbl = init_array [localCode];
++ localMap = vsf_sysutil_malloc((localTbl [0].order + 1) * sizeof(_codepage_map));
++ localMap [0].char_code = localTbl [0].char_code;
++ localMap [0].order = localTbl [0].order;
++
++ int indexx = 1;
++ while (localTbl [indexx].char_code)
++ {
++ if (localTbl [indexx].order)
++ {
++ localMap [localTbl [indexx].order].char_code = localTbl [indexx].char_code;
++ localMap [localTbl [indexx].order].order = indexx;
++ }
++ indexx++;
++ }
++
++ return;
++}
++
++void vsf_charconv_convert(struct vsf_session* p_sess, struct mystr* p_str, int direction)
++{
++ if (!p_sess->enable_conversion || !p_sess->remote_charset || !tunable_local_codepage) return;
++
++ char_convertion(p_str, direction, '?');
++}
++
++void vsf_charconv_replace_unprintable(struct mystr* p_str, char new_char)
++{
++ if (localMap) char_convertion(p_str, VSFTP_CONVDIRECT_UNPRINTABLE, new_char);
++}
++
++void InitTables(map_ptr* map, map_ptr* table, int indexx)
++{
++ *table = map_array [indexx];
++
++ if (*map) vsf_sysutil_free(*map);
++
++ *map = vsf_sysutil_malloc(((*table) [0].order + 1) * sizeof(_codepage_map));
++ (*map) [0].char_code = (*table) [0].char_code;
++ (*map) [0].order = (*table) [0].order;
++
++ indexx = 1;
++ while ((*table) [indexx].char_code)
++ {
++ if ((*table) [indexx].order)
++ {
++ (*map) [(*table) [indexx].order].char_code = (*table) [indexx].char_code;
++ (*map) [(*table) [indexx].order].order = indexx;
++ }
++ indexx++;
++ }
++
++ return;
++}
++
++static int char_len(unsigned int s)
++{
++ int len = 1;
++ if ((s & 0x80) == 0x00) len = 1;
++ else if ((s & 0xe0) == 0xc0) len = 2;
++ else if ((s & 0xf0) == 0xe0) len = 3;
++ else if ((s & 0xf8) == 0xf0) len = 4;
++// else if ((s & 0xfc) == 0xf8) len = 5;
++// else if ((s & 0xfe) == 0xce) len = 6;
++ return (len);
++}
++
++static unsigned int bsearch_index(map_ptr map, unsigned int low, unsigned int high, unsigned int char_code)
++{
++ unsigned int m, l = low, r = high;
++
++ m = (l + r) >> 1;
++ while ((m != 0) && (map [m].char_code != char_code))
++ {
++ if (map [m].char_code < char_code) l = m + 1;
++ else
++ if (map [m].char_code > char_code) r = m - 1;
++ if (l > r)
++ return 0;
++ else
++ m = (l + r) >> 1;
++ }
++
++ if (m) m = map [m].order;
++ return m;
++}
++
++void char_convertion(struct mystr* p_str, int direction, char unprintable)
++{
++ const char* srcbuf;
++ unsigned int srclen;
++ char* dstbuf;
++ map_ptr src, dst;
++ unsigned int sl;
++ unsigned int srcpos = 0, dstpos = 0;
++ unsigned int char_code = 0;
++
++ srclen = str_getlen(p_str); // Len of source string
++ srcbuf = str_getbuf(p_str);
++
++ if (direction == VSFTP_CONVDIRECT_FORWARD)
++ {
++ src = localMap;
++ dst = remoteTbl;
++ }
++ else
++ if (direction == VSFTP_CONVDIRECT_BACKWARD)
++ {
++ src = remoteMap;
++ dst = localTbl;
++ }
++ else
++ {
++ src = localMap;
++ dst = localTbl;
++ }
++
++ if (!src || !dst)
++ {
++ return;
++ }
++
++ dstbuf = vsf_sysutil_malloc(srclen * dst [0].char_code + dst [0].char_code);
++
++ while (srcpos < srclen)
++ {
++ char_code = (unsigned char)srcbuf [srcpos++];
++ if (src [0].char_code > 1)
++ {
++ sl = char_len (char_code);
++ while (sl-- > 1)
++ {
++ char_code = (char_code << 8) | (unsigned char)srcbuf [srcpos++];
++ }
++ }
++
++ if (char_code > 127)
++ {
++ sl = bsearch_index (src, 1, src [0].order, char_code);
++ char_code = 0;
++ if (sl) char_code = dst [sl].char_code;
++ }
++
++ if (char_code == 13 || char_code == 10)
++ {
++ char_code = 0;
++ }
++ else
++ if (char_code < 32 && char_code != 9)
++ {
++ char_code = (unsigned int)unprintable;
++ }
++
++ if (char_code > 0 || direction != VSFTP_CONVDIRECT_UNPRINTABLE)
++ {
++ if (char_code & 0xff000000) dstbuf [dstpos++] = (char)((char_code >> 24) & 0xff);
++ if (char_code & 0x00ff0000) dstbuf [dstpos++] = (char)((char_code >> 16) & 0xff);
++ if (char_code & 0x0000ff00) dstbuf [dstpos++] = (char)((char_code >> 8) & 0xff);
++ if (char_code & 0x000000ff) dstbuf [dstpos++] = (char)((char_code ) & 0xff);
++ }
++ }
++
++ dstbuf [dstpos] = '\0';
++
++ str_empty(p_str);
++ str_append_text(p_str, dstbuf);
++
++ vsf_sysutil_free(dstbuf);
++}
++
+diff -urN vsftpd-2.0.5.org/charconv.h vsftpd-2.0.5/charconv.h
+--- vsftpd-2.0.5.org/charconv.h 1970-01-01 03:00:00.000000000 +0300
++++ vsftpd-2.0.5/charconv.h 2008-01-13 19:32:11.000000000 +0200
+@@ -0,0 +1,182 @@
++#ifndef VSF_CHARCONV_H
++#define VSF_CHARCONV_H
++
++struct mystr;
++struct vsf_session;
++
++#define VSFTP_CHARCONV_SUPPORT_CYRILLIC
++#define VSFTP_CHARCONV_SUPPORT_WESTERN
++#define VSFTP_CHARCONV_SUPPORT_CENTRAL
++#define VSFTP_CHARCONV_SUPPORT_SOUTERN
++
++#define VSFTP_CONVDIRECT_FORWARD 1
++#define VSFTP_CONVDIRECT_UNPRINTABLE 0
++#define VSFTP_CONVDIRECT_BACKWARD -1
++
++/* Supported charset for convertion */
++#define VSFTP_CP_NONE "NONE"
++#define VSFTP_CP_UTF_8 "UTF-8"
++#define VSFTP_CP_UTF8 "UTF8"
++#ifdef VSFTP_CHARCONV_SUPPORT_CYRILLIC
++#define VSFTP_CP_WIN_1251 "Win-1251"
++#define VSFTP_CP_WIN1251 "WIN1251"
++#define VSFTP_CP_CP1251 "CP1251"
++#define VSFTP_CP_1251 "1251"
++#define VSFTP_CP_KOI8_R "Koi8-R"
++#define VSFTP_CP_KOI8R "KOI8R"
++#define VSFTP_CP_KOI8_U "Koi8-U"
++#define VSFTP_CP_KOI8U "KOI8U"
++#define VSFTP_CP_CP878 "CP878"
++#define VSFTP_CP_878 "878"
++#define VSFTP_CP_CP878R "CP878R"
++#define VSFTP_CP_878R "878R"
++#define VSFTP_CP_CP878U "CP878U"
++#define VSFTP_CP_878U "878U"
++#define VSFTP_CP_IBM866 "IBM866"
++#define VSFTP_CP_CP866 "CP866"
++#define VSFTP_CP_866 "866"
++#define VSFTP_CP_ISO8859_5 "ISO-8859-5"
++#define VSFTP_CP_ISO5 "ISO5"
++#endif
++#ifdef VSFTP_CHARCONV_SUPPORT_WESTERN
++#define VSFTP_CP_ISO8859_1 "ISO-8859-1"
++#define VSFTP_CP_ISO1 "ISO1"
++#define VSFTP_CP_LATIN1 "LATIN1"
++#define VSFTP_CP_ISO8859_15 "ISO-8859-15"
++#define VSFTP_CP_ISO15 "ISO15"
++#define VSFTP_CP_LATIN9 "LATIN9"
++#define VSFTP_CP_WIN_1252 "Win-1252"
++#define VSFTP_CP_WIN1252 "WIN1252"
++#define VSFTP_CP_CP1252 "CP1252"
++#define VSFTP_CP_1252 "1252"
++#endif
++#ifdef VSFTP_CHARCONV_SUPPORT_CENTRAL
++#define VSFTP_CP_ISO8859_2 "ISO-8859-2"
++#define VSFTP_CP_ISO2 "ISO2"
++#define VSFTP_CP_LATIN2 "LATIN2"
++#define VSFTP_CP_ISO8859_16 "ISO-8859-16"
++#define VSFTP_CP_ISO16 "ISO16"
++#define VSFTP_CP_WIN_1250 "Win-1250"
++#define VSFTP_CP_WIN1250 "WIN1250"
++#define VSFTP_CP_CP1250 "CP1250"
++#define VSFTP_CP_1250 "1250"
++#endif
++#ifdef VSFTP_CHARCONV_SUPPORT_SOUTERN
++#define VSFTP_CP_ISO8859_3 "ISO-8859-3"
++#define VSFTP_CP_ISO3 "ISO3"
++#define VSFTP_CP_LATIN3 "LATIN3"
++#endif
++
++#define VSFTP_C_NONE 0
++#define VSFTP_C_UTF8 1
++#ifdef VSFTP_CHARCONV_SUPPORT_CYRILLIC
++#define VSFTP_C_1251 2
++#define VSFTP_C_878R 3
++#define VSFTP_C_866 4
++#define VSFTP_C_ISO5 5
++#define VSFTP_C_878U 6
++#endif
++#ifdef VSFTP_CHARCONV_SUPPORT_WESTERN
++#define VSFTP_C_ISO1 7
++#define VSFTP_C_ISO15 8
++#define VSFTP_C_1252 9
++#endif
++#ifdef VSFTP_CHARCONV_SUPPORT_CENTRAL
++#define VSFTP_C_ISO2 10
++#define VSFTP_C_ISO16 11
++#define VSFTP_C_1250 12
++#endif
++#ifdef VSFTP_CHARCONV_SUPPORT_SOUTERN
++#define VSFTP_C_ISO3 13
++#endif
++
++#define VSFTP_CS_NONE 0
++#ifdef VSFTP_CHARCONV_SUPPORT_CYRILLIC
++#define VSFTP_CS_UTF8CYR 1
++#define VSFTP_CS_1251 2
++#define VSFTP_CS_878R 3
++#define VSFTP_CS_866 4
++#define VSFTP_CS_ISO5 5
++#define VSFTP_CS_878U 6
++#endif
++#ifdef VSFTP_CHARCONV_SUPPORT_WESTERN
++#define VSFTP_CS_UTF8WEST 7
++#define VSFTP_CS_ISO1 8
++#define VSFTP_CS_ISO15 9
++#define VSFTP_CS_1252 10
++#endif
++#ifdef VSFTP_CHARCONV_SUPPORT_CENTRAL
++#define VSFTP_CS_UTF8CENT 11
++#define VSFTP_CS_ISO2 12
++#define VSFTP_CS_ISO16 13
++#define VSFTP_CS_1250 14
++#endif
++#ifdef VSFTP_CHARCONV_SUPPORT_SOUTERN
++#define VSFTP_CS_UTF8SOUT 15
++#define VSFTP_CS_ISO3 16
++#endif
++
++struct codepage_map
++{
++ unsigned int char_code; // The first element is count bytes of char.
++ unsigned int order;
++} _codepage_map;
++
++typedef struct codepage_map * map_ptr;
++
++extern map_ptr localMap;
++
++/* vsf_charconv_charset_name()
++ * PURPOSE
++ * Get charset name by code;
++ * PARAMETERS
++ * code - Internal charset code
++ * RETURNS
++ * Charset name
++ */
++const char* vsf_charconv_charset_name(int code);
++
++/* vsf_charconv_codepage()
++ * PURPOSE
++ * Get internal charset code
++ * PARAMETERS
++ * p_str - String value with code page
++ * RETURNS
++ * Internal charset code
++ */
++int vsf_charconv_codepage(const char* p_str);
++
++/* vsf_charconv_init_local_codepage(int localCode)
++ * PURPOSE
++ * Init local codepage for work with unprintable chars
++ * PARAMETERS
++ * localCode - source internal code page
++ */
++void vsf_charconv_init_local_codepage(int localCode);
++
++/* vsf_charconv_avail_convertion()
++ * PURPOS
++ * Checking for available convertion characters
++ * PARAMETERS
++ * localCode - source internal code page
++ * remoteCode - destination internal code page
++ * RETURNS
++ * Available ot not converion
++ */
++int vsf_charconv_avail_convertion(int localCode, int remoteCode);
++
++/* vsf_charconv_convert()
++ * PURPOSE
++ * Converting string via charsets
++ * PARAMETERS
++ * p_sess - the current session object
++ * p_str - string for convertin
++ * direction - converting from host to remoute charsetr or otherwise
++ */
++void vsf_charconv_convert(struct vsf_session* p_sess, struct mystr* p_str, int direction);
++
++/* vsf_charconv_replace_unprintable
++ */
++void vsf_charconv_replace_unprintable(struct mystr* p_str, char new_char);
++
++#endif
+diff -urN vsftpd-2.0.5.org/char_maps/central.map vsftpd-2.0.5/char_maps/central.map
+--- vsftpd-2.0.5.org/char_maps/central.map 1970-01-01 03:00:00.000000000 +0300
++++ vsftpd-2.0.5/char_maps/central.map 2008-01-13 20:09:59.000000000 +0200
+@@ -0,0 +1,738 @@
++/*
++ !!! WARNING !!!
++ DON'T CHANGE ORDER OF CHARS
++*/
++
++struct codepage_map codepage_utf8cent_array[] =
++ {
++ { 0x000003, 178 }, // max size , char count
++ { 0x00003f, 0 },
++ { 0x00003f, 0 },
++ { 0x00003f, 0 },
++ { 0x00003f, 0 },
++ { 0x00003f, 0 },
++ { 0x00c280, 1 },
++ { 0x00c281, 2 },
++ { 0x00c282, 3 },
++ { 0x00c283, 4 },
++ { 0x00c284, 5 },
++ { 0x00c285, 6 },
++ { 0x00c286, 7 },
++ { 0x00c287, 8 },
++ { 0x00c288, 9 },
++ { 0x00c289, 10 },
++ { 0x00c28a, 11 },
++ { 0x00c28b, 12 },
++ { 0x00c28c, 13 },
++ { 0x00c28d, 14 },
++ { 0x00c28e, 15 },
++ { 0x00c28f, 16 },
++ { 0x00c290, 17 },
++ { 0x00c291, 18 },
++ { 0x00c292, 19 },
++ { 0x00c293, 20 },
++ { 0x00c294, 21 },
++ { 0x00c295, 22 },
++ { 0x00c296, 23 },
++ { 0x00c297, 24 },
++ { 0x00c298, 25 },
++ { 0x00c299, 26 },
++ { 0x00c29a, 27 },
++ { 0x00c29b, 28 },
++ { 0x00c29c, 29 },
++ { 0x00c29d, 30 },
++ { 0x00c29e, 31 },
++ { 0x00c29f, 32 },
++ { 0x00c2a0, 33 },
++ { 0x00c2a4, 34 },
++ { 0x00c2a6, 35 },
++ { 0x00c2a7, 36 },
++ { 0x00c2a8, 37 },
++ { 0x00c2a9, 38 },
++ { 0x00c2ab, 39 },
++ { 0x00c2ad, 40 },
++ { 0x00c2ad, 41 },
++ { 0x00c2ae, 42 },
++ { 0x00c2b0, 43 },
++ { 0x00c2b1, 44 },
++ { 0x00c2b4, 45 },
++ { 0x00c2b5, 46 },
++ { 0x00c2b6, 47 },
++ { 0x00c2b7, 48 },
++ { 0x00c2b8, 49 },
++ { 0x00c2bb, 50 },
++ { 0x00c380, 51 },
++ { 0x00c381, 52 },
++ { 0x00c382, 53 },
++ { 0x00c384, 54 },
++ { 0x00c386, 55 },
++ { 0x00c387, 56 },
++ { 0x00c388, 57 },
++ { 0x00c389, 58 },
++ { 0x00c38a, 59 },
++ { 0x00c38b, 60 },
++ { 0x00c38c, 61 },
++ { 0x00c38d, 62 },
++ { 0x00c38e, 63 },
++ { 0x00c38f, 64 },
++ { 0x00c392, 65 },
++ { 0x00c393, 66 },
++ { 0x00c394, 67 },
++ { 0x00c396, 68 },
++ { 0x00c397, 69 },
++ { 0x00c399, 70 },
++ { 0x00c39a, 71 },
++ { 0x00c39b, 72 },
++ { 0x00c39c, 73 },
++ { 0x00c39d, 74 },
++ { 0x00c39f, 75 },
++ { 0x00c3a0, 76 },
++ { 0x00c3a1, 77 },
++ { 0x00c3a2, 78 },
++ { 0x00c3a4, 79 },
++ { 0x00c3a6, 80 },
++ { 0x00c3a7, 81 },
++ { 0x00c3a8, 82 },
++ { 0x00c3a9, 83 },
++ { 0x00c3aa, 84 },
++ { 0x00c3ab, 85 },
++ { 0x00c3ac, 86 },
++ { 0x00c3ad, 87 },
++ { 0x00c3ae, 88 },
++ { 0x00c3af, 89 },
++ { 0x00c3b2, 90 },
++ { 0x00c3b3, 91 },
++ { 0x00c3b4, 92 },
++ { 0x00c3b6, 93 },
++ { 0x00c3b7, 94 },
++ { 0x00c3b9, 95 },
++ { 0x00c3ba, 96 },
++ { 0x00c3bb, 97 },
++ { 0x00c3bc, 98 },
++ { 0x00c3bd, 99 },
++ { 0x00c3bf, 100 },
++ { 0x00c482, 101 },
++ { 0x00c483, 102 },
++ { 0x00c484, 103 },
++ { 0x00c485, 104 },
++ { 0x00c486, 105 },
++ { 0x00c487, 106 },
++ { 0x00c48c, 107 },
++ { 0x00c48d, 108 },
++ { 0x00c48e, 109 },
++ { 0x00c48f, 110 },
++ { 0x00c490, 111 },
++ { 0x00c491, 112 },
++ { 0x00c498, 113 },
++ { 0x00c499, 114 },
++ { 0x00c49a, 115 },
++ { 0x00c49b, 116 },
++ { 0x00c4b9, 117 },
++ { 0x00c4ba, 118 },
++ { 0x00c4bd, 119 },
++ { 0x00c4be, 120 },
++ { 0x00c581, 121 },
++ { 0x00c582, 122 },
++ { 0x00c583, 123 },
++ { 0x00c584, 124 },
++ { 0x00c587, 125 },
++ { 0x00c588, 126 },
++ { 0x00c590, 127 },
++ { 0x00c591, 128 },
++ { 0x00c592, 129 },
++ { 0x00c593, 130 },
++ { 0x00c594, 131 },
++ { 0x00c595, 132 },
++ { 0x00c598, 133 },
++ { 0x00c599, 134 },
++ { 0x00c59a, 135 },
++ { 0x00c59b, 136 },
++ { 0x00c59e, 137 },
++ { 0x00c59f, 138 },
++ { 0x00c5a0, 139 },
++ { 0x00c5a1, 140 },
++ { 0x00c5a2, 141 },
++ { 0x00c5a3, 142 },
++ { 0x00c5a4, 143 },
++ { 0x00c5a5, 144 },
++ { 0x00c5ae, 145 },
++ { 0x00c5af, 146 },
++ { 0x00c5b0, 147 },
++ { 0x00c5b1, 148 },
++ { 0x00c5b8, 149 },
++ { 0x00c5b9, 150 },
++ { 0x00c5ba, 151 },
++ { 0x00c5bb, 152 },
++ { 0x00c5bc, 153 },
++ { 0x00c5bd, 154 },
++ { 0x00c5be, 155 },
++ { 0x00cb87, 156 },
++ { 0x00cb98, 157 },
++ { 0x00cb99, 158 },
++ { 0x00c89a, 159 },
++ { 0x00cb9b, 160 },
++ { 0x00cb9d, 161 },
++ { 0xe28093, 162 },
++ { 0xe28094, 163 },
++ { 0xe28098, 164 },
++ { 0xe28099, 165 },
++ { 0xe2809a, 166 },
++ { 0xe2809c, 167 },
++ { 0xe2809d, 168 },
++ { 0xe2809e, 169 },
++ { 0xe280a0, 170 },
++ { 0xe280a1, 171 },
++ { 0xe280a2, 172 },
++ { 0xe280a6, 173 },
++ { 0xe280b0, 174 },
++ { 0xe280b9, 175 },
++ { 0xe280ba, 176 },
++ { 0xe282ac, 177 },
++ { 0xe284a2, 178 },
++ { 0x000000, 0 }
++ };
++
++struct codepage_map codepage_iso2_array[] =
++ {
++ { 0x0001, 128 }, // max size , char count for control
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x0080, 1 },
++ { 0x0081, 2 },
++ { 0x0082, 3 },
++ { 0x0083, 4 },
++ { 0x0084, 5 },
++ { 0x0085, 6 },
++ { 0x0086, 7 },
++ { 0x0087, 8 },
++ { 0x0088, 9 },
++ { 0x0089, 10 },
++ { 0x008a, 11 },
++ { 0x008b, 12 },
++ { 0x008c, 13 },
++ { 0x008d, 14 },
++ { 0x008e, 15 },
++ { 0x008f, 16 },
++ { 0x0090, 17 },
++ { 0x0091, 18 },
++ { 0x0092, 19 },
++ { 0x0093, 20 },
++ { 0x0094, 21 },
++ { 0x0095, 22 },
++ { 0x0096, 23 },
++ { 0x0097, 24 },
++ { 0x0098, 25 },
++ { 0x0099, 26 },
++ { 0x009a, 27 },
++ { 0x009b, 28 },
++ { 0x009c, 29 },
++ { 0x009d, 30 },
++ { 0x009e, 31 },
++ { 0x009f, 32 },
++ { 0x00a0, 33 },
++ { 0x00a1, 34 },
++ { 0x00a2, 35 },
++ { 0x00a3, 36 },
++ { 0x00a4, 37 },
++ { 0x00a5, 38 },
++ { 0x00a6, 39 },
++ { 0x00a7, 40 },
++ { 0x00a8, 41 },
++ { 0x00a9, 42 },
++ { 0x00aa, 43 },
++ { 0x00ab, 44 },
++ { 0x00ac, 45 },
++ { 0x00ad, 46 },
++ { 0x00ae, 47 },
++ { 0x00af, 48 },
++ { 0x00b0, 49 },
++ { 0x00b1, 50 },
++ { 0x00b2, 51 },
++ { 0x00b3, 52 },
++ { 0x00b4, 53 },
++ { 0x00b5, 54 },
++ { 0x00b6, 55 },
++ { 0x00b7, 56 },
++ { 0x00b8, 57 },
++ { 0x00b9, 58 },
++ { 0x00ba, 59 },
++ { 0x00bb, 60 },
++ { 0x00bc, 61 },
++ { 0x00bd, 62 },
++ { 0x00be, 63 },
++ { 0x00bf, 64 },
++ { 0x00c0, 65 },
++ { 0x00c1, 66 },
++ { 0x00c2, 67 },
++ { 0x00c3, 68 },
++ { 0x00c4, 69 },
++ { 0x00c5, 70 },
++ { 0x00c6, 71 },
++ { 0x00c7, 72 },
++ { 0x00c8, 73 },
++ { 0x00c9, 74 },
++ { 0x00ca, 75 },
++ { 0x00cb, 76 },
++ { 0x00cc, 77 },
++ { 0x00cd, 78 },
++ { 0x00ce, 79 },
++ { 0x00cf, 80 },
++ { 0x00d0, 81 },
++ { 0x00d1, 82 },
++ { 0x00d2, 83 },
++ { 0x00d3, 84 },
++ { 0x00d4, 85 },
++ { 0x00d5, 86 },
++ { 0x00d6, 87 },
++ { 0x00d7, 88 },
++ { 0x00d8, 89 },
++ { 0x00d9, 90 },
++ { 0x00da, 91 },
++ { 0x00db, 92 },
++ { 0x00dc, 93 },
++ { 0x00dd, 94 },
++ { 0x00de, 95 },
++ { 0x00df, 96 },
++ { 0x00e0, 97 },
++ { 0x00e1, 98 },
++ { 0x00e2, 99 },
++ { 0x00e3, 100 },
++ { 0x00e4, 101 },
++ { 0x00e5, 102 },
++ { 0x00e6, 103 },
++ { 0x00e7, 104 },
++ { 0x00e8, 105 },
++ { 0x00e9, 106 },
++ { 0x00ea, 107 },
++ { 0x00eb, 108 },
++ { 0x00ec, 109 },
++ { 0x00ed, 110 },
++ { 0x00ee, 111 },
++ { 0x00ef, 112 },
++ { 0x00f0, 113 },
++ { 0x00f1, 114 },
++ { 0x00f2, 115 },
++ { 0x00f3, 116 },
++ { 0x00f4, 117 },
++ { 0x00f5, 118 },
++ { 0x00f6, 119 },
++ { 0x00f7, 120 },
++ { 0x00f8, 121 },
++ { 0x00f9, 122 },
++ { 0x00fa, 123 },
++ { 0x00fb, 124 },
++ { 0x00fc, 125 },
++ { 0x00fd, 126 },
++ { 0x00fe, 127 },
++ { 0x00ff, 128 },
++ { 0x0000, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x0000, 0 }
++ };
++
++struct codepage_map codepage_iso16_array[] =
++ {
++ { 0x0001, 128 }, // max size , char count for control
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x0080, 1 },
++ { 0x0081, 2 },
++ { 0x0082, 3 },
++ { 0x0083, 4 },
++ { 0x0084, 5 },
++ { 0x0085, 6 },
++ { 0x0086, 7 },
++ { 0x0087, 8 },
++ { 0x0088, 9 },
++ { 0x0089, 10 },
++ { 0x008a, 11 },
++ { 0x008b, 12 },
++ { 0x008c, 13 },
++ { 0x008d, 14 },
++ { 0x008e, 15 },
++ { 0x008f, 16 },
++ { 0x0090, 17 },
++ { 0x0091, 18 },
++ { 0x0092, 19 },
++ { 0x0093, 20 },
++ { 0x0094, 21 },
++ { 0x0095, 22 },
++ { 0x0096, 23 },
++ { 0x0097, 24 },
++ { 0x0098, 25 },
++ { 0x0099, 26 },
++ { 0x009a, 27 },
++ { 0x009b, 28 },
++ { 0x009c, 29 },
++ { 0x009d, 30 },
++ { 0x009e, 31 },
++ { 0x009f, 32 },
++ { 0x00a0, 33 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00a7, 40 },
++ { 0x003f, 0 },
++ { 0x00a9, 42 },
++ { 0x00ab, 44 },
++ { 0x00ad, 46 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00b0, 49 },
++ { 0x00b1, 50 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00b6, 55 },
++ { 0x00b7, 56 },
++ { 0x003f, 0 },
++ { 0x00bb, 60 },
++ { 0x00c0, 65 },
++ { 0x00c1, 66 },
++ { 0x00c2, 67 },
++ { 0x00c4, 69 },
++ { 0x00c6, 71 },
++ { 0x00c7, 72 },
++ { 0x00c8, 73 },
++ { 0x00c9, 74 },
++ { 0x00ca, 75 },
++ { 0x00cb, 76 },
++ { 0x00cc, 77 },
++ { 0x00cd, 78 },
++ { 0x00ce, 79 },
++ { 0x00cf, 80 },
++ { 0x00d2, 83 },
++ { 0x00d3, 84 },
++ { 0x00d4, 85 },
++ { 0x00d6, 87 },
++ { 0x003f, 0 },
++ { 0x00d9, 90 },
++ { 0x00da, 91 },
++ { 0x00db, 92 },
++ { 0x00dc, 93 },
++ { 0x003f, 0 },
++ { 0x00df, 96 },
++ { 0x00e0, 97 },
++ { 0x00e1, 98 },
++ { 0x00e2, 99 },
++ { 0x00e4, 101 },
++ { 0x00e6, 103 },
++ { 0x00e7, 104 },
++ { 0x00e8, 105 },
++ { 0x00e9, 106 },
++ { 0x00ea, 107 },
++ { 0x00eb, 108 },
++ { 0x00ec, 109 },
++ { 0x00ed, 110 },
++ { 0x00ee, 111 },
++ { 0x00ef, 112 },
++ { 0x00f2, 115 },
++ { 0x00f3, 116 },
++ { 0x00f4, 117 },
++ { 0x00f6, 119 },
++ { 0x003f, 0 },
++ { 0x00f9, 122 },
++ { 0x00fa, 123 },
++ { 0x00fb, 124 },
++ { 0x00fc, 125 },
++ { 0x003f, 0 },
++ { 0x00ff, 128 },
++ { 0x00c3, 68 },
++ { 0x00e3, 100 },
++ { 0x00a1, 34 },
++ { 0x00a2, 35 },
++ { 0x00c5, 70 },
++ { 0x00e5, 102 },
++ { 0x00b2, 51 },
++ { 0x00b9, 58 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00d0, 81 },
++ { 0x00f0, 113 },
++ { 0x00dd, 94 },
++ { 0x00fd, 126 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00a3, 36 },
++ { 0x00b3, 52 },
++ { 0x00d1, 82 },
++ { 0x00f1, 114 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00d5, 86 },
++ { 0x00f5, 118 },
++ { 0x00bc, 61 },
++ { 0x00bd, 62 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00d7, 88 },
++ { 0x00f7, 120 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00a6, 39 },
++ { 0x00a8, 41 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00d8, 89 },
++ { 0x00f8, 121 },
++ { 0x00be, 63 },
++ { 0x00ac, 45 },
++ { 0x00ae, 47 },
++ { 0x00af, 48 },
++ { 0x00bf, 64 },
++ { 0x00b4, 53 },
++ { 0x00b8, 57 },
++ { 0x003f, 0 },
++ { 0x00aa, 43 },
++ { 0x00ba, 59 },
++ { 0x00de, 95 },
++ { 0x00fe, 127 },
++ { 0x00b5, 54 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00a5, 38 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00a4, 37 },
++ { 0x003f, 0 },
++ { 0x0000, 0 }
++ };
++
++struct codepage_map codepage_win1250_array[] =
++ {
++ { 0x0001, 128 }, // max size , char count for control
++ { 0x0081, 2 },
++ { 0x0083, 4 },
++ { 0x0088, 9 },
++ { 0x0090, 17 },
++ { 0x0098, 25 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00a0, 33 },
++ { 0x00a4, 37 },
++ { 0x00a6, 39 },
++ { 0x00a7, 40 },
++ { 0x00a8, 41 },
++ { 0x00a9, 42 },
++ { 0x00ab, 44 },
++ { 0x00ac, 45 },
++ { 0x00ad, 46 },
++ { 0x00ae, 47 },
++ { 0x00b0, 49 },
++ { 0x00b1, 50 },
++ { 0x00b4, 53 },
++ { 0x00b5, 54 },
++ { 0x00b6, 55 },
++ { 0x00b7, 56 },
++ { 0x00b8, 57 },
++ { 0x00bb, 60 },
++ { 0x003f, 0 },
++ { 0x00c1, 66 },
++ { 0x00c2, 67 },
++ { 0x00c4, 69 },
++ { 0x003f, 0 },
++ { 0x00c7, 72 },
++ { 0x003f, 0 },
++ { 0x00c9, 74 },
++ { 0x003f, 0 },
++ { 0x00cb, 76 },
++ { 0x003f, 0 },
++ { 0x00cd, 78 },
++ { 0x00ce, 79 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00d3, 84 },
++ { 0x00d4, 85 },
++ { 0x00d6, 87 },
++ { 0x00d7, 88 },
++ { 0x003f, 0 },
++ { 0x00da, 91 },
++ { 0x003f, 0 },
++ { 0x00dc, 93 },
++ { 0x00dd, 94 },
++ { 0x00df, 96 },
++ { 0x003f, 0 },
++ { 0x00e1, 98 },
++ { 0x00e2, 99 },
++ { 0x00e4, 101 },
++ { 0x003f, 0 },
++ { 0x00e7, 104 },
++ { 0x003f, 0 },
++ { 0x00e9, 106 },
++ { 0x003f, 0 },
++ { 0x00eb, 108 },
++ { 0x003f, 0 },
++ { 0x00ed, 110 },
++ { 0x00ee, 111 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00f3, 116 },
++ { 0x00f4, 117 },
++ { 0x00f6, 119 },
++ { 0x00f7, 120 },
++ { 0x003f, 0 },
++ { 0x00fa, 123 },
++ { 0x003f, 0 },
++ { 0x00fc, 125 },
++ { 0x00fd, 126 },
++ { 0x003f, 0 },
++ { 0x00c3, 68 },
++ { 0x00e3, 100 },
++ { 0x00a5, 38 },
++ { 0x00b9, 58 },
++ { 0x00c6, 71 },
++ { 0x00e6, 103 },
++ { 0x00c8, 73 },
++ { 0x00e8, 105 },
++ { 0x00cf, 80 },
++ { 0x00ef, 112 },
++ { 0x00d0, 81 },
++ { 0x00f0, 113 },
++ { 0x00ca, 75 },
++ { 0x00ea, 107 },
++ { 0x00cc, 77 },
++ { 0x00ec, 109 },
++ { 0x00c5, 70 },
++ { 0x00e5, 102 },
++ { 0x00bc, 61 },
++ { 0x00be, 63 },
++ { 0x00a3, 36 },
++ { 0x00b3, 52 },
++ { 0x00d1, 82 },
++ { 0x00f1, 114 },
++ { 0x00d2, 83 },
++ { 0x00f2, 115 },
++ { 0x00d5, 86 },
++ { 0x00f5, 118 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00c0, 65 },
++ { 0x00e0, 97 },
++ { 0x00d8, 89 },
++ { 0x00f8, 121 },
++ { 0x008c, 13 },
++ { 0x009c, 29 },
++ { 0x00aa, 43 },
++ { 0x00ba, 59 },
++ { 0x008a, 11 },
++ { 0x009a, 27 },
++ { 0x00de, 95 },
++ { 0x00fe, 127 },
++ { 0x008d, 14 },
++ { 0x009d, 30 },
++ { 0x00d9, 90 },
++ { 0x00f9, 122 },
++ { 0x00db, 92 },
++ { 0x00fb, 124 },
++ { 0x003f, 0 },
++ { 0x008f, 16 },
++ { 0x009f, 32 },
++ { 0x00af, 48 },
++ { 0x00bf, 64 },
++ { 0x008e, 15 },
++ { 0x009e, 31 },
++ { 0x00a1, 34 },
++ { 0x00a2, 35 },
++ { 0x00ff, 128 },
++ { 0x003f, 0 },
++ { 0x00b2, 51 },
++ { 0x00bd, 62 },
++ { 0x0096, 23 },
++ { 0x0097, 24 },
++ { 0x0091, 18 },
++ { 0x0092, 19 },
++ { 0x0082, 3 },
++ { 0x0093, 20 },
++ { 0x0094, 21 },
++ { 0x0084, 5 },
++ { 0x0086, 7 },
++ { 0x0087, 8 },
++ { 0x0095, 22 },
++ { 0x0085, 6 },
++ { 0x0089, 10 },
++ { 0x008b, 12 },
++ { 0x009b, 28 },
++ { 0x0080, 1 },
++ { 0x0099, 26 },
++ { 0x0000, 0 }
++ };
++
+diff -urN vsftpd-2.0.5.org/char_maps/cyrillic.map vsftpd-2.0.5/char_maps/cyrillic.map
+--- vsftpd-2.0.5.org/char_maps/cyrillic.map 1970-01-01 03:00:00.000000000 +0300
++++ vsftpd-2.0.5/char_maps/cyrillic.map 2008-01-13 20:09:59.000000000 +0200
+@@ -0,0 +1,1349 @@
++/*
++ !!! WARNING !!!
++ DON'T CHANGE ORDER OF CHARS
++*/
++
++struct codepage_map codepage_utf8cyr_array[] =
++ {
++ { 0x000003, 216 }, // max size , char count
++ { 0x00003f, 0 },
++ { 0x00003f, 0 },
++ { 0x00c280, 1 },
++ { 0x00c281, 2 },
++ { 0x00c282, 3 },
++ { 0x00c283, 4 },
++ { 0x00c284, 5 },
++ { 0x00c285, 6 },
++ { 0x00c286, 7 },
++ { 0x00c287, 8 },
++ { 0x00c288, 9 },
++ { 0x00c289, 10 },
++ { 0x00c28a, 11 },
++ { 0x00c28b, 12 },
++ { 0x00c28c, 13 },
++ { 0x00c28d, 14 },
++ { 0x00c28e, 15 },
++ { 0x00c28f, 16 },
++ { 0x00c290, 17 },
++ { 0x00c291, 18 },
++ { 0x00c292, 19 },
++ { 0x00c293, 20 },
++ { 0x00c294, 21 },
++ { 0x00c295, 22 },
++ { 0x00c296, 23 },
++ { 0x00c297, 24 },
++ { 0x00c298, 25 },
++ { 0x00c299, 26 },
++ { 0x00c29a, 27 },
++ { 0x00c29b, 28 },
++ { 0x00c29c, 29 },
++ { 0x00c29d, 30 },
++ { 0x00c29e, 31 },
++ { 0x00c29f, 32 },
++ { 0x00c2a0, 33 },
++ { 0x00c2a4, 34 },
++ { 0x00c2a6, 35 },
++ { 0x00c2a7, 36 },
++ { 0x00c2a9, 37 },
++ { 0x00c2ab, 38 },
++ { 0x00c2ac, 39 },
++ { 0x00c2ad, 40 },
++ { 0x00c2ae, 41 },
++ { 0x00c2b0, 42 },
++ { 0x00c2b1, 43 },
++ { 0x00c2b2, 44 },
++ { 0x00c2b5, 45 },
++ { 0x00c2b6, 46 },
++ { 0x00c2b7, 47 },
++ { 0x00c2bb, 48 },
++ { 0x00c3b7, 49 },
++ { 0x00d081, 50 },
++ { 0x00d082, 51 },
++ { 0x00d083, 52 },
++ { 0x00d084, 53 },
++ { 0x00d085, 54 },
++ { 0x00d086, 55 },
++ { 0x00d087, 56 },
++ { 0x00d088, 57 },
++ { 0x00d089, 58 },
++ { 0x00d08a, 59 },
++ { 0x00d08b, 60 },
++ { 0x00d08c, 61 },
++ { 0x00d08e, 62 },
++ { 0x00d08f, 63 },
++ { 0x00d090, 64 },
++ { 0x00d091, 65 },
++ { 0x00d092, 66 },
++ { 0x00d093, 67 },
++ { 0x00d094, 68 },
++ { 0x00d095, 69 },
++ { 0x00d096, 70 },
++ { 0x00d097, 71 },
++ { 0x00d098, 72 },
++ { 0x00d099, 73 },
++ { 0x00d09a, 74 },
++ { 0x00d09b, 75 },
++ { 0x00d09c, 76 },
++ { 0x00d09d, 77 },
++ { 0x00d09e, 78 },
++ { 0x00d09f, 79 },
++ { 0x00d0a0, 80 },
++ { 0x00d0a1, 81 },
++ { 0x00d0a2, 82 },
++ { 0x00d0a3, 83 },
++ { 0x00d0a4, 84 },
++ { 0x00d0a5, 85 },
++ { 0x00d0a6, 86 },
++ { 0x00d0a7, 87 },
++ { 0x00d0a8, 88 },
++ { 0x00d0a9, 89 },
++ { 0x00d0aa, 90 },
++ { 0x00d0ab, 91 },
++ { 0x00d0ac, 92 },
++ { 0x00d0ad, 93 },
++ { 0x00d0ae, 94 },
++ { 0x00d0af, 95 },
++ { 0x00d0b0, 96 },
++ { 0x00d0b1, 97 },
++ { 0x00d0b2, 98 },
++ { 0x00d0b3, 99 },
++ { 0x00d0b4, 100 },
++ { 0x00d0b5, 101 },
++ { 0x00d0b6, 102 },
++ { 0x00d0b7, 103 },
++ { 0x00d0b8, 104 },
++ { 0x00d0b9, 105 },
++ { 0x00d0ba, 106 },
++ { 0x00d0bb, 107 },
++ { 0x00d0bc, 108 },
++ { 0x00d0bd, 109 },
++ { 0x00d0be, 110 },
++ { 0x00d0bf, 111 },
++ { 0x00d180, 112 },
++ { 0x00d181, 113 },
++ { 0x00d182, 114 },
++ { 0x00d183, 115 },
++ { 0x00d184, 116 },
++ { 0x00d185, 117 },
++ { 0x00d186, 118 },
++ { 0x00d187, 119 },
++ { 0x00d188, 120 },
++ { 0x00d189, 121 },
++ { 0x00d18a, 122 },
++ { 0x00d18b, 123 },
++ { 0x00d18c, 124 },
++ { 0x00d18d, 125 },
++ { 0x00d18e, 126 },
++ { 0x00d18f, 127 },
++ { 0x00d191, 128 },
++ { 0x00d192, 129 },
++ { 0x00d193, 130 },
++ { 0x00d194, 131 },
++ { 0x00d195, 132 },
++ { 0x00d196, 133 },
++ { 0x00d197, 134 },
++ { 0x00d198, 135 },
++ { 0x00d199, 136 },
++ { 0x00d19a, 137 },
++ { 0x00d19b, 138 },
++ { 0x00d19c, 139 },
++ { 0x00d19e, 140 },
++ { 0x00d19f, 141 },
++ { 0x00d290, 142 },
++ { 0x00d291, 143 },
++ { 0xe28093, 144 },
++ { 0xe28094, 145 },
++ { 0xe28098, 146 },
++ { 0xe28099, 147 },
++ { 0xe2809a, 148 },
++ { 0xe2809c, 149 },
++ { 0xe2809d, 150 },
++ { 0xe2809e, 151 },
++ { 0xe280a0, 152 },
++ { 0xe280a1, 153 },
++ { 0xe280a2, 154 },
++ { 0xe280a6, 155 },
++ { 0xe280b0, 156 },
++ { 0xe280b9, 157 },
++ { 0xe280ba, 158 },
++ { 0xe28496, 159 },
++ { 0xe284a2, 160 },
++ { 0xe28899, 161 },
++ { 0xe2889a, 162 },
++ { 0xe28988, 163 },
++ { 0xe289a4, 164 },
++ { 0xe289a5, 165 },
++ { 0xe28ca0, 166 },
++ { 0xe28ca1, 167 },
++ { 0xe29480, 168 },
++ { 0xe29482, 169 },
++ { 0xe2948c, 170 },
++ { 0xe29490, 171 },
++ { 0xe29494, 172 },
++ { 0xe29498, 173 },
++ { 0xe2949c, 174 },
++ { 0xe294a4, 175 },
++ { 0xe294ac, 176 },
++ { 0xe294b4, 177 },
++ { 0xe294bc, 178 },
++ { 0xe29590, 179 },
++ { 0xe29591, 180 },
++ { 0xe29592, 181 },
++ { 0xe29593, 182 },
++ { 0xe29594, 183 },
++ { 0xe29595, 184 },
++ { 0xe29596, 185 },
++ { 0xe29597, 186 },
++ { 0xe29598, 187 },
++ { 0xe29599, 188 },
++ { 0xe2959a, 189 },
++ { 0xe2959b, 190 },
++ { 0xe2959c, 191 },
++ { 0xe2959d, 192 },
++ { 0xe2959e, 193 },
++ { 0xe2959f, 194 },
++ { 0xe295a0, 195 },
++ { 0xe295a1, 196 },
++ { 0xe295a2, 197 },
++ { 0xe295a3, 198 },
++ { 0xe295a4, 199 },
++ { 0xe295a5, 200 },
++ { 0xe295a6, 201 },
++ { 0xe295a7, 202 },
++ { 0xe295a8, 203 },
++ { 0xe295a9, 204 },
++ { 0xe295aa, 205 },
++ { 0xe295ab, 206 },
++ { 0xe295ac, 207 },
++ { 0xe29680, 208 },
++ { 0xe29684, 209 },
++ { 0xe29688, 210 },
++ { 0xe2968c, 211 },
++ { 0xe29690, 212 },
++ { 0xe29691, 213 },
++ { 0xe29692, 214 },
++ { 0xe29693, 215 },
++ { 0xe296a0, 216 },
++ { 0x000000, 0 }
++ };
++
++struct codepage_map codepage_win1251_array[] =
++ {
++ { 0x0001, 128 }, // max size , char count for control
++ { 0x0088, 9 },
++ { 0x0098, 25 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00a0, 33 },
++ { 0x00a4, 37 },
++ { 0x00a6, 39 },
++ { 0x00a7, 40 },
++ { 0x00a9, 42 },
++ { 0x00ab, 44 },
++ { 0x00ac, 45 },
++ { 0x00ad, 46 },
++ { 0x00ae, 47 },
++ { 0x00b0, 49 },
++ { 0x00b1, 50 },
++ { 0x003f, 0 },
++ { 0x00b5, 54 },
++ { 0x00b6, 55 },
++ { 0x00b7, 56 },
++ { 0x00bb, 60 },
++ { 0x003f, 0 },
++ { 0x00a8, 41 },
++ { 0x0080, 1 },
++ { 0x0081, 2 },
++ { 0x00aa, 43 },
++ { 0x00bd, 62 },
++ { 0x00b2, 51 },
++ { 0x00af, 48 },
++ { 0x00a3, 36 },
++ { 0x008a, 11 },
++ { 0x008c, 13 },
++ { 0x008e, 15 },
++ { 0x008d, 14 },
++ { 0x00a1, 34 },
++ { 0x008f, 16 },
++ { 0x00c0, 65 },
++ { 0x00c1, 66 },
++ { 0x00c2, 67 },
++ { 0x00c3, 68 },
++ { 0x00c4, 69 },
++ { 0x00c5, 70 },
++ { 0x00c6, 71 },
++ { 0x00c7, 72 },
++ { 0x00c8, 73 },
++ { 0x00c9, 74 },
++ { 0x00ca, 75 },
++ { 0x00cb, 76 },
++ { 0x00cc, 77 },
++ { 0x00cd, 78 },
++ { 0x00ce, 79 },
++ { 0x00cf, 80 },
++ { 0x00d0, 81 },
++ { 0x00d1, 82 },
++ { 0x00d2, 83 },
++ { 0x00d3, 84 },
++ { 0x00d4, 85 },
++ { 0x00d5, 86 },
++ { 0x00d6, 87 },
++ { 0x00d7, 88 },
++ { 0x00d8, 89 },
++ { 0x00d9, 90 },
++ { 0x00da, 91 },
++ { 0x00db, 92 },
++ { 0x00dc, 93 },
++ { 0x00dd, 94 },
++ { 0x00de, 95 },
++ { 0x00df, 96 },
++ { 0x00e0, 97 },
++ { 0x00e1, 98 },
++ { 0x00e2, 99 },
++ { 0x00e3, 100 },
++ { 0x00e4, 101 },
++ { 0x00e5, 102 },
++ { 0x00e6, 103 },
++ { 0x00e7, 104 },
++ { 0x00e8, 105 },
++ { 0x00e9, 106 },
++ { 0x00ea, 107 },
++ { 0x00eb, 108 },
++ { 0x00ec, 109 },
++ { 0x00ed, 110 },
++ { 0x00ee, 111 },
++ { 0x00ef, 112 },
++ { 0x00f0, 113 },
++ { 0x00f1, 114 },
++ { 0x00f2, 115 },
++ { 0x00f3, 116 },
++ { 0x00f4, 117 },
++ { 0x00f5, 118 },
++ { 0x00f6, 119 },
++ { 0x00f7, 120 },
++ { 0x00f8, 121 },
++ { 0x00f9, 122 },
++ { 0x00fa, 123 },
++ { 0x00fb, 124 },
++ { 0x00fc, 125 },
++ { 0x00fd, 126 },
++ { 0x00fe, 127 },
++ { 0x00ff, 128 },
++ { 0x00b8, 57 },
++ { 0x0090, 17 },
++ { 0x0083, 4 },
++ { 0x00ba, 59 },
++ { 0x00be, 63 },
++ { 0x00b3, 52 },
++ { 0x00bf, 64 },
++ { 0x00bc, 61 },
++ { 0x009a, 27 },
++ { 0x009c, 29 },
++ { 0x009e, 31 },
++ { 0x009d, 30 },
++ { 0x00a2, 35 },
++ { 0x009f, 32 },
++ { 0x00a5, 38 },
++ { 0x00b4, 53 },
++ { 0x0096, 23 },
++ { 0x0097, 24 },
++ { 0x0091, 18 },
++ { 0x0092, 19 },
++ { 0x0082, 3 },
++ { 0x0093, 20 },
++ { 0x0094, 21 },
++ { 0x0084, 5 },
++ { 0x0086, 7 },
++ { 0x0087, 8 },
++ { 0x0095, 22 },
++ { 0x0085, 6 },
++ { 0x0089, 10 },
++ { 0x008b, 12 },
++ { 0x009b, 28 },
++ { 0x00b9, 58 },
++ { 0x0099, 26 },
++ { 0x0000, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x0000, 0 }
++ };
++
++struct codepage_map codepage_koi8u_array[] =
++ {
++ { 0x0001, 128 }, // max size , char count for control
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x009a, 27 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00bf, 64 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x009c, 29 },
++ { 0x003f, 0 },
++ { 0x009d, 30 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x009e, 31 },
++ { 0x003f, 0 },
++ { 0x009f, 32 },
++ { 0x00b3, 52 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00b4, 53 },
++ { 0x003f, 0 },
++ { 0x00b6, 55 },
++ { 0x00b7, 56 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00e1, 98 },
++ { 0x00e2, 99 },
++ { 0x00f7, 120 },
++ { 0x00e7, 104 },
++ { 0x00e4, 101 },
++ { 0x00e5, 102 },
++ { 0x00f6, 119 },
++ { 0x00fa, 123 },
++ { 0x00e9, 106 },
++ { 0x00ea, 107 },
++ { 0x00eb, 108 },
++ { 0x00ec, 109 },
++ { 0x00ed, 110 },
++ { 0x00ee, 111 },
++ { 0x00ef, 112 },
++ { 0x00f0, 113 },
++ { 0x00f2, 115 },
++ { 0x00f3, 116 },
++ { 0x00f4, 117 },
++ { 0x00f5, 118 },
++ { 0x00e6, 103 },
++ { 0x00e8, 105 },
++ { 0x00e3, 100 },
++ { 0x00fe, 127 },
++ { 0x00fb, 124 },
++ { 0x00fd, 126 },
++ { 0x00ff, 128 },
++ { 0x00f9, 122 },
++ { 0x00f8, 121 },
++ { 0x00fc, 125 },
++ { 0x00e0, 97 },
++ { 0x00f1, 114 },
++ { 0x00c1, 66 },
++ { 0x00c2, 67 },
++ { 0x00d7, 88 },
++ { 0x00c7, 72 },
++ { 0x00c4, 69 },
++ { 0x00c5, 70 },
++ { 0x00d6, 87 },
++ { 0x00da, 91 },
++ { 0x00c9, 74 },
++ { 0x00ca, 75 },
++ { 0x00cb, 76 },
++ { 0x00cc, 77 },
++ { 0x00cd, 78 },
++ { 0x00ce, 79 },
++ { 0x00cf, 80 },
++ { 0x00d0, 81 },
++ { 0x00d2, 83 },
++ { 0x00d3, 84 },
++ { 0x00d4, 85 },
++ { 0x00d5, 86 },
++ { 0x00c6, 71 },
++ { 0x00c8, 73 },
++ { 0x00c3, 68 },
++ { 0x00de, 95 },
++ { 0x00db, 92 },
++ { 0x00dd, 94 },
++ { 0x00df, 96 },
++ { 0x00d9, 90 },
++ { 0x00d8, 89 },
++ { 0x00dc, 93 },
++ { 0x00c0, 65 },
++ { 0x00d1, 82 },
++ { 0x00a3, 36 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00a4, 37 },
++ { 0x003f, 0 },
++ { 0x00a6, 39 },
++ { 0x00a7, 40 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00bd, 62 },
++ { 0x00ad, 46 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x0095, 22 },
++ { 0x0096, 23 },
++ { 0x0097, 24 },
++ { 0x0098, 25 },
++ { 0x0099, 26 },
++ { 0x0093, 20 },
++ { 0x009b, 28 },
++ { 0x0080, 1 },
++ { 0x0081, 2 },
++ { 0x0082, 3 },
++ { 0x0083, 4 },
++ { 0x0084, 5 },
++ { 0x0085, 6 },
++ { 0x0086, 7 },
++ { 0x0087, 8 },
++ { 0x0088, 9 },
++ { 0x0089, 10 },
++ { 0x008a, 11 },
++ { 0x00a0, 33 },
++ { 0x00a1, 34 },
++ { 0x00a2, 35 },
++ { 0x003f, 0 },
++ { 0x00a5, 38 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00a8, 41 },
++ { 0x00a9, 42 },
++ { 0x00aa, 43 },
++ { 0x00ab, 44 },
++ { 0x00ac, 45 },
++ { 0x003f, 0 },
++ { 0x00ae, 47 },
++ { 0x00af, 48 },
++ { 0x00b0, 49 },
++ { 0x00b1, 50 },
++ { 0x00b2, 51 },
++ { 0x003f, 0 },
++ { 0x00b5, 54 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00b8, 57 },
++ { 0x00b9, 58 },
++ { 0x00ba, 59 },
++ { 0x00bb, 60 },
++ { 0x00bc, 61 },
++ { 0x003f, 0 },
++ { 0x00be, 63 },
++ { 0x008b, 12 },
++ { 0x008c, 13 },
++ { 0x008d, 14 },
++ { 0x008e, 15 },
++ { 0x008f, 16 },
++ { 0x0090, 17 },
++ { 0x0091, 18 },
++ { 0x0092, 19 },
++ { 0x0094, 21 },
++ { 0x0000, 0 }
++ };
++
++struct codepage_map codepage_ibm866_array[] =
++ {
++ { 0x0001, 128 }, // max size , char count for control
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00ff, 128 },
++ { 0x00fd, 126 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00f8, 121 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00fa, 123 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00f0, 113 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00f2, 115 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00f4, 117 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00f6, 119 },
++ { 0x003f, 0 },
++ { 0x0080, 1 },
++ { 0x0081, 2 },
++ { 0x0082, 3 },
++ { 0x0083, 4 },
++ { 0x0084, 5 },
++ { 0x0085, 6 },
++ { 0x0086, 7 },
++ { 0x0087, 8 },
++ { 0x0088, 9 },
++ { 0x0089, 10 },
++ { 0x008a, 11 },
++ { 0x008b, 12 },
++ { 0x008c, 13 },
++ { 0x008d, 14 },
++ { 0x008e, 15 },
++ { 0x008f, 16 },
++ { 0x0090, 17 },
++ { 0x0091, 18 },
++ { 0x0092, 19 },
++ { 0x0093, 20 },
++ { 0x0094, 21 },
++ { 0x0095, 22 },
++ { 0x0096, 23 },
++ { 0x0097, 24 },
++ { 0x0098, 25 },
++ { 0x0099, 26 },
++ { 0x009a, 27 },
++ { 0x009b, 28 },
++ { 0x009c, 29 },
++ { 0x009d, 30 },
++ { 0x009e, 31 },
++ { 0x009f, 32 },
++ { 0x00a0, 33 },
++ { 0x00a1, 34 },
++ { 0x00a2, 35 },
++ { 0x00a3, 36 },
++ { 0x00a4, 37 },
++ { 0x00a5, 38 },
++ { 0x00a6, 39 },
++ { 0x00a7, 40 },
++ { 0x00a8, 41 },
++ { 0x00a9, 42 },
++ { 0x00aa, 43 },
++ { 0x00ab, 44 },
++ { 0x00ac, 45 },
++ { 0x00ad, 46 },
++ { 0x00ae, 47 },
++ { 0x00af, 48 },
++ { 0x00e0, 97 },
++ { 0x00e1, 98 },
++ { 0x00e2, 99 },
++ { 0x00e3, 100 },
++ { 0x00e4, 101 },
++ { 0x00e5, 102 },
++ { 0x00e6, 103 },
++ { 0x00e7, 104 },
++ { 0x00e8, 105 },
++ { 0x00e9, 106 },
++ { 0x00ea, 107 },
++ { 0x00eb, 108 },
++ { 0x00ec, 109 },
++ { 0x00ed, 110 },
++ { 0x00ee, 111 },
++ { 0x00ef, 112 },
++ { 0x00f1, 114 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00f3, 116 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00f5, 118 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00f7, 120 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00fc, 125 },
++ { 0x003f, 0 },
++ { 0x00f9, 122 },
++ { 0x00fb, 124 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00c4, 69 },
++ { 0x00b3, 52 },
++ { 0x00da, 91 },
++ { 0x00bf, 64 },
++ { 0x00c0, 65 },
++ { 0x00d9, 90 },
++ { 0x00c3, 68 },
++ { 0x00b4, 53 },
++ { 0x00c2, 67 },
++ { 0x00c1, 66 },
++ { 0x00c5, 70 },
++ { 0x00cd, 78 },
++ { 0x00ba, 59 },
++ { 0x00d5, 86 },
++ { 0x00d6, 87 },
++ { 0x00c9, 74 },
++ { 0x00b8, 57 },
++ { 0x00b7, 56 },
++ { 0x00bb, 60 },
++ { 0x00d4, 85 },
++ { 0x00d3, 84 },
++ { 0x00c8, 73 },
++ { 0x00be, 63 },
++ { 0x00bd, 62 },
++ { 0x00bc, 61 },
++ { 0x00c6, 71 },
++ { 0x00c7, 72 },
++ { 0x00cc, 77 },
++ { 0x00b5, 54 },
++ { 0x00b6, 55 },
++ { 0x00b9, 58 },
++ { 0x00d1, 82 },
++ { 0x00d2, 83 },
++ { 0x00cb, 76 },
++ { 0x00cf, 80 },
++ { 0x00d0, 81 },
++ { 0x00ca, 75 },
++ { 0x00d8, 89 },
++ { 0x00d7, 88 },
++ { 0x00ce, 79 },
++ { 0x00df, 96 },
++ { 0x00dc, 93 },
++ { 0x00db, 92 },
++ { 0x00dd, 94 },
++ { 0x00de, 95 },
++ { 0x00b0, 49 },
++ { 0x00b1, 50 },
++ { 0x00b2, 51 },
++ { 0x00fe, 127 },
++ { 0x0000, 0 }
++ };
++
++struct codepage_map codepage_iso5_array[] =
++ {
++ { 0x0001, 128 }, // max size , char count for control
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x0080, 1 },
++ { 0x0081, 2 },
++ { 0x0082, 3 },
++ { 0x0083, 4 },
++ { 0x0084, 5 },
++ { 0x0085, 6 },
++ { 0x0086, 7 },
++ { 0x0087, 8 },
++ { 0x0088, 9 },
++ { 0x0089, 10 },
++ { 0x008a, 11 },
++ { 0x008b, 12 },
++ { 0x008c, 13 },
++ { 0x008d, 14 },
++ { 0x008e, 15 },
++ { 0x008f, 16 },
++ { 0x0090, 17 },
++ { 0x0091, 18 },
++ { 0x0092, 19 },
++ { 0x0093, 20 },
++ { 0x0094, 21 },
++ { 0x0095, 22 },
++ { 0x0096, 23 },
++ { 0x0097, 24 },
++ { 0x0098, 25 },
++ { 0x0099, 26 },
++ { 0x009a, 27 },
++ { 0x009b, 28 },
++ { 0x009c, 29 },
++ { 0x009d, 30 },
++ { 0x009e, 31 },
++ { 0x009f, 32 },
++ { 0x00a0, 33 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00fd, 126 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00ad, 46 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00a1, 34 },
++ { 0x00a2, 35 },
++ { 0x00a3, 36 },
++ { 0x00a4, 37 },
++ { 0x00a5, 38 },
++ { 0x00a6, 39 },
++ { 0x00a7, 40 },
++ { 0x00a8, 41 },
++ { 0x00a9, 42 },
++ { 0x00aa, 43 },
++ { 0x00ab, 44 },
++ { 0x00ac, 45 },
++ { 0x00ae, 47 },
++ { 0x00af, 48 },
++ { 0x00b0, 49 },
++ { 0x00b1, 50 },
++ { 0x00b2, 51 },
++ { 0x00b3, 52 },
++ { 0x00b4, 53 },
++ { 0x00b5, 54 },
++ { 0x00b6, 55 },
++ { 0x00b7, 56 },
++ { 0x00b8, 57 },
++ { 0x00b9, 58 },
++ { 0x00ba, 59 },
++ { 0x00bb, 60 },
++ { 0x00bc, 61 },
++ { 0x00bd, 62 },
++ { 0x00be, 63 },
++ { 0x00bf, 64 },
++ { 0x00c0, 65 },
++ { 0x00c1, 66 },
++ { 0x00c2, 67 },
++ { 0x00c3, 68 },
++ { 0x00c4, 69 },
++ { 0x00c5, 70 },
++ { 0x00c6, 71 },
++ { 0x00c7, 72 },
++ { 0x00c8, 73 },
++ { 0x00c9, 74 },
++ { 0x00ca, 75 },
++ { 0x00cb, 76 },
++ { 0x00cc, 77 },
++ { 0x00cd, 78 },
++ { 0x00ce, 79 },
++ { 0x00cf, 80 },
++ { 0x00d0, 81 },
++ { 0x00d1, 82 },
++ { 0x00d2, 83 },
++ { 0x00d3, 84 },
++ { 0x00d4, 85 },
++ { 0x00d5, 86 },
++ { 0x00d6, 87 },
++ { 0x00d7, 88 },
++ { 0x00d8, 89 },
++ { 0x00d9, 90 },
++ { 0x00da, 91 },
++ { 0x00db, 92 },
++ { 0x00dc, 93 },
++ { 0x00dd, 94 },
++ { 0x00de, 95 },
++ { 0x00df, 96 },
++ { 0x00e0, 97 },
++ { 0x00e1, 98 },
++ { 0x00e2, 99 },
++ { 0x00e3, 100 },
++ { 0x00e4, 101 },
++ { 0x00e5, 102 },
++ { 0x00e6, 103 },
++ { 0x00e7, 104 },
++ { 0x00e8, 105 },
++ { 0x00e9, 106 },
++ { 0x00ea, 107 },
++ { 0x00eb, 108 },
++ { 0x00ec, 109 },
++ { 0x00ed, 110 },
++ { 0x00ee, 111 },
++ { 0x00ef, 112 },
++ { 0x00f1, 114 },
++ { 0x00f2, 115 },
++ { 0x00f3, 116 },
++ { 0x00f4, 117 },
++ { 0x00f5, 118 },
++ { 0x00f6, 119 },
++ { 0x00f7, 120 },
++ { 0x00f8, 121 },
++ { 0x00f9, 122 },
++ { 0x00fa, 123 },
++ { 0x00fb, 124 },
++ { 0x00fc, 125 },
++ { 0x00fe, 127 },
++ { 0x00ff, 128 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00f0, 113 },
++ { 0x0000, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x0000, 0 }
++ };
++
++struct codepage_map codepage_koi8r_array[] =
++ {
++ { 0x0001, 128 }, // max size , char count for control
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x009a, 27 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x00bf, 64 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x009c, 29 },
++ { 0x005f, 0 },
++ { 0x009d, 30 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x009e, 31 },
++ { 0x005f, 0 },
++ { 0x009f, 32 },
++ { 0x00b3, 52 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x00e1, 98 },
++ { 0x00e2, 99 },
++ { 0x00f7, 120 },
++ { 0x00e7, 104 },
++ { 0x00e4, 101 },
++ { 0x00e5, 102 },
++ { 0x00f6, 119 },
++ { 0x00fa, 123 },
++ { 0x00e9, 106 },
++ { 0x00ea, 107 },
++ { 0x00eb, 108 },
++ { 0x00ec, 109 },
++ { 0x00ed, 110 },
++ { 0x00ee, 111 },
++ { 0x00ef, 112 },
++ { 0x00f0, 113 },
++ { 0x00f2, 115 },
++ { 0x00f3, 116 },
++ { 0x00f4, 117 },
++ { 0x00f5, 118 },
++ { 0x00e6, 103 },
++ { 0x00e8, 105 },
++ { 0x00e3, 100 },
++ { 0x00fe, 127 },
++ { 0x00fb, 124 },
++ { 0x00fd, 126 },
++ { 0x00ff, 128 },
++ { 0x00f9, 122 },
++ { 0x00f8, 121 },
++ { 0x00fc, 125 },
++ { 0x00e0, 97 },
++ { 0x00f1, 114 },
++ { 0x00c1, 66 },
++ { 0x00c2, 67 },
++ { 0x00d7, 88 },
++ { 0x00c7, 72 },
++ { 0x00c4, 69 },
++ { 0x00c5, 70 },
++ { 0x00d6, 87 },
++ { 0x00da, 91 },
++ { 0x00c9, 74 },
++ { 0x00ca, 75 },
++ { 0x00cb, 76 },
++ { 0x00cc, 77 },
++ { 0x00cd, 78 },
++ { 0x00ce, 79 },
++ { 0x00cf, 80 },
++ { 0x00d0, 81 },
++ { 0x00d2, 83 },
++ { 0x00d3, 84 },
++ { 0x00d4, 85 },
++ { 0x00d5, 86 },
++ { 0x00c6, 71 },
++ { 0x00c8, 73 },
++ { 0x00c3, 68 },
++ { 0x00de, 95 },
++ { 0x00db, 92 },
++ { 0x00dd, 94 },
++ { 0x00df, 96 },
++ { 0x00d9, 90 },
++ { 0x00d8, 89 },
++ { 0x00dc, 93 },
++ { 0x00c0, 65 },
++ { 0x00d1, 82 },
++ { 0x00a3, 36 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x005f, 0 },
++ { 0x0095, 22 },
++ { 0x0096, 23 },
++ { 0x0097, 24 },
++ { 0x0098, 25 },
++ { 0x0099, 26 },
++ { 0x0093, 20 },
++ { 0x009b, 28 },
++ { 0x0080, 1 },
++ { 0x0081, 2 },
++ { 0x0082, 3 },
++ { 0x0083, 4 },
++ { 0x0084, 5 },
++ { 0x0085, 6 },
++ { 0x0086, 7 },
++ { 0x0087, 8 },
++ { 0x0088, 9 },
++ { 0x0089, 10 },
++ { 0x008a, 11 },
++ { 0x00a0, 33 },
++ { 0x00a1, 34 },
++ { 0x00a2, 35 },
++ { 0x00a4, 37 },
++ { 0x00a5, 38 },
++ { 0x00a6, 39 },
++ { 0x00a7, 40 },
++ { 0x00a8, 41 },
++ { 0x00a9, 42 },
++ { 0x00aa, 43 },
++ { 0x00ab, 44 },
++ { 0x00ac, 45 },
++ { 0x00ad, 46 },
++ { 0x00ae, 47 },
++ { 0x00af, 48 },
++ { 0x00b0, 49 },
++ { 0x00b1, 50 },
++ { 0x00b2, 51 },
++ { 0x00b4, 53 },
++ { 0x00b5, 54 },
++ { 0x00b6, 55 },
++ { 0x00b7, 56 },
++ { 0x00b8, 57 },
++ { 0x00b9, 58 },
++ { 0x00ba, 59 },
++ { 0x00bb, 60 },
++ { 0x00bc, 61 },
++ { 0x00bd, 62 },
++ { 0x00be, 63 },
++ { 0x008b, 12 },
++ { 0x008c, 13 },
++ { 0x008d, 14 },
++ { 0x008e, 15 },
++ { 0x008f, 16 },
++ { 0x0090, 17 },
++ { 0x0091, 18 },
++ { 0x0092, 19 },
++ { 0x0094, 21 },
++ { 0x0000, 0 }
++ };
++
+diff -urN vsftpd-2.0.5.org/char_maps/soutern.map vsftpd-2.0.5/char_maps/soutern.map
+--- vsftpd-2.0.5.org/char_maps/soutern.map 1970-01-01 03:00:00.000000000 +0300
++++ vsftpd-2.0.5/char_maps/soutern.map 2008-01-13 20:09:59.000000000 +0200
+@@ -0,0 +1,259 @@
++/*
++ !!! WARNING !!!
++ DON'T CHANGE ORDER OF CHARS
++*/
++
++struct codepage_map codepage_utf8sout_array[] =
++ {
++ { 0x000003, 121 }, // max size , char count
++ { 0x00c280, 1 },
++ { 0x00c281, 2 },
++ { 0x00c282, 3 },
++ { 0x00c283, 4 },
++ { 0x00c284, 5 },
++ { 0x00c285, 6 },
++ { 0x00c286, 7 },
++ { 0x00c287, 8 },
++ { 0x00c288, 9 },
++ { 0x00c289, 10 },
++ { 0x00c28a, 11 },
++ { 0x00c28b, 12 },
++ { 0x00c28c, 13 },
++ { 0x00c28d, 14 },
++ { 0x00c28e, 15 },
++ { 0x00c28f, 16 },
++ { 0x00c290, 17 },
++ { 0x00c291, 18 },
++ { 0x00c292, 19 },
++ { 0x00c293, 20 },
++ { 0x00c294, 21 },
++ { 0x00c295, 22 },
++ { 0x00c296, 23 },
++ { 0x00c297, 24 },
++ { 0x00c298, 25 },
++ { 0x00c299, 26 },
++ { 0x00c29a, 27 },
++ { 0x00c29b, 28 },
++ { 0x00c29c, 29 },
++ { 0x00c29d, 30 },
++ { 0x00c29e, 31 },
++ { 0x00c29f, 32 },
++ { 0x00c2a0, 33 },
++ { 0x00c2a3, 34 },
++ { 0x00c2a4, 35 },
++ { 0x00c2a7, 36 },
++ { 0x00c2a8, 37 },
++ { 0x00c2ad, 38 },
++ { 0x00c2b0, 39 },
++ { 0x00c2b2, 40 },
++ { 0x00c2b3, 41 },
++ { 0x00c2b4, 42 },
++ { 0x00c2b5, 43 },
++ { 0x00c2b7, 44 },
++ { 0x00c2b8, 45 },
++ { 0x00c2bd, 46 },
++ { 0x00c380, 47 },
++ { 0x00c381, 48 },
++ { 0x00c382, 49 },
++ { 0x00c384, 50 },
++ { 0x00c387, 51 },
++ { 0x00c388, 52 },
++ { 0x00c389, 53 },
++ { 0x00c38a, 54 },
++ { 0x00c38b, 55 },
++ { 0x00c38c, 56 },
++ { 0x00c38d, 57 },
++ { 0x00c38e, 58 },
++ { 0x00c38f, 59 },
++ { 0x00c391, 60 },
++ { 0x00c392, 61 },
++ { 0x00c393, 62 },
++ { 0x00c394, 63 },
++ { 0x00c396, 64 },
++ { 0x00c397, 65 },
++ { 0x00c399, 66 },
++ { 0x00c39a, 67 },
++ { 0x00c39b, 68 },
++ { 0x00c39c, 69 },
++ { 0x00c39f, 70 },
++ { 0x00c3a0, 71 },
++ { 0x00c3a1, 72 },
++ { 0x00c3a2, 73 },
++ { 0x00c3a4, 74 },
++ { 0x00c3a7, 75 },
++ { 0x00c3a8, 76 },
++ { 0x00c3a9, 77 },
++ { 0x00c3aa, 78 },
++ { 0x00c3ab, 79 },
++ { 0x00c3ac, 80 },
++ { 0x00c3ad, 81 },
++ { 0x00c3ae, 82 },
++ { 0x00c3af, 83 },
++ { 0x00c3b1, 84 },
++ { 0x00c3b2, 85 },
++ { 0x00c3b3, 86 },
++ { 0x00c3b4, 87 },
++ { 0x00c3b6, 88 },
++ { 0x00c3b7, 89 },
++ { 0x00c3b9, 90 },
++ { 0x00c3ba, 91 },
++ { 0x00c3bb, 92 },
++ { 0x00c3bc, 93 },
++ { 0x00c488, 94 },
++ { 0x00c489, 95 },
++ { 0x00c48a, 96 },
++ { 0x00c48b, 97 },
++ { 0x00c49c, 98 },
++ { 0x00c49d, 99 },
++ { 0x00c49e, 100 },
++ { 0x00c49f, 101 },
++ { 0x00c4a0, 102 },
++ { 0x00c4a1, 103 },
++ { 0x00c4a4, 104 },
++ { 0x00c4a5, 105 },
++ { 0x00c4a6, 106 },
++ { 0x00c4a7, 107 },
++ { 0x00c4b0, 108 },
++ { 0x00c4b1, 109 },
++ { 0x00c4b4, 110 },
++ { 0x00c4b5, 111 },
++ { 0x00c59c, 112 },
++ { 0x00c59d, 113 },
++ { 0x00c59e, 114 },
++ { 0x00c59f, 115 },
++ { 0x00c5ac, 116 },
++ { 0x00c5ad, 117 },
++ { 0x00c5bb, 118 },
++ { 0x00c5bc, 119 },
++ { 0x00cb98, 120 },
++ { 0x00cb99, 121 },
++ { 0x000000, 0 }
++ };
++
++struct codepage_map codepage_iso3_array[] =
++ {
++ { 0x0001, 121 }, // max size , char count for control
++ { 0x0080, 1 },
++ { 0x0081, 2 },
++ { 0x0082, 3 },
++ { 0x0083, 4 },
++ { 0x0084, 5 },
++ { 0x0085, 6 },
++ { 0x0086, 7 },
++ { 0x0087, 8 },
++ { 0x0088, 9 },
++ { 0x0089, 10 },
++ { 0x008a, 11 },
++ { 0x008b, 12 },
++ { 0x008c, 13 },
++ { 0x008d, 14 },
++ { 0x008e, 15 },
++ { 0x008f, 16 },
++ { 0x0090, 17 },
++ { 0x0091, 18 },
++ { 0x0092, 19 },
++ { 0x0093, 20 },
++ { 0x0094, 21 },
++ { 0x0095, 22 },
++ { 0x0096, 23 },
++ { 0x0097, 24 },
++ { 0x0098, 25 },
++ { 0x0099, 26 },
++ { 0x009a, 27 },
++ { 0x009b, 28 },
++ { 0x009c, 29 },
++ { 0x009d, 30 },
++ { 0x009e, 31 },
++ { 0x009f, 32 },
++ { 0x00a0, 33 },
++ { 0x00a3, 36 },
++ { 0x00a4, 37 },
++ { 0x00a7, 39 },
++ { 0x00a8, 40 },
++ { 0x00ad, 45 },
++ { 0x00b0, 47 },
++ { 0x00b2, 49 },
++ { 0x00b3, 50 },
++ { 0x00b4, 51 },
++ { 0x00b5, 52 },
++ { 0x00b7, 54 },
++ { 0x00b8, 55 },
++ { 0x00bd, 60 },
++ { 0x00c0, 62 },
++ { 0x00c1, 63 },
++ { 0x00c2, 64 },
++ { 0x00c4, 65 },
++ { 0x00c7, 68 },
++ { 0x00c8, 69 },
++ { 0x00c9, 70 },
++ { 0x00ca, 71 },
++ { 0x00cb, 72 },
++ { 0x00cc, 73 },
++ { 0x00cd, 74 },
++ { 0x00ce, 75 },
++ { 0x00cf, 76 },
++ { 0x00d1, 77 },
++ { 0x00d2, 78 },
++ { 0x00d3, 79 },
++ { 0x00d4, 80 },
++ { 0x00d6, 82 },
++ { 0x00d7, 83 },
++ { 0x00d9, 85 },
++ { 0x00da, 86 },
++ { 0x00db, 87 },
++ { 0x00dc, 88 },
++ { 0x00df, 91 },
++ { 0x00e0, 92 },
++ { 0x00e1, 93 },
++ { 0x00e2, 94 },
++ { 0x00e4, 95 },
++ { 0x00e7, 98 },
++ { 0x00e8, 99 },
++ { 0x00e9, 100 },
++ { 0x00ea, 101 },
++ { 0x00eb, 102 },
++ { 0x00ec, 103 },
++ { 0x00ed, 104 },
++ { 0x00ee, 105 },
++ { 0x00ef, 106 },
++ { 0x00f1, 107 },
++ { 0x00f2, 108 },
++ { 0x00f3, 109 },
++ { 0x00f4, 110 },
++ { 0x00f6, 112 },
++ { 0x00f7, 113 },
++ { 0x00f9, 115 },
++ { 0x00fa, 116 },
++ { 0x00fb, 117 },
++ { 0x00fc, 118 },
++ { 0x00c6, 67 },
++ { 0x00e6, 97 },
++ { 0x00c5, 66 },
++ { 0x00e5, 96 },
++ { 0x00d8, 84 },
++ { 0x00f8, 114 },
++ { 0x00ab, 43 },
++ { 0x00bb, 58 },
++ { 0x00d5, 81 },
++ { 0x00f5, 111 },
++ { 0x00a6, 38 },
++ { 0x00b6, 53 },
++ { 0x00a1, 34 },
++ { 0x00b1, 48 },
++ { 0x00a9, 41 },
++ { 0x00b9, 56 },
++ { 0x00ac, 44 },
++ { 0x00bc, 59 },
++ { 0x00de, 90 },
++ { 0x00fe, 120 },
++ { 0x00aa, 42 },
++ { 0x00ba, 57 },
++ { 0x00dd, 89 },
++ { 0x00fd, 119 },
++ { 0x00af, 46 },
++ { 0x00bf, 61 },
++ { 0x00a2, 35 },
++ { 0x00ff, 121 },
++ { 0x0000, 0 }
++ };
++
+diff -urN vsftpd-2.0.5.org/char_maps/utf8.map vsftpd-2.0.5/char_maps/utf8.map
+--- vsftpd-2.0.5.org/char_maps/utf8.map 1970-01-01 03:00:00.000000000 +0300
++++ vsftpd-2.0.5/char_maps/utf8.map 2008-01-13 20:09:59.000000000 +0200
+@@ -0,0 +1,393 @@
++/*
++ !!! WARNING !!!
++ DON'T CHANGE ORDER OF CHARS
++*/
++
++struct codepage_map codepage_utf8_array[] =
++ {
++ { 0x000003, 382 }, // max size , char count
++ { 0x00c280, 1 },
++ { 0x00c281, 2 },
++ { 0x00c282, 3 },
++ { 0x00c283, 4 },
++ { 0x00c284, 5 },
++ { 0x00c285, 6 },
++ { 0x00c286, 7 },
++ { 0x00c287, 8 },
++ { 0x00c288, 9 },
++ { 0x00c289, 10 },
++ { 0x00c28a, 11 },
++ { 0x00c28b, 12 },
++ { 0x00c28c, 13 },
++ { 0x00c28d, 14 },
++ { 0x00c28e, 15 },
++ { 0x00c28f, 16 },
++ { 0x00c290, 17 },
++ { 0x00c291, 18 },
++ { 0x00c292, 19 },
++ { 0x00c293, 20 },
++ { 0x00c294, 21 },
++ { 0x00c295, 22 },
++ { 0x00c296, 23 },
++ { 0x00c297, 24 },
++ { 0x00c298, 25 },
++ { 0x00c299, 26 },
++ { 0x00c29a, 27 },
++ { 0x00c29b, 28 },
++ { 0x00c29c, 29 },
++ { 0x00c29d, 30 },
++ { 0x00c29e, 31 },
++ { 0x00c29f, 32 },
++ { 0x00c2a0, 33 },
++ { 0x00c2a1, 34 },
++ { 0x00c2a2, 35 },
++ { 0x00c2a3, 36 },
++ { 0x00c2a4, 37 },
++ { 0x00c2a5, 38 },
++ { 0x00c2a6, 39 },
++ { 0x00c2a7, 40 },
++ { 0x00c2a8, 41 },
++ { 0x00c2a9, 42 },
++ { 0x00c2aa, 43 },
++ { 0x00c2ab, 44 },
++ { 0x00c2ac, 45 },
++ { 0x00c2ad, 46 },
++ { 0x00c2ae, 47 },
++ { 0x00c2af, 48 },
++ { 0x00c2b0, 49 },
++ { 0x00c2b1, 50 },
++ { 0x00c2b2, 51 },
++ { 0x00c2b3, 52 },
++ { 0x00c2b4, 53 },
++ { 0x00c2b5, 54 },
++ { 0x00c2b6, 55 },
++ { 0x00c2b7, 56 },
++ { 0x00c2b8, 57 },
++ { 0x00c2b9, 58 },
++ { 0x00c2ba, 59 },
++ { 0x00c2bb, 60 },
++ { 0x00c2bc, 61 },
++ { 0x00c2bd, 62 },
++ { 0x00c2be, 63 },
++ { 0x00c2bf, 64 },
++ { 0x00c380, 65 },
++ { 0x00c381, 66 },
++ { 0x00c382, 67 },
++ { 0x00c383, 68 },
++ { 0x00c384, 69 },
++ { 0x00c385, 70 },
++ { 0x00c386, 71 },
++ { 0x00c387, 72 },
++ { 0x00c388, 73 },
++ { 0x00c389, 74 },
++ { 0x00c38a, 75 },
++ { 0x00c38b, 76 },
++ { 0x00c38c, 77 },
++ { 0x00c38d, 78 },
++ { 0x00c38e, 79 },
++ { 0x00c38f, 80 },
++ { 0x00c390, 81 },
++ { 0x00c391, 82 },
++ { 0x00c392, 83 },
++ { 0x00c393, 84 },
++ { 0x00c394, 85 },
++ { 0x00c395, 86 },
++ { 0x00c396, 87 },
++ { 0x00c397, 88 },
++ { 0x00c398, 89 },
++ { 0x00c399, 90 },
++ { 0x00c39a, 91 },
++ { 0x00c39b, 92 },
++ { 0x00c39c, 93 },
++ { 0x00c39d, 94 },
++ { 0x00c39e, 95 },
++ { 0x00c39f, 96 },
++ { 0x00c3a0, 97 },
++ { 0x00c3a1, 98 },
++ { 0x00c3a2, 99 },
++ { 0x00c3a3, 100 },
++ { 0x00c3a4, 101 },
++ { 0x00c3a5, 102 },
++ { 0x00c3a6, 103 },
++ { 0x00c3a7, 104 },
++ { 0x00c3a8, 105 },
++ { 0x00c3a9, 106 },
++ { 0x00c3aa, 107 },
++ { 0x00c3ab, 108 },
++ { 0x00c3ac, 109 },
++ { 0x00c3ad, 110 },
++ { 0x00c3ae, 111 },
++ { 0x00c3af, 112 },
++ { 0x00c3b0, 113 },
++ { 0x00c3b1, 114 },
++ { 0x00c3b2, 115 },
++ { 0x00c3b3, 116 },
++ { 0x00c3b4, 117 },
++ { 0x00c3b5, 118 },
++ { 0x00c3b6, 119 },
++ { 0x00c3b7, 120 },
++ { 0x00c3b8, 121 },
++ { 0x00c3b9, 122 },
++ { 0x00c3ba, 123 },
++ { 0x00c3bb, 124 },
++ { 0x00c3bc, 125 },
++ { 0x00c3bd, 126 },
++ { 0x00c3be, 127 },
++ { 0x00c3bf, 128 },
++ { 0x00c482, 129 },
++ { 0x00c483, 130 },
++ { 0x00c484, 131 },
++ { 0x00c485, 132 },
++ { 0x00c486, 133 },
++ { 0x00c487, 134 },
++ { 0x00c488, 135 },
++ { 0x00c489, 136 },
++ { 0x00c48a, 137 },
++ { 0x00c48b, 138 },
++ { 0x00c48c, 139 },
++ { 0x00c48d, 140 },
++ { 0x00c48e, 141 },
++ { 0x00c48f, 142 },
++ { 0x00c490, 143 },
++ { 0x00c491, 144 },
++ { 0x00c498, 145 },
++ { 0x00c499, 146 },
++ { 0x00c49a, 147 },
++ { 0x00c49b, 148 },
++ { 0x00c49c, 149 },
++ { 0x00c49d, 150 },
++ { 0x00c49e, 151 },
++ { 0x00c49f, 152 },
++ { 0x00c4a0, 153 },
++ { 0x00c4a1, 154 },
++ { 0x00c4a4, 155 },
++ { 0x00c4a5, 156 },
++ { 0x00c4a6, 157 },
++ { 0x00c4a7, 158 },
++ { 0x00c4b0, 159 },
++ { 0x00c4b1, 160 },
++ { 0x00c4b4, 161 },
++ { 0x00c4b5, 162 },
++ { 0x00c4b9, 163 },
++ { 0x00c4ba, 164 },
++ { 0x00c4bd, 165 },
++ { 0x00c4be, 166 },
++ { 0x00c581, 167 },
++ { 0x00c582, 168 },
++ { 0x00c583, 169 },
++ { 0x00c584, 170 },
++ { 0x00c587, 171 },
++ { 0x00c588, 172 },
++ { 0x00c590, 173 },
++ { 0x00c591, 174 },
++ { 0x00c592, 175 },
++ { 0x00c593, 176 },
++ { 0x00c594, 177 },
++ { 0x00c595, 178 },
++ { 0x00c598, 179 },
++ { 0x00c599, 180 },
++ { 0x00c59a, 181 },
++ { 0x00c59b, 182 },
++ { 0x00c59c, 183 },
++ { 0x00c59d, 184 },
++ { 0x00c59e, 185 },
++ { 0x00c59f, 186 },
++ { 0x00c5a0, 187 },
++ { 0x00c5a1, 188 },
++ { 0x00c5a2, 189 },
++ { 0x00c5a3, 190 },
++ { 0x00c5a4, 191 },
++ { 0x00c5a5, 192 },
++ { 0x00c5ac, 193 },
++ { 0x00c5ad, 194 },
++ { 0x00c5ae, 195 },
++ { 0x00c5af, 196 },
++ { 0x00c5b0, 197 },
++ { 0x00c5b1, 198 },
++ { 0x00c5b8, 199 },
++ { 0x00c5b9, 200 },
++ { 0x00c5ba, 201 },
++ { 0x00c5bb, 202 },
++ { 0x00c5bc, 203 },
++ { 0x00c5bd, 204 },
++ { 0x00c5be, 205 },
++ { 0x00c692, 206 },
++ { 0x00c89a, 207 },
++ { 0x00cb86, 208 },
++ { 0x00cb87, 209 },
++ { 0x00cb98, 210 },
++ { 0x00cb99, 211 },
++ { 0x00cb9b, 212 },
++ { 0x00cb9c, 213 },
++ { 0x00cb9d, 214 },
++ { 0x00d081, 215 },
++ { 0x00d082, 216 },
++ { 0x00d083, 217 },
++ { 0x00d084, 218 },
++ { 0x00d085, 219 },
++ { 0x00d086, 220 },
++ { 0x00d087, 221 },
++ { 0x00d088, 222 },
++ { 0x00d089, 223 },
++ { 0x00d08a, 224 },
++ { 0x00d08b, 225 },
++ { 0x00d08c, 226 },
++ { 0x00d08e, 227 },
++ { 0x00d08f, 228 },
++ { 0x00d090, 229 },
++ { 0x00d091, 230 },
++ { 0x00d092, 231 },
++ { 0x00d093, 232 },
++ { 0x00d094, 233 },
++ { 0x00d095, 234 },
++ { 0x00d096, 235 },
++ { 0x00d097, 236 },
++ { 0x00d098, 237 },
++ { 0x00d099, 238 },
++ { 0x00d09a, 239 },
++ { 0x00d09b, 240 },
++ { 0x00d09c, 241 },
++ { 0x00d09d, 242 },
++ { 0x00d09e, 243 },
++ { 0x00d09f, 244 },
++ { 0x00d0a0, 245 },
++ { 0x00d0a1, 246 },
++ { 0x00d0a2, 247 },
++ { 0x00d0a3, 248 },
++ { 0x00d0a4, 249 },
++ { 0x00d0a5, 250 },
++ { 0x00d0a6, 251 },
++ { 0x00d0a7, 252 },
++ { 0x00d0a8, 253 },
++ { 0x00d0a9, 254 },
++ { 0x00d0aa, 255 },
++ { 0x00d0ab, 256 },
++ { 0x00d0ac, 257 },
++ { 0x00d0ad, 258 },
++ { 0x00d0ae, 259 },
++ { 0x00d0af, 260 },
++ { 0x00d0b0, 261 },
++ { 0x00d0b1, 262 },
++ { 0x00d0b2, 263 },
++ { 0x00d0b3, 264 },
++ { 0x00d0b4, 265 },
++ { 0x00d0b5, 266 },
++ { 0x00d0b6, 267 },
++ { 0x00d0b7, 268 },
++ { 0x00d0b8, 269 },
++ { 0x00d0b9, 270 },
++ { 0x00d0ba, 271 },
++ { 0x00d0bb, 272 },
++ { 0x00d0bc, 273 },
++ { 0x00d0bd, 274 },
++ { 0x00d0be, 275 },
++ { 0x00d0bf, 276 },
++ { 0x00d180, 277 },
++ { 0x00d181, 278 },
++ { 0x00d182, 279 },
++ { 0x00d183, 280 },
++ { 0x00d184, 281 },
++ { 0x00d185, 282 },
++ { 0x00d186, 283 },
++ { 0x00d187, 284 },
++ { 0x00d188, 285 },
++ { 0x00d189, 286 },
++ { 0x00d18a, 287 },
++ { 0x00d18b, 288 },
++ { 0x00d18c, 289 },
++ { 0x00d18d, 290 },
++ { 0x00d18e, 291 },
++ { 0x00d18f, 292 },
++ { 0x00d191, 293 },
++ { 0x00d192, 294 },
++ { 0x00d193, 295 },
++ { 0x00d194, 296 },
++ { 0x00d195, 297 },
++ { 0x00d196, 298 },
++ { 0x00d197, 299 },
++ { 0x00d198, 300 },
++ { 0x00d199, 301 },
++ { 0x00d19a, 302 },
++ { 0x00d19b, 303 },
++ { 0x00d19c, 304 },
++ { 0x00d19e, 305 },
++ { 0x00d19f, 306 },
++ { 0x00d290, 307 },
++ { 0x00d291, 308 },
++ { 0xe28093, 309 },
++ { 0xe28094, 310 },
++ { 0xe28098, 311 },
++ { 0xe28099, 312 },
++ { 0xe2809a, 313 },
++ { 0xe2809c, 314 },
++ { 0xe2809d, 315 },
++ { 0xe2809e, 316 },
++ { 0xe280a0, 317 },
++ { 0xe280a1, 318 },
++ { 0xe280a2, 319 },
++ { 0xe280a6, 320 },
++ { 0xe280b0, 321 },
++ { 0xe280b9, 322 },
++ { 0xe280ba, 323 },
++ { 0xe282ac, 324 },
++ { 0xe28496, 325 },
++ { 0xe284a2, 326 },
++ { 0xe28899, 327 },
++ { 0xe2889a, 328 },
++ { 0xe28988, 329 },
++ { 0xe289a4, 330 },
++ { 0xe289a5, 331 },
++ { 0xe28ca0, 332 },
++ { 0xe28ca1, 333 },
++ { 0xe29480, 334 },
++ { 0xe29482, 335 },
++ { 0xe2948c, 336 },
++ { 0xe29490, 337 },
++ { 0xe29494, 338 },
++ { 0xe29498, 339 },
++ { 0xe2949c, 340 },
++ { 0xe294a4, 341 },
++ { 0xe294ac, 342 },
++ { 0xe294b4, 343 },
++ { 0xe294bc, 344 },
++ { 0xe29590, 345 },
++ { 0xe29591, 346 },
++ { 0xe29592, 347 },
++ { 0xe29593, 348 },
++ { 0xe29594, 349 },
++ { 0xe29595, 350 },
++ { 0xe29596, 351 },
++ { 0xe29597, 352 },
++ { 0xe29598, 353 },
++ { 0xe29599, 354 },
++ { 0xe2959a, 355 },
++ { 0xe2959b, 356 },
++ { 0xe2959c, 357 },
++ { 0xe2959d, 358 },
++ { 0xe2959e, 359 },
++ { 0xe2959f, 360 },
++ { 0xe295a0, 361 },
++ { 0xe295a1, 362 },
++ { 0xe295a2, 363 },
++ { 0xe295a3, 364 },
++ { 0xe295a4, 365 },
++ { 0xe295a5, 366 },
++ { 0xe295a6, 367 },
++ { 0xe295a7, 368 },
++ { 0xe295a8, 369 },
++ { 0xe295a9, 370 },
++ { 0xe295aa, 371 },
++ { 0xe295ab, 372 },
++ { 0xe295ac, 373 },
++ { 0xe29680, 374 },
++ { 0xe29684, 375 },
++ { 0xe29688, 376 },
++ { 0xe2968c, 377 },
++ { 0xe29690, 378 },
++ { 0xe29691, 379 },
++ { 0xe29692, 380 },
++ { 0xe29693, 381 },
++ { 0xe296a0, 382 },
++ { 0x000000, 0 }
++ };
++
+diff -urN vsftpd-2.0.5.org/char_maps/western.map vsftpd-2.0.5/char_maps/western.map
+--- vsftpd-2.0.5.org/char_maps/western.map 1970-01-01 03:00:00.000000000 +0300
++++ vsftpd-2.0.5/char_maps/western.map 2008-01-13 20:09:59.000000000 +0200
+@@ -0,0 +1,669 @@
++/*
++ !!! WARNING !!!
++ DON'T CHANGE ORDER OF CHARS
++*/
++
++struct codepage_map codepage_utf8west_array[] =
++ {
++ { 0x000003, 155 }, // max size , char count
++ { 0x00003f, 0 },
++ { 0x00003f, 0 },
++ { 0x00003f, 0 },
++ { 0x00003f, 0 },
++ { 0x00003f, 0 },
++ { 0x00c280, 1 },
++ { 0x00c281, 2 },
++ { 0x00c282, 3 },
++ { 0x00c283, 4 },
++ { 0x00c284, 5 },
++ { 0x00c285, 6 },
++ { 0x00c286, 7 },
++ { 0x00c287, 8 },
++ { 0x00c288, 9 },
++ { 0x00c289, 10 },
++ { 0x00c28a, 11 },
++ { 0x00c28b, 12 },
++ { 0x00c28c, 13 },
++ { 0x00c28d, 14 },
++ { 0x00c28e, 15 },
++ { 0x00c28f, 16 },
++ { 0x00c290, 17 },
++ { 0x00c291, 18 },
++ { 0x00c292, 19 },
++ { 0x00c293, 20 },
++ { 0x00c294, 21 },
++ { 0x00c295, 22 },
++ { 0x00c296, 23 },
++ { 0x00c297, 24 },
++ { 0x00c298, 25 },
++ { 0x00c299, 26 },
++ { 0x00c29a, 27 },
++ { 0x00c29b, 28 },
++ { 0x00c29c, 29 },
++ { 0x00c29d, 30 },
++ { 0x00c29e, 31 },
++ { 0x00c29f, 32 },
++ { 0x00c2a0, 33 },
++ { 0x00c2a1, 34 },
++ { 0x00c2a2, 35 },
++ { 0x00c2a3, 36 },
++ { 0x00c2a4, 37 },
++ { 0x00c2a5, 38 },
++ { 0x00c2a6, 39 },
++ { 0x00c2a7, 40 },
++ { 0x00c2a8, 41 },
++ { 0x00c2a9, 42 },
++ { 0x00c2aa, 43 },
++ { 0x00c2ab, 44 },
++ { 0x00c2ac, 45 },
++ { 0x00c2ad, 46 },
++ { 0x00c2ae, 47 },
++ { 0x00c2af, 48 },
++ { 0x00c2b0, 49 },
++ { 0x00c2b1, 50 },
++ { 0x00c2b2, 51 },
++ { 0x00c2b3, 52 },
++ { 0x00c2b4, 53 },
++ { 0x00c2b5, 54 },
++ { 0x00c2b6, 55 },
++ { 0x00c2b7, 56 },
++ { 0x00c2b8, 57 },
++ { 0x00c2b9, 58 },
++ { 0x00c2ba, 59 },
++ { 0x00c2bb, 60 },
++ { 0x00c2bc, 61 },
++ { 0x00c2bd, 62 },
++ { 0x00c2be, 63 },
++ { 0x00c2bf, 64 },
++ { 0x00c380, 65 },
++ { 0x00c381, 66 },
++ { 0x00c382, 67 },
++ { 0x00c383, 68 },
++ { 0x00c384, 69 },
++ { 0x00c385, 70 },
++ { 0x00c386, 71 },
++ { 0x00c387, 72 },
++ { 0x00c388, 73 },
++ { 0x00c389, 74 },
++ { 0x00c38a, 75 },
++ { 0x00c38b, 76 },
++ { 0x00c38c, 77 },
++ { 0x00c38d, 78 },
++ { 0x00c38e, 79 },
++ { 0x00c38f, 80 },
++ { 0x00c390, 81 },
++ { 0x00c391, 82 },
++ { 0x00c392, 83 },
++ { 0x00c393, 84 },
++ { 0x00c394, 85 },
++ { 0x00c395, 86 },
++ { 0x00c396, 87 },
++ { 0x00c397, 88 },
++ { 0x00c398, 89 },
++ { 0x00c399, 90 },
++ { 0x00c39a, 91 },
++ { 0x00c39b, 92 },
++ { 0x00c39c, 93 },
++ { 0x00c39d, 94 },
++ { 0x00c39e, 95 },
++ { 0x00c39f, 96 },
++ { 0x00c3a0, 97 },
++ { 0x00c3a1, 98 },
++ { 0x00c3a2, 99 },
++ { 0x00c3a3, 100 },
++ { 0x00c3a4, 101 },
++ { 0x00c3a5, 102 },
++ { 0x00c3a6, 103 },
++ { 0x00c3a7, 104 },
++ { 0x00c3a8, 105 },
++ { 0x00c3a9, 106 },
++ { 0x00c3aa, 107 },
++ { 0x00c3ab, 108 },
++ { 0x00c3ac, 109 },
++ { 0x00c3ad, 110 },
++ { 0x00c3ae, 111 },
++ { 0x00c3af, 112 },
++ { 0x00c3b0, 113 },
++ { 0x00c3b1, 114 },
++ { 0x00c3b2, 115 },
++ { 0x00c3b3, 116 },
++ { 0x00c3b4, 117 },
++ { 0x00c3b5, 118 },
++ { 0x00c3b6, 119 },
++ { 0x00c3b7, 120 },
++ { 0x00c3b8, 121 },
++ { 0x00c3b9, 122 },
++ { 0x00c3ba, 123 },
++ { 0x00c3bb, 124 },
++ { 0x00c3bc, 125 },
++ { 0x00c3bd, 126 },
++ { 0x00c3be, 127 },
++ { 0x00c3bf, 128 },
++ { 0x00c592, 129 },
++ { 0x00c593, 130 },
++ { 0x00c5a0, 131 },
++ { 0x00c5a1, 132 },
++ { 0x00c5b8, 133 },
++ { 0x00c5bd, 134 },
++ { 0x00c5be, 135 },
++ { 0x00c692, 136 },
++ { 0x00cb86, 137 },
++ { 0x00cb9c, 138 },
++ { 0xe28093, 139 },
++ { 0xe28094, 140 },
++ { 0xe28098, 141 },
++ { 0xe28099, 142 },
++ { 0xe2809a, 143 },
++ { 0xe2809c, 144 },
++ { 0xe2809d, 145 },
++ { 0xe2809e, 146 },
++ { 0xe280a0, 147 },
++ { 0xe280a1, 148 },
++ { 0xe280a2, 149 },
++ { 0xe280a6, 150 },
++ { 0xe280b0, 151 },
++ { 0xe280b9, 152 },
++ { 0xe280ba, 153 },
++ { 0xe282ac, 154 },
++ { 0xe284a2, 155 },
++ { 0x000000, 0 }
++ };
++
++struct codepage_map codepage_iso1_array[] =
++ {
++ { 0x0001, 128 }, // max size , char count for control
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x0080, 1 },
++ { 0x0081, 2 },
++ { 0x0082, 3 },
++ { 0x0083, 4 },
++ { 0x0084, 5 },
++ { 0x0085, 6 },
++ { 0x0086, 7 },
++ { 0x0087, 8 },
++ { 0x0088, 9 },
++ { 0x0089, 10 },
++ { 0x008a, 11 },
++ { 0x008b, 12 },
++ { 0x008c, 13 },
++ { 0x008d, 14 },
++ { 0x008e, 15 },
++ { 0x008f, 16 },
++ { 0x0090, 17 },
++ { 0x0091, 18 },
++ { 0x0092, 19 },
++ { 0x0093, 20 },
++ { 0x0094, 21 },
++ { 0x0095, 22 },
++ { 0x0096, 23 },
++ { 0x0097, 24 },
++ { 0x0098, 25 },
++ { 0x0099, 26 },
++ { 0x009a, 27 },
++ { 0x009b, 28 },
++ { 0x009c, 29 },
++ { 0x009d, 30 },
++ { 0x009e, 31 },
++ { 0x009f, 32 },
++ { 0x00a0, 33 },
++ { 0x00a1, 34 },
++ { 0x00a2, 35 },
++ { 0x00a3, 36 },
++ { 0x00a4, 37 },
++ { 0x00a5, 38 },
++ { 0x00a6, 39 },
++ { 0x00a7, 40 },
++ { 0x00a8, 41 },
++ { 0x00a9, 42 },
++ { 0x00aa, 43 },
++ { 0x00ab, 44 },
++ { 0x00ac, 45 },
++ { 0x00ad, 46 },
++ { 0x00ae, 47 },
++ { 0x00af, 48 },
++ { 0x00b0, 49 },
++ { 0x00b1, 50 },
++ { 0x00b2, 51 },
++ { 0x00b3, 52 },
++ { 0x00b4, 53 },
++ { 0x00b5, 54 },
++ { 0x00b6, 55 },
++ { 0x00b7, 56 },
++ { 0x00b8, 57 },
++ { 0x00b9, 58 },
++ { 0x00ba, 59 },
++ { 0x00bb, 60 },
++ { 0x00bc, 61 },
++ { 0x00bd, 62 },
++ { 0x00be, 63 },
++ { 0x00bf, 64 },
++ { 0x00c0, 65 },
++ { 0x00c1, 66 },
++ { 0x00c2, 67 },
++ { 0x00c3, 68 },
++ { 0x00c4, 69 },
++ { 0x00c5, 70 },
++ { 0x00c6, 71 },
++ { 0x00c7, 72 },
++ { 0x00c8, 73 },
++ { 0x00c9, 74 },
++ { 0x00ca, 75 },
++ { 0x00cb, 76 },
++ { 0x00cc, 77 },
++ { 0x00cd, 78 },
++ { 0x00ce, 79 },
++ { 0x00cf, 80 },
++ { 0x00d0, 81 },
++ { 0x00d1, 82 },
++ { 0x00d2, 83 },
++ { 0x00d3, 84 },
++ { 0x00d4, 85 },
++ { 0x00d5, 86 },
++ { 0x00d6, 87 },
++ { 0x00d7, 88 },
++ { 0x00d8, 89 },
++ { 0x00d9, 90 },
++ { 0x00da, 91 },
++ { 0x00db, 92 },
++ { 0x00dc, 93 },
++ { 0x00dd, 94 },
++ { 0x00de, 95 },
++ { 0x00df, 96 },
++ { 0x00e0, 97 },
++ { 0x00e1, 98 },
++ { 0x00e2, 99 },
++ { 0x00e3, 100 },
++ { 0x00e4, 101 },
++ { 0x00e5, 102 },
++ { 0x00e6, 103 },
++ { 0x00e7, 104 },
++ { 0x00e8, 105 },
++ { 0x00e9, 106 },
++ { 0x00ea, 107 },
++ { 0x00eb, 108 },
++ { 0x00ec, 109 },
++ { 0x00ed, 110 },
++ { 0x00ee, 111 },
++ { 0x00ef, 112 },
++ { 0x00f0, 113 },
++ { 0x00f1, 114 },
++ { 0x00f2, 115 },
++ { 0x00f3, 116 },
++ { 0x00f4, 117 },
++ { 0x00f5, 118 },
++ { 0x00f6, 119 },
++ { 0x00f7, 120 },
++ { 0x00f8, 121 },
++ { 0x00f9, 122 },
++ { 0x00fa, 123 },
++ { 0x00fb, 124 },
++ { 0x00fc, 125 },
++ { 0x00fd, 126 },
++ { 0x00fe, 127 },
++ { 0x00ff, 128 },
++ { 0x0000, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x0000, 0 }
++ };
++
++struct codepage_map codepage_iso15_array[] =
++ {
++ { 0x0001, 128 }, // max size , char count for control
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x0080, 1 },
++ { 0x0081, 2 },
++ { 0x0082, 3 },
++ { 0x0083, 4 },
++ { 0x0084, 5 },
++ { 0x0085, 6 },
++ { 0x0086, 7 },
++ { 0x0087, 8 },
++ { 0x0088, 9 },
++ { 0x0089, 10 },
++ { 0x008a, 11 },
++ { 0x008b, 12 },
++ { 0x008c, 13 },
++ { 0x008d, 14 },
++ { 0x008e, 15 },
++ { 0x008f, 16 },
++ { 0x0090, 17 },
++ { 0x0091, 18 },
++ { 0x0092, 19 },
++ { 0x0093, 20 },
++ { 0x0094, 21 },
++ { 0x0095, 22 },
++ { 0x0096, 23 },
++ { 0x0097, 24 },
++ { 0x0098, 25 },
++ { 0x0099, 26 },
++ { 0x009a, 27 },
++ { 0x009b, 28 },
++ { 0x009c, 29 },
++ { 0x009d, 30 },
++ { 0x009e, 31 },
++ { 0x009f, 32 },
++ { 0x00a0, 33 },
++ { 0x00a1, 34 },
++ { 0x00a2, 35 },
++ { 0x00a3, 36 },
++ { 0x003f, 0 },
++ { 0x00a5, 38 },
++ { 0x00a6, 39 },
++ { 0x00a7, 40 },
++ { 0x00a8, 41 },
++ { 0x00a9, 42 },
++ { 0x00aa, 43 },
++ { 0x00ab, 44 },
++ { 0x00ac, 45 },
++ { 0x00ad, 46 },
++ { 0x00ae, 47 },
++ { 0x00af, 48 },
++ { 0x00b0, 49 },
++ { 0x00b1, 50 },
++ { 0x00b2, 51 },
++ { 0x00b3, 52 },
++ { 0x00b4, 53 },
++ { 0x00b5, 54 },
++ { 0x00b6, 55 },
++ { 0x00b7, 56 },
++ { 0x00b8, 57 },
++ { 0x00b9, 58 },
++ { 0x00ba, 59 },
++ { 0x00bb, 60 },
++ { 0x00bc, 61 },
++ { 0x00bd, 62 },
++ { 0x00be, 63 },
++ { 0x00bf, 64 },
++ { 0x00c0, 65 },
++ { 0x00c1, 66 },
++ { 0x00c2, 67 },
++ { 0x00c3, 68 },
++ { 0x00c4, 69 },
++ { 0x00c5, 70 },
++ { 0x00c6, 71 },
++ { 0x00c7, 72 },
++ { 0x00c8, 73 },
++ { 0x00c9, 74 },
++ { 0x00ca, 75 },
++ { 0x00cb, 76 },
++ { 0x00cc, 77 },
++ { 0x00cd, 78 },
++ { 0x00ce, 79 },
++ { 0x00cf, 80 },
++ { 0x00d0, 81 },
++ { 0x00d1, 82 },
++ { 0x00d2, 83 },
++ { 0x00d3, 84 },
++ { 0x00d4, 85 },
++ { 0x00d5, 86 },
++ { 0x00d6, 87 },
++ { 0x00d7, 88 },
++ { 0x00d8, 89 },
++ { 0x00d9, 90 },
++ { 0x00da, 91 },
++ { 0x00db, 92 },
++ { 0x00dc, 93 },
++ { 0x00dd, 94 },
++ { 0x00de, 95 },
++ { 0x00df, 96 },
++ { 0x00e0, 97 },
++ { 0x00e1, 98 },
++ { 0x00e2, 99 },
++ { 0x00e3, 100 },
++ { 0x00e4, 101 },
++ { 0x00e5, 102 },
++ { 0x00e6, 103 },
++ { 0x00e7, 104 },
++ { 0x00e8, 105 },
++ { 0x00e9, 106 },
++ { 0x00ea, 107 },
++ { 0x00eb, 108 },
++ { 0x00ec, 109 },
++ { 0x00ed, 110 },
++ { 0x00ee, 111 },
++ { 0x00ef, 112 },
++ { 0x00f0, 113 },
++ { 0x00f1, 114 },
++ { 0x00f2, 115 },
++ { 0x00f3, 116 },
++ { 0x00f4, 117 },
++ { 0x00f5, 118 },
++ { 0x00f6, 119 },
++ { 0x00f7, 120 },
++ { 0x00f8, 121 },
++ { 0x00f9, 122 },
++ { 0x00fa, 123 },
++ { 0x00fb, 124 },
++ { 0x00fc, 125 },
++ { 0x00fd, 126 },
++ { 0x00fe, 127 },
++ { 0x00ff, 128 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00a4, 37 },
++ { 0x003f, 0 },
++ { 0x0000, 0 }
++ };
++
++struct codepage_map codepage_win1252_array[] =
++ {
++ { 0x0001, 128 }, // max size , char count for control
++ { 0x0081, 2 },
++ { 0x008d, 14 },
++ { 0x008f, 16 },
++ { 0x0090, 17 },
++ { 0x009d, 30 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x003f, 0 },
++ { 0x00a0, 33 },
++ { 0x00a1, 34 },
++ { 0x00a2, 35 },
++ { 0x00a3, 36 },
++ { 0x00a4, 37 },
++ { 0x00a5, 38 },
++ { 0x00a6, 39 },
++ { 0x00a7, 40 },
++ { 0x00a8, 41 },
++ { 0x00a9, 42 },
++ { 0x00aa, 43 },
++ { 0x00ab, 44 },
++ { 0x00ac, 45 },
++ { 0x00ad, 46 },
++ { 0x00ae, 47 },
++ { 0x00af, 48 },
++ { 0x00b0, 49 },
++ { 0x00b1, 50 },
++ { 0x00b2, 51 },
++ { 0x00b3, 52 },
++ { 0x00b4, 53 },
++ { 0x00b5, 54 },
++ { 0x00b6, 55 },
++ { 0x00b7, 56 },
++ { 0x00b8, 57 },
++ { 0x00b9, 58 },
++ { 0x00ba, 59 },
++ { 0x00bb, 60 },
++ { 0x00bc, 61 },
++ { 0x00bd, 62 },
++ { 0x00be, 63 },
++ { 0x00bf, 64 },
++ { 0x00c0, 65 },
++ { 0x00c1, 66 },
++ { 0x00c2, 67 },
++ { 0x00c3, 68 },
++ { 0x00c4, 69 },
++ { 0x00c5, 70 },
++ { 0x00c6, 71 },
++ { 0x00c7, 72 },
++ { 0x00c8, 73 },
++ { 0x00c9, 74 },
++ { 0x00ca, 75 },
++ { 0x00cb, 76 },
++ { 0x00cc, 77 },
++ { 0x00cd, 78 },
++ { 0x00ce, 79 },
++ { 0x00cf, 80 },
++ { 0x00d0, 81 },
++ { 0x00d1, 82 },
++ { 0x00d2, 83 },
++ { 0x00d3, 84 },
++ { 0x00d4, 85 },
++ { 0x00d5, 86 },
++ { 0x00d6, 87 },
++ { 0x00d7, 88 },
++ { 0x00d8, 89 },
++ { 0x00d9, 90 },
++ { 0x00da, 91 },
++ { 0x00db, 92 },
++ { 0x00dc, 93 },
++ { 0x00dd, 94 },
++ { 0x00de, 95 },
++ { 0x00df, 96 },
++ { 0x00e0, 97 },
++ { 0x00e1, 98 },
++ { 0x00e2, 99 },
++ { 0x00e3, 100 },
++ { 0x00e4, 101 },
++ { 0x00e5, 102 },
++ { 0x00e6, 103 },
++ { 0x00e7, 104 },
++ { 0x00e8, 105 },
++ { 0x00e9, 106 },
++ { 0x00ea, 107 },
++ { 0x00eb, 108 },
++ { 0x00ec, 109 },
++ { 0x00ed, 110 },
++ { 0x00ee, 111 },
++ { 0x00ef, 112 },
++ { 0x00f0, 113 },
++ { 0x00f1, 114 },
++ { 0x00f2, 115 },
++ { 0x00f3, 116 },
++ { 0x00f4, 117 },
++ { 0x00f5, 118 },
++ { 0x00f6, 119 },
++ { 0x00f7, 120 },
++ { 0x00f8, 121 },
++ { 0x00f9, 122 },
++ { 0x00fa, 123 },
++ { 0x00fb, 124 },
++ { 0x00fc, 125 },
++ { 0x00fd, 126 },
++ { 0x00fe, 127 },
++ { 0x00ff, 128 },
++ { 0x008c, 13 },
++ { 0x009c, 29 },
++ { 0x008a, 11 },
++ { 0x009a, 27 },
++ { 0x009f, 32 },
++ { 0x008e, 15 },
++ { 0x009e, 31 },
++ { 0x0083, 4 },
++ { 0x0088, 9 },
++ { 0x0098, 25 },
++ { 0x0096, 23 },
++ { 0x0097, 24 },
++ { 0x0091, 18 },
++ { 0x0092, 19 },
++ { 0x0082, 3 },
++ { 0x0093, 20 },
++ { 0x0094, 21 },
++ { 0x0084, 5 },
++ { 0x0086, 7 },
++ { 0x0087, 8 },
++ { 0x0095, 22 },
++ { 0x0085, 6 },
++ { 0x0089, 10 },
++ { 0x008b, 12 },
++ { 0x009b, 28 },
++ { 0x0080, 1 },
++ { 0x0099, 26 },
++ { 0x0000, 0 }
++ };
++
+diff -urN vsftpd-2.0.5.org/ftpcmdio.c vsftpd-2.0.5/ftpcmdio.c
+--- vsftpd-2.0.5.org/ftpcmdio.c 2005-03-04 02:42:34.000000000 +0200
++++ vsftpd-2.0.5/ftpcmdio.c 2008-01-13 19:34:50.000000000 +0200
+@@ -19,6 +19,7 @@
+ #include "logging.h"
+ #include "session.h"
+ #include "readwrite.h"
++#include "charconv.h"
+
+ /* Internal functions */
+ static void control_getline(struct mystr* p_str, struct vsf_session* p_sess);
+@@ -125,9 +126,13 @@
+ vsf_log_line(p_sess, kVSFLogEntryFTPOutput, &s_write_buf_str);
+ }
+ str_copy(&s_text_mangle_str, p_str);
++ vsf_charconv_convert(p_sess, &s_text_mangle_str, VSFTP_CONVDIRECT_FORWARD);
+ /* Process the output response according to the specifications.. */
+ /* Escape telnet characters properly */
+- str_replace_text(&s_text_mangle_str, "\377", "\377\377");
++// if (tunable_double_377)
++ {
++ str_replace_text(&s_text_mangle_str, "\377", "\377\377");
++ }
+ /* Change \n for \0 in response */
+ str_replace_char(&s_text_mangle_str, '\n', '\0');
+ /* Build string to squirt down network */
+@@ -213,5 +218,6 @@
+ --len;
+ }
+ }
++ vsf_charconv_convert(p_sess, p_str, VSFTP_CONVDIRECT_BACKWARD);
+ }
+
+diff -urN vsftpd-2.0.5.org/ftpdataio.c vsftpd-2.0.5/ftpdataio.c
+--- vsftpd-2.0.5.org/ftpdataio.c 2005-03-12 04:00:00.000000000 +0200
++++ vsftpd-2.0.5/ftpdataio.c 2008-01-13 19:35:59.000000000 +0200
+@@ -296,7 +296,7 @@
+ {
+ p_subdir_list = &subdir_list;
+ }
+- vsf_ls_populate_dir_list(&dir_list, p_subdir_list, p_dir, p_base_dir_str,
++ vsf_ls_populate_dir_list(p_sess, &dir_list, p_subdir_list, p_dir, p_base_dir_str,
+ p_option_str, p_filter_str, is_verbose);
+ if (p_subdir_list)
+ {
+diff -urN vsftpd-2.0.5.org/ls.c vsftpd-2.0.5/ls.c
+--- vsftpd-2.0.5.org/ls.c 2005-05-24 00:55:00.000000000 +0300
++++ vsftpd-2.0.5/ls.c 2008-01-13 19:32:28.000000000 +0200
+@@ -14,13 +14,16 @@
+ #include "sysstr.h"
+ #include "sysutil.h"
+ #include "tunables.h"
++#include "charconv.h"
+
+-static void build_dir_line(struct mystr* p_str,
++static void build_dir_line(struct vsf_session* p_sess,
++ struct mystr* p_str,
+ const struct mystr* p_filename_str,
+ const struct vsf_sysutil_statbuf* p_stat);
+
+ void
+-vsf_ls_populate_dir_list(struct mystr_list* p_list,
++vsf_ls_populate_dir_list(struct vsf_session* p_sess,
++ struct mystr_list* p_list,
+ struct mystr_list* p_subdir_list,
+ struct vsf_sysutil_dir* p_dir,
+ const struct mystr* p_base_dir_str,
+@@ -157,7 +160,7 @@
+ {
+ str_append_char(&s_final_file_str, '/');
+ }
+- build_dir_line(&dirline_str, &s_final_file_str, s_p_statbuf);
++ build_dir_line(p_sess, &dirline_str, &s_final_file_str, s_p_statbuf);
+ }
+ else
+ {
+@@ -176,6 +179,7 @@
+ str_append_char(&dirline_str, '@');
+ }
+ }
++ vsf_charconv_convert(p_sess, &dirline_str, VSFTP_CONVDIRECT_FORWARD);
+ str_append_text(&dirline_str, "\r\n");
+ }
+ /* Add filename into our sorted list - sorting by filename or time. Also,
+@@ -357,7 +361,7 @@
+ }
+
+ static void
+-build_dir_line(struct mystr* p_str, const struct mystr* p_filename_str,
++build_dir_line(struct vsf_session* p_sess, struct mystr* p_str, const struct mystr* p_filename_str,
+ const struct vsf_sysutil_statbuf* p_stat)
+ {
+ static struct mystr s_tmp_str;
+@@ -431,6 +435,7 @@
+ str_append_char(p_str, ' ');
+ /* Filename */
+ str_append_str(p_str, p_filename_str);
++ vsf_charconv_convert(p_sess, p_str, VSFTP_CONVDIRECT_FORWARD);
+ str_append_text(p_str, "\r\n");
+ }
+
+diff -urN vsftpd-2.0.5.org/ls.h vsftpd-2.0.5/ls.h
+--- vsftpd-2.0.5.org/ls.h 2003-09-15 13:43:40.000000000 +0300
++++ vsftpd-2.0.5/ls.h 2008-01-13 19:32:30.000000000 +0200
+@@ -4,12 +4,14 @@
+ struct mystr;
+ struct mystr_list;
+ struct vsf_sysutil_dir;
++struct vsf_session;
+
+ /* vsf_ls_populate_dir_list()
+ * PURPOSE
+ * Given a directory handle, populate a formatted directory entry list (/bin/ls
+ * format). Also optionally populate a list of subdirectories.
+ * PARAMETERS
++ * p_sess - the current FTP session object
+ * p_list - the string list object for the result list of entries
+ * p_subdir_list - the string list object for the result list of
+ * subdirectories. May be 0 if client is not interested.
+@@ -19,7 +21,8 @@
+ * p_filter_str - the filter string given to LIST/NLST - e.g. "*.mp3"
+ * is_verbose - set to 1 for LIST, 0 for NLST
+ */
+-void vsf_ls_populate_dir_list(struct mystr_list* p_list,
++void vsf_ls_populate_dir_list(struct vsf_session* p_sess,
++ struct mystr_list* p_list,
+ struct mystr_list* p_subdir_list,
+ struct vsf_sysutil_dir* p_dir,
+ const struct mystr* p_base_dir_str,
+diff -urN vsftpd-2.0.5.org/main.c vsftpd-2.0.5/main.c
+--- vsftpd-2.0.5.org/main.c 2006-07-03 15:26:08.000000000 +0300
++++ vsftpd-2.0.5/main.c 2008-01-13 20:51:11.000000000 +0200
+@@ -63,7 +63,9 @@
+ /* Secure connection state */
+ 0, 0, 0, 0, 0, 0, -1, -1,
+ /* Login fails */
+- 0
++ 0,
++ /* Filename charset conv */
++ 0, 0,
+ };
+ int config_specified = 0;
+ const char* p_config_name = VSFTP_DEFAULT_CONFIG;
+@@ -106,6 +108,12 @@
+ }
+ vsf_sysutil_free(p_statbuf);
+ }
++ /* Init local codepage */
++ if (tunable_convert_charset_enable)
++ {
++ tunable_local_codepage = vsf_charconv_codepage(tunable_local_charset);
++ tunable_convert_charset_enable = (tunable_local_codepage) ? 1 : 0;
++ }
+ /* Resolve pasv_address if required */
+ if (tunable_pasv_address && tunable_pasv_addr_resolve)
+ {
+diff -urN vsftpd-2.0.5.org/Makefile vsftpd-2.0.5/Makefile
+--- vsftpd-2.0.5.org/Makefile 2006-07-03 15:25:41.000000000 +0300
++++ vsftpd-2.0.5/Makefile 2008-01-13 19:39:58.000000000 +0200
+@@ -14,7 +14,7 @@
+ banner.o filestr.o parseconf.o secutil.o \
+ ascii.o oneprocess.o twoprocess.o privops.o standalone.o hash.o \
+ tcpwrap.o ipaddrparse.o access.o features.o readwrite.o \
+- ssl.o sysutil.o sysdeputil.o
++ ssl.o sysutil.o sysdeputil.o charconv.o
+
+
+ .c.o:
+diff -urN vsftpd-2.0.5.org/parseconf.c vsftpd-2.0.5/parseconf.c
+--- vsftpd-2.0.5.org/parseconf.c 2006-07-02 02:05:10.000000000 +0300
++++ vsftpd-2.0.5/parseconf.c 2008-01-13 20:21:57.000000000 +0200
+@@ -99,6 +99,7 @@
+ { "mdtm_write", &tunable_mdtm_write },
+ { "lock_upload_files", &tunable_lock_upload_files },
+ { "pasv_addr_resolve", &tunable_pasv_addr_resolve },
++ { "convert_charset_enable", &tunable_convert_charset_enable },
+ { 0, 0 }
+ };
+
+@@ -168,6 +169,8 @@
+ { "ssl_ciphers", &tunable_ssl_ciphers },
+ { "rsa_private_key_file", &tunable_rsa_private_key_file },
+ { "dsa_private_key_file", &tunable_dsa_private_key_file },
++ { "local_charset", &tunable_local_charset },
++ { "remote_charset", &tunable_remote_charset },
+ { 0, 0 }
+ };
+
+diff -urN vsftpd-2.0.5.org/postlogin.c vsftpd-2.0.5/postlogin.c
+--- vsftpd-2.0.5.org/postlogin.c 2006-06-12 01:45:25.000000000 +0300
++++ vsftpd-2.0.5/postlogin.c 2008-01-13 20:58:37.000000000 +0200
+@@ -25,6 +25,7 @@
+ #include "access.h"
+ #include "features.h"
+ #include "ssl.h"
++#include "charconv.h"
+ #include "vsftpver.h"
+
+ /* Private local functions */
+@@ -98,6 +99,17 @@
+ /* Handle any login message */
+ vsf_banner_dir_changed(p_sess, FTP_LOGINOK);
+ vsf_cmdio_write(p_sess, FTP_LOGINOK, "Login successful.");
++ if (tunable_convert_charset_enable)
++ {
++ vsf_charconv_init_local_codepage(tunable_local_codepage);
++ tunable_remote_codepage = vsf_charconv_codepage(tunable_remote_charset);
++ p_sess->remote_charset = tunable_remote_codepage;
++ p_sess->enable_conversion = vsf_charconv_avail_convertion(tunable_local_codepage, p_sess->remote_charset);
++ }
++ else
++ {
++ p_sess->enable_conversion = 0;
++ }
+ while(1)
+ {
+ int cmd_ok = 1;
+diff -urN vsftpd-2.0.5.org/session.h vsftpd-2.0.5/session.h
+--- vsftpd-2.0.5.org/session.h 2006-07-02 03:34:48.000000000 +0300
++++ vsftpd-2.0.5/session.h 2008-01-13 20:39:41.000000000 +0200
+@@ -91,6 +91,10 @@
+ int ssl_slave_fd;
+ int ssl_consumer_fd;
+ unsigned int login_fails;
++
++ /* Filename charset conv */
++ int enable_conversion;
++ int remote_charset;
+ };
+
+ #endif /* VSF_SESSION_H */
+diff -urN vsftpd-2.0.5.org/tunables.c vsftpd-2.0.5/tunables.c
+--- vsftpd-2.0.5.org/tunables.c 2006-07-02 02:06:56.000000000 +0300
++++ vsftpd-2.0.5/tunables.c 2008-01-13 20:24:57.000000000 +0200
+@@ -71,6 +71,9 @@
+ int tunable_mdtm_write = 1;
+ int tunable_lock_upload_files = 1;
+ int tunable_pasv_addr_resolve = 0;
++int tunable_convert_charset_enable = 0;
++int tunable_local_codepage = 0;
++int tunable_remote_codepage = 0;
+
+ unsigned int tunable_accept_timeout = 60;
+ unsigned int tunable_connect_timeout = 60;
+@@ -125,4 +128,6 @@
+ const char* tunable_ssl_ciphers = "DES-CBC3-SHA";
+ const char* tunable_rsa_private_key_file = 0;
+ const char* tunable_dsa_private_key_file = 0;
++const char* tunable_local_charset = "NONE";
++const char* tunable_remote_charset = "NONE";
+
+diff -urN vsftpd-2.0.5.org/tunables.h vsftpd-2.0.5/tunables.h
+--- vsftpd-2.0.5.org/tunables.h 2006-07-02 02:07:00.000000000 +0300
++++ vsftpd-2.0.5/tunables.h 2008-01-13 20:28:11.000000000 +0200
+@@ -67,6 +67,9 @@
+ extern int tunable_mdtm_write; /* Allow MDTM to set timestamps */
+ extern int tunable_lock_upload_files; /* Lock uploading files */
+ extern int tunable_pasv_addr_resolve; /* DNS resolve pasv_addr */
++extern int tunable_convert_charset_enable; /* Allow converting charsets for file names */
++extern int tunable_local_codepage; /* Code of local charset */
++extern int tunable_remote_codepage; /* Code of remote charset */
+
+ /* Integer/numeric defines */
+ extern unsigned int tunable_accept_timeout;
+@@ -120,6 +123,8 @@
+ extern const char* tunable_ssl_ciphers;
+ extern const char* tunable_rsa_private_key_file;
+ extern const char* tunable_dsa_private_key_file;
++extern const char* tunable_local_charset;
++extern const char* tunable_remote_charset;
+
+ #endif /* VSF_TUNABLES_H */
+
diff --git a/packages/vsftpd/vsftpd-charconv_2.0.5.bb b/packages/vsftpd/vsftpd-charconv_2.0.5.bb
new file mode 100644
index 0000000000..cc559c6259
--- /dev/null
+++ b/packages/vsftpd/vsftpd-charconv_2.0.5.bb
@@ -0,0 +1,50 @@
+DESCRIPTION = "Secure ftp daemon with filename charconv"
+SECTION = "console/network"
+LICENSE = "GPL"
+PR = "r1"
+
+FILESPATH_append = ":${@os.path.dirname(bb.data.getVar('FILE',d,1))}/vsftpd-2.0.5"
+
+SRC_URI = "ftp://vsftpd.beasts.org/users/cevans/vsftpd-${PV}.tar.gz \
+ file://vsftpd-charconv.patch;patch=1 \
+ file://makefile.patch;patch=1 \
+ file://nopam.patch;patch=1 \
+ file://syscall.patch;patch=1 \
+ file://init \
+ file://vsftpd.conf"
+
+S = "${WORKDIR}/vsftpd-2.0.5"
+
+inherit update-rc.d
+
+do_configure() {
+ # Fix hardcoded /usr, /etc, /var mess.
+ cat tunables.c|sed s:\"/usr:\"${prefix}:g|sed s:\"/var:\"${localstatedir}:g \
+ |sed s:\"${prefix}/share/empty:\"${localstatedir}/share/empty:g |sed s:\"/etc:\"${sysconfdir}:g > tunables.c.new
+ mv tunables.c.new tunables.c
+}
+
+do_compile() {
+ oe_runmake "LIBS=-lcrypt -L${STAGING_LIBDIR}"
+}
+
+do_install() {
+ install -d ${D}${sbindir}
+ install -d ${D}${mandir}/man8
+ install -d ${D}${mandir}/man5
+ oe_runmake 'DESTDIR=${D}' install
+ install -d ${D}${sysconfdir}
+ install -m 0755 ${WORKDIR}/vsftpd.conf ${D}${sysconfdir}/vsftpd.conf
+ install -d ${D}${sysconfdir}/init.d/
+ install -m 755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/vsftpd
+}
+
+pkg_postinst() {
+ addgroup ftp
+ adduser --system --home /var/tmp/ftp --no-create-home --ingroup ftp --disabled-password -s /bin/false ftp
+ mkdir -p ${localstatedir}/share/empty
+}
+
+INITSCRIPT_NAME = "vsftpd"
+
+INITSCRIPT_PARAMS = "defaults"