diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2007-12-13 22:46:33 +0100 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2007-12-21 05:50:04 +0100 |
commit | 2bf0cdd01cf399bf28125f9e2a0d419f4e94996c (patch) | |
tree | 3ec09d2f58be46c1f2a5a4a73a46100879e84aa4 /source4/lib/util | |
parent | 83f9ee5860e581fda07932e0fda1326fa3bd4d4c (diff) | |
download | samba-2bf0cdd01cf399bf28125f9e2a0d419f4e94996c.tar.gz samba-2bf0cdd01cf399bf28125f9e2a0d419f4e94996c.tar.bz2 samba-2bf0cdd01cf399bf28125f9e2a0d419f4e94996c.zip |
r26434: Remove display charset from iconv convenience context.
(This used to be commit a76625994abf9906d54ae11f9c171f89063cf508)
Diffstat (limited to 'source4/lib/util')
-rw-r--r-- | source4/lib/util/dprintf.c | 38 | ||||
-rw-r--r-- | source4/lib/util/util.h | 1 |
2 files changed, 18 insertions, 21 deletions
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); |