diff options
Diffstat (limited to 'source3/lib/charcnv.c')
-rw-r--r-- | source3/lib/charcnv.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/source3/lib/charcnv.c b/source3/lib/charcnv.c index 708ef343e1..b37f468134 100644 --- a/source3/lib/charcnv.c +++ b/source3/lib/charcnv.c @@ -90,10 +90,28 @@ void init_iconv(void) if (!conv_handles[CH_UCS2][CH_UNIX]) conv_handles[CH_UCS2][CH_UNIX] = smb_iconv_open("ASCII", "UCS-2LE"); +#ifdef HAVE_SETLOCALE + setlocale(LC_ALL, ""); +#endif + for (c1=0;c1<NUM_CHARSETS;c1++) { for (c2=0;c2<NUM_CHARSETS;c2++) { const char *n1 = charset_name((charset_t)c1); const char *n2 = charset_name((charset_t)c2); +#ifdef HAVE_NL_LANGINFO + const char *ln = nl_langinfo(CODESET); + + if (c1==CH_DISPLAY && conv_handles[c1][c2] && + strcmp(ln, conv_handles[c1][c2]->from_name) == 0 && + strcmp(n2, conv_handles[c1][c2]->to_name) == 0) + continue; + + if (c2==CH_DISPLAY && conv_handles[c1][c2] && + strcmp(n1, conv_handles[c1][c2]->from_name) == 0 && + strcmp(ln, conv_handles[c1][c2]->to_name) == 0) + continue; + +#endif if (conv_handles[c1][c2] && strcmp(n1, conv_handles[c1][c2]->from_name) == 0 && strcmp(n2, conv_handles[c1][c2]->to_name) == 0) @@ -104,6 +122,25 @@ void init_iconv(void) if (conv_handles[c1][c2]) smb_iconv_close(conv_handles[c1][c2]); +#ifdef HAVE_NL_LANGINFO + if (c1==CH_DISPLAY && c2==CH_DISPLAY) { + conv_handles[c1][c2] = smb_iconv_open(ln,ln); + if (conv_handles[c1][c2] != (smb_iconv_t)-1) { + continue; + } + } else if (c1==CH_DISPLAY) { + conv_handles[c1][c2] = smb_iconv_open(n2,ln); + if (conv_handles[c1][c2] != (smb_iconv_t)-1) { + continue; + } + } else if (c2==CH_DISPLAY) { + conv_handles[c1][c2] = smb_iconv_open(ln,n1); + if (conv_handles[c1][c2] != (smb_iconv_t)-1) { + continue; + } + } + /* Fall back to the configured charset. */ +#endif conv_handles[c1][c2] = smb_iconv_open(n2,n1); if (conv_handles[c1][c2] == (smb_iconv_t)-1) { DEBUG(0,("Conversion from %s to %s not supported\n", |