From 1452c2d8c4a2124e4c97bb51a1e58bcfda620ef0 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 26 Mar 2001 23:13:02 +0000 Subject: Fix from Ryo Kawahara to make SWAT correctly write and smb.conf file in utf8. Jeremy. (This used to be commit 42052d6079479452aa43eb37ad3d679d28337779) --- source3/include/kanji.h | 2 ++ source3/include/proto.h | 5 +++-- source3/lib/kanji.c | 16 ++++++++++++++++ source3/param/loadparm.c | 38 +++++++++++++++++++++++--------------- source3/utils/testparm.c | 14 ++++++++++++-- source3/web/swat.c | 26 +++++++++++++++++++------- 6 files changed, 75 insertions(+), 26 deletions(-) diff --git a/source3/include/kanji.h b/source3/include/kanji.h index f5e198c2ee..58774a699d 100644 --- a/source3/include/kanji.h +++ b/source3/include/kanji.h @@ -166,6 +166,7 @@ extern char *(*multibyte_strstr)(const char *s1, const char *s2); extern char *(*multibyte_strtok)(char *s1, const char *s2); extern char *(*_dos_to_unix)(char *str, BOOL overwrite); extern char *(*_unix_to_dos)(char *str, BOOL overwrite); +extern char *(*_dos_to_dos)(char *str, BOOL overwrite); extern BOOL (*is_multibyte_char)(char c); extern int (*_skip_multibyte_char)(char c); @@ -175,6 +176,7 @@ extern int (*_skip_multibyte_char)(char c); #define strtok(s1, s2) ((*multibyte_strtok)((s1), (s2))) #define dos_to_unix(x,y) ((*_dos_to_unix)((x), (y))) #define unix_to_dos(x,y) ((*_unix_to_dos)((x), (y))) +#define dos_to_dos(x,y) ((*_dos_to_dos)((x), (y))) #define skip_multibyte_char(c) ((*_skip_multibyte_char)((c))) #endif /* _KANJI_C_ */ diff --git a/source3/include/proto.h b/source3/include/proto.h index 4fb816d70d..e2d31fa19a 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -366,6 +366,7 @@ int sys_dlclose (void *handle); TALLOC_CTX *talloc_init(void); void *talloc(TALLOC_CTX *t, size_t size); +void *talloc_realloc(TALLOC_CTX *t, void *ptr, size_t size); void talloc_destroy_pool(TALLOC_CTX *t); void talloc_destroy(TALLOC_CTX *t); size_t talloc_pool_size(TALLOC_CTX *t); @@ -1820,8 +1821,8 @@ BOOL lp_load(char *pszFname, BOOL global_only, BOOL save_defaults, BOOL add_ipc); void lp_resetnumservices(void); int lp_numservices(void); -void lp_dump(FILE * f, BOOL show_defaults, int maxtoprint); -void lp_dump_one(FILE * f, BOOL show_defaults, int snum); +void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint, char *(*dos_to_ext)(char *, BOOL)); +void lp_dump_one(FILE * f, BOOL show_defaults, int snum, char *(*dos_to_ext)(char *, BOOL)); int lp_servicenumber(char *pszServiceName); char *volume_label(int snum); int lp_server_role(void); diff --git a/source3/lib/kanji.c b/source3/lib/kanji.c index 294b6a623a..39e9933842 100644 --- a/source3/lib/kanji.c +++ b/source3/lib/kanji.c @@ -1673,3 +1673,19 @@ void initialize_multibyte_vectors( int client_codepage) break; } } +/* ******************************************************* + function(s) for "dynamic" encoding of SWAT output. + in this version, only dos_to_dos, dos_to_unix, unix_to_dos + are used for bug fix. conversion to web encoding + (to catalog file encoding) is not needed because + they are using same character codes. + **************************************************** */ +static char *no_conversion(char *str, BOOL bOverwrite) +{ + static pstring temp; + if(bOverwrite) + return str; + pstrcpy(temp, str); + return temp; +} +char *(*_dos_to_dos)(char *, BOOL) = no_conversion; diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index d35ca97292..bec5f03cd8 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -2694,7 +2694,7 @@ static BOOL do_parameter(char *pszParmName, char *pszParmValue) /*************************************************************************** print a parameter of the specified type ***************************************************************************/ -static void print_parameter(struct parm_struct *p, void *ptr, FILE * f) +static void print_parameter(struct parm_struct *p, void *ptr, FILE * f, char *(*dos_to_ext)(char *, BOOL)) { int i; switch (p->type) @@ -2733,14 +2733,22 @@ static void print_parameter(struct parm_struct *p, void *ptr, FILE * f) case P_GSTRING: case P_UGSTRING: - if ((char *)ptr) - fprintf(f, "%s", (char *)ptr); + if ((char *)ptr) { + if (p->flags & FLAG_DOS_STRING) + fprintf(f, "%s", dos_to_ext((char *)ptr, False)); + else + fprintf(f, "%s", (char *)ptr); + } break; case P_STRING: case P_USTRING: - if (*(char **)ptr) - fprintf(f, "%s", *(char **)ptr); + if (*(char **)ptr) { + if(p->flags & FLAG_DOS_STRING) + fprintf(f,"%s",dos_to_ext(*(char **)ptr, False)); + else + fprintf(f, "%s", *(char **)ptr); + } break; case P_SEP: break; @@ -2895,7 +2903,7 @@ static BOOL is_default(int i) /*************************************************************************** Display the contents of the global structure. ***************************************************************************/ -static void dump_globals(FILE * f) +static void dump_globals(FILE *f, char *(*dos_to_ext)(char *, BOOL)) { int i; fprintf(f, "# Global parameters\n[global]\n"); @@ -2908,7 +2916,7 @@ static void dump_globals(FILE * f) if (defaults_saved && is_default(i)) continue; fprintf(f, "\t%s = ", parm_table[i].label); - print_parameter(&parm_table[i], parm_table[i].ptr, f); + print_parameter(&parm_table[i], parm_table[i].ptr, f, dos_to_ext); fprintf(f, "\n"); } } @@ -2929,7 +2937,7 @@ BOOL lp_is_default(int snum, struct parm_struct *parm) /*************************************************************************** Display the contents of a single services record. ***************************************************************************/ -static void dump_a_service(service * pService, FILE * f) +static void dump_a_service(service * pService, FILE * f, char *(*dos_to_ext)(char *, BOOL)) { int i; if (pService != &sDefault) @@ -2960,7 +2968,7 @@ static void dump_a_service(service * pService, FILE * f) fprintf(f, "\t%s = ", parm_table[i].label); print_parameter(&parm_table[i], - ((char *)pService) + pdiff, f); + ((char *)pService) + pdiff, f, dos_to_ext); fprintf(f, "\n"); } } @@ -3330,7 +3338,7 @@ int lp_numservices(void) /*************************************************************************** Display the contents of the services array in human-readable form. ***************************************************************************/ -void lp_dump(FILE * f, BOOL show_defaults, int maxtoprint) +void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint, char *(*dos_to_ext)(char *, BOOL)) { int iService; @@ -3339,24 +3347,24 @@ void lp_dump(FILE * f, BOOL show_defaults, int maxtoprint) defaults_saved = False; } - dump_globals(f); + dump_globals(f, dos_to_ext); - dump_a_service(&sDefault, f); + dump_a_service(&sDefault, f, dos_to_ext); for (iService = 0; iService < maxtoprint; iService++) - lp_dump_one(f, show_defaults, iService); + lp_dump_one(f, show_defaults, iService, dos_to_ext); } /*************************************************************************** Display the contents of one service in human-readable form. ***************************************************************************/ -void lp_dump_one(FILE * f, BOOL show_defaults, int snum) +void lp_dump_one(FILE * f, BOOL show_defaults, int snum, char *(*dos_to_ext)(char *, BOOL)) { if (VALID(snum)) { if (iSERVICE(snum).szService[0] == '\0') return; - dump_a_service(pSERVICE(snum), f); + dump_a_service(pSERVICE(snum), f, dos_to_ext); } } diff --git a/source3/utils/testparm.c b/source3/utils/testparm.c index dcf114bc91..20f36fcffe 100644 --- a/source3/utils/testparm.c +++ b/source3/utils/testparm.c @@ -146,6 +146,7 @@ static void usage(char *pname) printf("\t-s Suppress prompt for enter\n"); printf("\t-h Print usage\n"); printf("\t-L servername Set %%L macro to servername\n"); + printf("\t-t encoding Print parameters with encoding\n"); printf("\tconfigfilename Configuration file to test\n"); printf("\thostname hostIP. Hostname and Host IP address to test\n"); printf("\t against \"host allow\" and \"host deny\"\n"); @@ -163,6 +164,9 @@ int main(int argc, char *argv[]) int s; BOOL silent_mode = False; int ret = 0; + pstring term_code; + + *term_code = 0; TimeInit(); @@ -170,7 +174,7 @@ int main(int argc, char *argv[]) charset_initialise(); - while ((opt = getopt(argc, argv,"shL:")) != EOF) { + while ((opt = getopt(argc, argv,"shL:t:")) != EOF) { switch (opt) { case 's': silent_mode = True; @@ -182,6 +186,9 @@ int main(int argc, char *argv[]) usage(argv[0]); exit(0); break; + case 't': + pstrcpy(term_code,optarg); + break; default: printf("Incorrect program usage\n"); usage(argv[0]); @@ -250,13 +257,16 @@ Level II oplocks can only be set if oplocks are also set.\n", } } + if (*term_code) + interpret_coding_system(term_code); + if (argc < 3) { if (!silent_mode) { printf("Press enter to see a dump of your service definitions\n"); fflush(stdout); getc(stdin); } - lp_dump(stdout,True, lp_numservices()); + lp_dump(stdout,True, lp_numservices(), _dos_to_unix); } if (argc >= 3) { diff --git a/source3/web/swat.c b/source3/web/swat.c index 1e8d23f6e3..9817327618 100644 --- a/source3/web/swat.c +++ b/source3/web/swat.c @@ -326,13 +326,13 @@ static BOOL load_config(BOOL save_def) /**************************************************************************** write a config file ****************************************************************************/ -static void write_config(FILE *f, BOOL show_defaults) +static void write_config(FILE *f, BOOL show_defaults, char *(*dos_to_ext)(char *, BOOL)) { fprintf(f, "# Samba config file created using SWAT\n"); fprintf(f, "# from %s (%s)\n", cgi_remote_host(), cgi_remote_addr()); fprintf(f, "# Date: %s\n\n", timestring(False)); - lp_dump(f, show_defaults, iNumNonAutoPrintServices); + lp_dump(f, show_defaults, iNumNonAutoPrintServices, dos_to_ext); } /**************************************************************************** @@ -348,9 +348,9 @@ static int save_reload(int snum) return 0; } - write_config(f, False); + write_config(f, False, _dos_to_unix); if (snum) - lp_dump_one(f, False, snum); + lp_dump_one(f, False, snum, _dos_to_unix); fclose(f); lp_killunused(NULL); @@ -373,6 +373,10 @@ static void commit_parameter(int snum, struct parm_struct *parm, char *v) int i; char *s; + /* lp_do_parameter() will do unix_to_dos(v). */ + if(parm->flags & FLAG_DOS_STRING) + dos_to_unix(v, True); + if (snum < 0 && parm->class == P_LOCAL) { /* this handles the case where we are changing a local variable globally. We need to change the parameter in @@ -472,7 +476,7 @@ static void viewconfig_page(void) } printf("

");
-	write_config(stdout, full_view);
+	write_config(stdout, full_view, _dos_to_dos);
 	printf("
"); printf("\n"); } @@ -552,8 +556,12 @@ static void shares_page(void) } if (cgi_variable("createshare") && (share=cgi_variable("newshare"))) { + /* add_a_service() which is called by lp_copy_service() + will do unix_to_dos() conversion, so we need dos_to_unix() before the lp_copy_service(). */ + pstring unix_share; + pstrcpy(unix_share, dos_to_unix(share, False)); load_config(False); - lp_copy_service(GLOBALS_SNUM, share); + lp_copy_service(GLOBALS_SNUM, unix_share); iNumNonAutoPrintServices = lp_numservices(); save_reload(0); snum = lp_servicenumber(share); @@ -887,8 +895,12 @@ static void printers_page(void) } if (cgi_variable("createshare") && (share=cgi_variable("newshare"))) { + /* add_a_service() which is called by lp_copy_service() + will do unix_to_dos() conversion, so we need dos_to_unix() before the lp_copy_service(). */ + pstring unix_share; + pstrcpy(unix_share, dos_to_unix(share, False)); load_config(False); - lp_copy_service(GLOBALS_SNUM, share); + lp_copy_service(GLOBALS_SNUM, unix_share); iNumNonAutoPrintServices = lp_numservices(); snum = lp_servicenumber(share); lp_do_parameter(snum, "print ok", "Yes"); -- cgit