diff options
author | Mikael Ronstrom <mikael.ronstrom@oracle.com> | 2011-01-20 18:35:57 +0100 |
---|---|---|
committer | Mikael Ronstrom <mikael.ronstrom@oracle.com> | 2011-01-20 18:35:57 +0100 |
commit | 3729fb5f7b534dec3482e5a771b73f43c12e3bec (patch) | |
tree | a1c0b7bc3b8449e48d210fab73769316ee296d5c /mysys | |
parent | 4e4081bb40c2c38bff131c3f4f0dbf7374bc580b (diff) | |
parent | 921dcabe90a0f894f053ce9e184fd4f8c8f2c249 (diff) | |
download | mariadb-git-3729fb5f7b534dec3482e5a771b73f43c12e3bec.tar.gz |
merge
Diffstat (limited to 'mysys')
-rw-r--r-- | mysys/default.c | 59 | ||||
-rw-r--r-- | mysys/my_getopt.c | 22 |
2 files changed, 59 insertions, 22 deletions
diff --git a/mysys/default.c b/mysys/default.c index 75eb4709e1e..432c3086254 100644 --- a/mysys/default.c +++ b/mysys/default.c @@ -61,9 +61,23 @@ check the pointer, use "----args-separator----" here to ease debug if someone misused it. + The args seprator will only be added when + my_getopt_use_args_seprator is set to TRUE before calling + load_defaults(); + See BUG#25192 */ -const char *args_separator= "----args-separator----"; +static const char *args_separator= "----args-separator----"; +inline static void set_args_separator(char** arg) +{ + DBUG_ASSERT(my_getopt_use_args_separator); + *arg= (char*)args_separator; +} +my_bool my_getopt_use_args_separator= FALSE; +my_bool my_getopt_is_args_separator(const char* arg) +{ + return (arg == args_separator); +} const char *my_defaults_file=0; const char *my_defaults_group_suffix=0; const char *my_defaults_extra_file=0; @@ -503,6 +517,7 @@ int my_load_defaults(const char *conf_file, const char **groups, char *ptr,**res; struct handle_option_ctx ctx; const char **dirs; + uint args_sep= my_getopt_use_args_separator ? 1 : 0; DBUG_ENTER("load_defaults"); init_alloc_root(&alloc,512,0); @@ -515,17 +530,28 @@ int my_load_defaults(const char *conf_file, const char **groups, if (*argc >= 2 && !strcmp(argv[0][1],"--no-defaults")) { /* remove the --no-defaults argument and return only the other arguments */ - uint i; + uint i, j; if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+ (*argc + 1)*sizeof(char*)))) goto err; res= (char**) (ptr+sizeof(alloc)); res[0]= **argv; /* Copy program name */ - /* set arguments separator */ - res[1]= (char *)args_separator; - for (i=2 ; i < (uint) *argc ; i++) - res[i]=argv[0][i]; - res[i]=0; /* End pointer */ + j= 1; /* Start from 1 for the reset result args */ + if (my_getopt_use_args_separator) + { + /* set arguments separator */ + set_args_separator(&res[1]); + j++; + } + for (i=2 ; i < (uint) *argc ; i++, j++) + res[j]=argv[0][i]; + res[j]=0; /* End pointer */ + /* + Update the argc, if have not added args separator, then we have + to decrease argc because we have removed the "--no-defaults". + */ + if (!my_getopt_use_args_separator) + (*argc)--; *argv=res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ if (default_directories) @@ -559,7 +585,7 @@ int my_load_defaults(const char *conf_file, const char **groups, or a forced default file */ if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+ - (args.elements + *argc + 1 + 1) *sizeof(char*)))) + (args.elements + *argc + 1 + args_sep) *sizeof(char*)))) goto err; res= (char**) (ptr+sizeof(alloc)); @@ -580,16 +606,19 @@ int my_load_defaults(const char *conf_file, const char **groups, --*argc; ++*argv; /* skip argument */ } - /* set arguments separator for arguments from config file and - command line */ - res[args.elements+1]= (char *)args_separator; + if (my_getopt_use_args_separator) + { + /* set arguments separator for arguments from config file and + command line */ + set_args_separator(&res[args.elements+1]); + } if (*argc) - memcpy((uchar*) (res+1+args.elements+1), (char*) ((*argv)+1), + memcpy((uchar*) (res+1+args.elements+args_sep), (char*) ((*argv)+1), (*argc-1)*sizeof(char*)); - res[args.elements+ *argc+1]=0; /* last null */ + res[args.elements+ *argc+args_sep]=0; /* last null */ - (*argc)+=args.elements+1; + (*argc)+=args.elements+args_sep; *argv= (char**) res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ delete_dynamic(&args); @@ -599,7 +628,7 @@ int my_load_defaults(const char *conf_file, const char **groups, printf("%s would have been started with the following arguments:\n", **argv); for (i=1 ; i < *argc ; i++) - if ((*argv)[i] != args_separator) /* skip arguments separator */ + if (!my_getopt_is_args_separator((*argv)[i])) /* skip arguments separator */ printf("%s ", (*argv)[i]); puts(""); exit(0); diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c index 51c45ff1309..6f7ed070ccf 100644 --- a/mysys/my_getopt.c +++ b/mysys/my_getopt.c @@ -176,7 +176,7 @@ int handle_options(int *argc, char ***argv, */ for (pos= *argv, pos_end=pos+ *argc; pos != pos_end ; pos++) { - if (*pos == args_separator) + if (my_getopt_is_args_separator(*pos)) { is_cmdline_arg= 0; break; @@ -188,7 +188,7 @@ int handle_options(int *argc, char ***argv, char **first= pos; char *cur_arg= *pos; opt_found= 0; - if (!is_cmdline_arg && (cur_arg == args_separator)) + if (!is_cmdline_arg && (my_getopt_is_args_separator(cur_arg))) { is_cmdline_arg= 1; @@ -611,13 +611,21 @@ static char *check_struct_option(char *cur_arg, char *key_name) @param[in] argument The value argument @return boolean value */ -static my_bool get_bool_argument(const char *argument) +static my_bool get_bool_argument(const struct my_option *opts, + const char *argument) { if (!my_strcasecmp(&my_charset_latin1, argument, "true") || - !my_strcasecmp(&my_charset_latin1, argument, "on")) + !my_strcasecmp(&my_charset_latin1, argument, "on") || + !my_strcasecmp(&my_charset_latin1, argument, "1")) return 1; - else - return (my_bool) atoi(argument); + else if (!my_strcasecmp(&my_charset_latin1, argument, "false") || + !my_strcasecmp(&my_charset_latin1, argument, "off") || + !my_strcasecmp(&my_charset_latin1, argument, "0")) + return 0; + my_getopt_error_reporter(WARNING_LEVEL, + "option '%s': boolean value '%s' wasn't recognized. Set to OFF.", + opts->name, argument); + return 0; } /* @@ -647,7 +655,7 @@ static int setval(const struct my_option *opts, void *value, char *argument, switch ((opts->var_type & GET_TYPE_MASK)) { case GET_BOOL: /* If argument differs from 0, enable option, else disable */ - *((my_bool*) value)= get_bool_argument(argument); + *((my_bool*) value)= get_bool_argument(opts, argument); break; case GET_INT: *((int*) value)= (int) getopt_ll(argument, opts, &err); |