1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-12 09:18:10 +03:00

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 1e445fb422)
This commit is contained in:
John Terpstra 2003-06-15 06:07:53 +00:00
parent 5d4937c2b6
commit 489956c823
3 changed files with 47 additions and 0 deletions

View File

@ -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)

View File

@ -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

View File

@ -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",