r26434: Remove display charset from iconv convenience context.
authorJelmer Vernooij <jelmer@samba.org>
Thu, 13 Dec 2007 21:46:33 +0000 (22:46 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 21 Dec 2007 04:50:04 +0000 (05:50 +0100)
source/lib/charset/charcnv.c
source/lib/charset/charset.h
source/lib/util/dprintf.c
source/lib/util/util.h
source/param/loadparm.c
source/param/util.c

index 5100a1b01619e4ee72ecd8a180f01a3cc312a2ff..9a4068a4a9899b7fea8f73a2e3e2c4b6c6113695 100644 (file)
@@ -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;
index b1bb18a7c8d2c0da1564000c7246e61f4e8564b3..1d42a0ad91cd59a93623df1566560d0f8d626da3 100644 (file)
@@ -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
index ae2b7bb4d5f40540376f5ecb9db61fd490776ecf..308d81b105bdd4fe11c2f00c46d4e5a8b00214e2 100644 (file)
@@ -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
 #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;
 }
+
index f3adbb33338c8e8f920a6821b09aeba5861710fb..9e106052f24f3b8eb493f094dd20c0c214945920 100644 (file)
@@ -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);
index 2b1937de05b0f39ebdab55dadcdce17927720f41..982c186ae9d7f40937e4efb0a3dc07cf1f6bf3d9 100644 (file)
@@ -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;
 }
index 48ddbfdca0b3ddf53385120864d189d5ea0c217e..4d4e5625907e49882b1bac3dfafea9faf00e7421 100644 (file)
@@ -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));
 }