summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
Diffstat (limited to 'source4')
-rw-r--r--source4/lib/charset/charcnv.c4
-rw-r--r--source4/lib/charset/charset.h4
-rw-r--r--source4/lib/util/dprintf.c38
-rw-r--r--source4/lib/util/util.h1
-rw-r--r--source4/param/loadparm.c8
-rw-r--r--source4/param/util.c1
6 files changed, 27 insertions, 29 deletions
diff --git a/source4/lib/charset/charcnv.c b/source4/lib/charset/charcnv.c
index 5100a1b016..9a4068a4a9 100644
--- a/source4/lib/charset/charcnv.c
+++ b/source4/lib/charset/charcnv.c
@@ -42,7 +42,6 @@
struct smb_iconv_convenience {
const char *unix_charset;
const char *dos_charset;
- const char *display_charset;
bool native_iconv;
smb_iconv_t conv_handles[NUM_CHARSETS][NUM_CHARSETS];
};
@@ -57,7 +56,6 @@ static const char *charset_name(struct smb_iconv_convenience *ic, charset_t ch)
case CH_UTF16: return "UTF-16LE";
case CH_UNIX: return ic->unix_charset;
case CH_DOS: return ic->dos_charset;
- case CH_DISPLAY: return ic->display_charset;
case CH_UTF8: return "UTF8";
case CH_UTF16BE: return "UTF-16BE";
default:
@@ -88,7 +86,6 @@ static int close_iconv(struct smb_iconv_convenience *data)
struct smb_iconv_convenience *smb_iconv_convenience_init(TALLOC_CTX *mem_ctx,
const char *dos_charset,
const char *unix_charset,
- const char *display_charset,
bool native_iconv)
{
struct smb_iconv_convenience *ret = talloc_zero(mem_ctx,
@@ -102,7 +99,6 @@ struct smb_iconv_convenience *smb_iconv_convenience_init(TALLOC_CTX *mem_ctx,
ret->dos_charset = talloc_strdup(ret, dos_charset);
ret->unix_charset = talloc_strdup(ret, unix_charset);
- ret->display_charset = talloc_strdup(ret, display_charset);
ret->native_iconv = native_iconv;
return ret;
diff --git a/source4/lib/charset/charset.h b/source4/lib/charset/charset.h
index b1bb18a7c8..1d42a0ad91 100644
--- a/source4/lib/charset/charset.h
+++ b/source4/lib/charset/charset.h
@@ -24,9 +24,9 @@
#include <talloc.h>
/* this defines the charset types used in samba */
-typedef enum {CH_UTF16=0, CH_UNIX=1, CH_DISPLAY=2, CH_DOS=3, CH_UTF8=4, CH_UTF16BE=5} charset_t;
+typedef enum {CH_UTF16=0, CH_UNIX, CH_DOS, CH_UTF8, CH_UTF16BE} charset_t;
-#define NUM_CHARSETS 6
+#define NUM_CHARSETS 5
/*
* for each charset we have a function that pulls from that charset to
diff --git a/source4/lib/util/dprintf.c b/source4/lib/util/dprintf.c
index ae2b7bb4d5..308d81b105 100644
--- a/source4/lib/util/dprintf.c
+++ b/source4/lib/util/dprintf.c
@@ -2,6 +2,7 @@
Unix SMB/CIFS implementation.
display print functions
Copyright (C) Andrew Tridgell 2001
+ Copyright (C) Jelmer Vernooij 2007
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -34,12 +35,24 @@
#include "system/locale.h"
#include "param/param.h"
+static smb_iconv_t display_cd = (smb_iconv_t)-1;
+
+void d_set_iconv(smb_iconv_t cd)
+{
+ display_cd = cd;
+}
+
_PUBLIC_ int d_vfprintf(FILE *f, const char *format, va_list ap) _PRINTF_ATTRIBUTE(2,0)
{
char *p, *p2;
- int ret, maxlen, clen;
+ int ret, clen;
va_list ap2;
+ /* If there's nothing to convert, take a shortcut */
+ if (display_cd == (smb_iconv_t)-1) {
+ return vfprintf(f, format, ap);
+ }
+
/* do any message translations */
va_copy(ap2, ap);
ret = vasprintf(&p, format, ap2);
@@ -47,16 +60,7 @@ _PUBLIC_ int d_vfprintf(FILE *f, const char *format, va_list ap) _PRINTF_ATTRIBU
if (ret <= 0) return ret;
- /* now we have the string in unix format, convert it to the display
- charset, but beware of it growing */
- maxlen = ret*2;
-again:
- p2 = (char *)malloc(maxlen);
- if (!p2) {
- SAFE_FREE(p);
- return -1;
- }
- clen = convert_string(lp_iconv_convenience(global_loadparm), CH_UNIX, CH_DISPLAY, p, ret, p2, maxlen);
+ clen = convert_string_talloc_descriptor(NULL, display_cd, p, ret, (void **)&p2);
if (clen == -1) {
/* the string can't be converted - do the best we can,
filling in non-printing chars with '?' */
@@ -69,22 +73,13 @@ again:
}
}
SAFE_FREE(p);
- SAFE_FREE(p2);
return ret;
}
-
- if (clen >= maxlen) {
- /* it didn't fit - try a larger buffer */
- maxlen *= 2;
- SAFE_FREE(p2);
- goto again;
- }
-
/* good, its converted OK */
SAFE_FREE(p);
ret = fwrite(p2, 1, clen, f);
- SAFE_FREE(p2);
+ talloc_free(p2);
return ret;
}
@@ -113,3 +108,4 @@ _PUBLIC_ int d_printf(const char *format, ...) _PRINTF_ATTRIBUTE(1,2)
return ret;
}
+
diff --git a/source4/lib/util/util.h b/source4/lib/util/util.h
index f3adbb3333..9e106052f2 100644
--- a/source4/lib/util/util.h
+++ b/source4/lib/util/util.h
@@ -262,6 +262,7 @@ _PUBLIC_ char *generate_random_str(TALLOC_CTX *mem_ctx, size_t len);
/* The following definitions come from lib/util/dprintf.c */
+_PUBLIC_ void d_set_iconv(smb_iconv_t);
_PUBLIC_ int d_vfprintf(FILE *f, const char *format, va_list ap) PRINTF_ATTRIBUTE(2,0);
_PUBLIC_ int d_fprintf(FILE *f, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
_PUBLIC_ int d_printf(const char *format, ...) PRINTF_ATTRIBUTE(1,2);
diff --git a/source4/param/loadparm.c b/source4/param/loadparm.c
index 2b1937de05..982c186ae9 100644
--- a/source4/param/loadparm.c
+++ b/source4/param/loadparm.c
@@ -2464,6 +2464,12 @@ bool lp_load(struct loadparm_context *lp_ctx, const char *filename)
reload_charcnv(lp_ctx);
+ /* FIXME: Check locale in environment for this: */
+ if (strcmp(lp_display_charset(lp_ctx), lp_unix_charset(lp_ctx)) != 0)
+ d_set_iconv(smb_iconv_open(lp_display_charset(lp_ctx), lp_unix_charset(lp_ctx), true));
+ else
+ d_set_iconv((smb_iconv_t)-1);
+
return bRetval;
}
@@ -2581,7 +2587,7 @@ struct smb_iconv_convenience *lp_iconv_convenience(struct loadparm_context *lp_c
{
if (lp_ctx == NULL) {
return smb_iconv_convenience_init(talloc_autofree_context(),
- "CP850", "UTF8", "UTF8", true);
+ "CP850", "UTF8", true);
}
return lp_ctx->iconv_convenience;
}
diff --git a/source4/param/util.c b/source4/param/util.c
index 48ddbfdca0..4d4e562590 100644
--- a/source4/param/util.c
+++ b/source4/param/util.c
@@ -288,7 +288,6 @@ struct smb_iconv_convenience *smb_iconv_convenience_init_lp(TALLOC_CTX *mem_ctx,
{
return smb_iconv_convenience_init(mem_ctx, lp_dos_charset(lp_ctx),
lp_unix_charset(lp_ctx),
- lp_display_charset(lp_ctx),
lp_parm_bool(lp_ctx, NULL, "iconv", "native", true));
}