summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/configure.in2
-rw-r--r--source3/include/includes.h8
-rw-r--r--source3/lib/charcnv.c37
3 files changed, 47 insertions, 0 deletions
diff --git a/source3/configure.in b/source3/configure.in
index c81712da5c..7a116b60ab 100644
--- a/source3/configure.in
+++ b/source3/configure.in
@@ -529,6 +529,7 @@ AC_CHECK_HEADERS(sys/mount.h sys/vfs.h sys/fs/s5param.h sys/filsys.h termios.h t
AC_CHECK_HEADERS(sys/termio.h sys/statfs.h sys/dustat.h sys/statvfs.h stdarg.h sys/sockio.h)
AC_CHECK_HEADERS(security/pam_modules.h security/_pam_macros.h dlfcn.h)
AC_CHECK_HEADERS(sys/syslog.h syslog.h execinfo.h)
+AC_CHECK_HEADERS(langinfo.h locale.h)
# In valgrind 1.0.x, it's just valgrind.h. In 1.9.x+ there's a
# subdirectory of headers.
@@ -843,6 +844,7 @@ AC_CHECK_FUNCS(lstat64 fopen64 atexit grantpt dup2 lseek64 ftruncate64 readdir64
AC_CHECK_FUNCS(fseek64 fseeko64 ftell64 ftello64 setluid getpwanam setlinebuf)
AC_CHECK_FUNCS(srandom random srand rand setenv usleep strcasecmp fcvt fcvtl symlink readlink)
AC_CHECK_FUNCS(syslog vsyslog getgrouplist timegm)
+AC_CHECK_FUNCS(setlocale nl_langinfo)
# setbuffer, shmget, shm_open are needed for smbtorture
AC_CHECK_FUNCS(setbuffer shmget shm_open backtrace_symbols)
diff --git a/source3/include/includes.h b/source3/include/includes.h
index 3dbe6d1093..edaeda3abe 100644
--- a/source3/include/includes.h
+++ b/source3/include/includes.h
@@ -441,6 +441,14 @@
#include <attr/xattr.h>
#endif
+#if HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+#if HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
+
/* Special macros that are no-ops except when run under Valgrind on
* x86. They've moved a little bit from valgrind 1.0.4 to 1.9.4 */
#if HAVE_VALGRIND_MEMCHECK_H
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",