diff options
author | Garming Sam <garming@catalyst.net.nz> | 2014-02-20 16:37:16 +1300 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2014-05-07 19:49:16 +0200 |
commit | e547e83fd3f883db1f929572bb1a19a915415de8 (patch) | |
tree | f42049cef2e528a412030423614d0981b983ad09 /lib/param/loadparm.c | |
parent | 58e8163be545850f6517c807d4b90cb51ea1f98c (diff) | |
download | samba-e547e83fd3f883db1f929572bb1a19a915415de8.tar.gz samba-e547e83fd3f883db1f929572bb1a19a915415de8.tar.xz samba-e547e83fd3f883db1f929572bb1a19a915415de8.zip |
param: move special charset handlers to lib/param
Signed-off-by: Garming Sam <garming@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'lib/param/loadparm.c')
-rw-r--r-- | lib/param/loadparm.c | 71 |
1 files changed, 67 insertions, 4 deletions
diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c index d2c9d0015f9..5598e259f98 100644 --- a/lib/param/loadparm.c +++ b/lib/param/loadparm.c @@ -77,10 +77,6 @@ static bool defaults_saved = false; #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct)) -/* we don't need a special handler for "dos charset" and "unix charset" */ -#define handle_dos_charset NULL -#define handle_charset NULL - /* these are parameter handlers which are not needed in the * non-source3 code */ @@ -1198,6 +1194,73 @@ bool handle_logfile(struct loadparm_context *lp_ctx, int unused, return true; } +/* + * These special charset handling methods only run in the source3 code. + */ + +bool handle_charset(struct loadparm_context *lp_ctx, int snum, + const char *pszParmValue, char **ptr) +{ + if (lp_ctx->s3_fns) { + if (*ptr == NULL || strcmp(*ptr, pszParmValue) != 0) { + lp_ctx->s3_fns->lp_string_set(ptr, pszParmValue); + global_iconv_handle = smb_iconv_handle_reinit(NULL, + lpcfg_dos_charset(lp_ctx), + lpcfg_unix_charset(lp_ctx), + true, global_iconv_handle); + } + + return true; + } + return lpcfg_string_set(lp_ctx, ptr, pszParmValue); + +} + +bool handle_dos_charset(struct loadparm_context *lp_ctx, int snum, + const char *pszParmValue, char **ptr) +{ + bool is_utf8 = false; + size_t len = strlen(pszParmValue); + + if (lp_ctx->s3_fns) { + if (len == 4 || len == 5) { + /* Don't use StrCaseCmp here as we don't want to + initialize iconv. */ + if ((toupper_m(pszParmValue[0]) == 'U') && + (toupper_m(pszParmValue[1]) == 'T') && + (toupper_m(pszParmValue[2]) == 'F')) { + if (len == 4) { + if (pszParmValue[3] == '8') { + is_utf8 = true; + } + } else { + if (pszParmValue[3] == '-' && + pszParmValue[4] == '8') { + is_utf8 = true; + } + } + } + } + + if (*ptr == NULL || strcmp(*ptr, pszParmValue) != 0) { + if (is_utf8) { + DEBUG(0,("ERROR: invalid DOS charset: 'dos charset' must not " + "be UTF8, using (default value) %s instead.\n", + DEFAULT_DOS_CHARSET)); + pszParmValue = DEFAULT_DOS_CHARSET; + } + lp_ctx->s3_fns->lp_string_set(ptr, pszParmValue); + global_iconv_handle = smb_iconv_handle_reinit(NULL, + lpcfg_dos_charset(lp_ctx), + lpcfg_unix_charset(lp_ctx), + true, global_iconv_handle); + } + return true; + } + + return lpcfg_string_set(lp_ctx, ptr, pszParmValue); +} + /*************************************************************************** Initialise a copymap. ***************************************************************************/ |