summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Terpstra <jht@samba.org>2003-06-15 06:07:53 +0000
committerJohn Terpstra <jht@samba.org>2003-06-15 06:07:53 +0000
commit489956c82391d7559bb097b112957e6a7d91934c (patch)
treeac9dd17331cdf513de4fd98fcc165536b658963d
parent5d4937c2b6e5b01fd13bc197224459ab690897e9 (diff)
downloadsamba-489956c82391d7559bb097b112957e6a7d91934c.tar.gz
samba-489956c82391d7559bb097b112957e6a7d91934c.tar.bz2
samba-489956c82391d7559bb097b112957e6a7d91934c.zip
Patch from vorlon@debian.org, see bugzilal #122
Samba should preferentially use the locale information from the native system, and only fall back on 'display charset' if this is unavailable or unsupported. (This used to be commit 1e445fb4220cdf4700dd9d1850a42746a1065c5a)
-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",