int my_search_option_files(const char *conf_file, int *argc, char ***argv, uint *args_used, Process_option_func func, void *func_ctx, const char **default_directories) { const char **dirs, *forced_default_file, *forced_extra_defaults; int error= 0; DBUG_ENTER("my_search_option_files"); /* Check if we want to force the use a specific default file */ *args_used+= get_defaults_options(*argc - *args_used, *argv + *args_used, (char **) &forced_default_file, (char **) &forced_extra_defaults, (char **) &my_defaults_group_suffix); if (! my_defaults_group_suffix) my_defaults_group_suffix= getenv(STRINGIFY_ARG(DEFAULT_GROUP_SUFFIX_ENV)); if (forced_extra_defaults && !defaults_already_read) { int error= fn_expand(forced_extra_defaults, my_defaults_extra_file_buffer); if (error) DBUG_RETURN(error); my_defaults_extra_file= my_defaults_extra_file_buffer; } if (forced_default_file && !defaults_already_read) { int error= fn_expand(forced_default_file, my_defaults_file_buffer); if (error) DBUG_RETURN(error); my_defaults_file= my_defaults_file_buffer; } defaults_already_read= TRUE; /* We can only handle 'defaults-group-suffix' if we are called from load_defaults() as otherwise we can't know the type of 'func_ctx' */ if (my_defaults_group_suffix && func == handle_default_option) { /* Handle --defaults-group-suffix= */ uint i; const char **extra_groups; const size_t instance_len= strlen(my_defaults_group_suffix); struct handle_option_ctx *ctx= (struct handle_option_ctx*) func_ctx; char *ptr; TYPELIB *group= ctx->group; if (!(extra_groups= (const char**)alloc_root(ctx->alloc, (2*group->count+1)*sizeof(char*)))) DBUG_RETURN(2); for (i= 0; i < group->count; i++) { size_t len; extra_groups[i]= group->type_names[i]; /** copy group */ len= strlen(extra_groups[i]); if (!(ptr= alloc_root(ctx->alloc, (uint) (len+instance_len+1)))) DBUG_RETURN(2); extra_groups[i+group->count]= ptr; /** Construct new group */ memcpy(ptr, extra_groups[i], len); memcpy(ptr+len, my_defaults_group_suffix, instance_len+1); } group->count*= 2; group->type_names= extra_groups; group->type_names[group->count]= 0; } if (my_defaults_file) { if ((error= search_default_file_with_ext(func, func_ctx, "", "", my_defaults_file, 0)) < 0) goto err; if (error > 0) { fprintf(stderr, "Could not open required defaults file: %s\n", my_defaults_file); goto err; } } else if (dirname_length(conf_file)) { if ((error= search_default_file(func, func_ctx, NullS, conf_file)) < 0) goto err; } else { my_bool found_conf= FALSE; for (dirs= default_directories ; *dirs; dirs++) { if (**dirs) { int file_err= search_default_file(func, func_ctx, *dirs, conf_file); if (file_err < 0) goto err; else if (file_err == 0) found_conf= TRUE; } else if (my_defaults_extra_file) { if ((error= search_default_file_with_ext(func, func_ctx, "", "", my_defaults_extra_file, 0)) < 0) goto err; /* Fatal error */ if (error > 0) { fprintf(stderr, "Could not open required defaults file: %s\n", my_defaults_extra_file); goto err; } found_conf= TRUE; } } if (!found_conf) { goto err; } } DBUG_RETURN(0); err: DBUG_RETURN(1); }
"Password to use when connecting to server. If password is not given," " it's solicited on the tty.", &opt_password,&opt_password, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #ifdef __WIN__ {"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, #endif {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", &opt_plugin_dir, &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection or 0 for default to, in " "order of preference, my.cnf, $MYSQL_TCP_PORT, " #if MYSQL_PORT_DEFAULT == 0 "/etc/services, " #endif "built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"protocol", OPT_MYSQL_PROTOCOL, "The protocol to use for connection (tcp, socket, pipe, memory).", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #ifdef HAVE_SMEM {"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME, "Base name of shared memory.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #endif {"silent", OPT_SILENT, "Print less information", &opt_silent, &opt_silent, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"socket", 'S', "The socket file to use for connection.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #include <sslopt-longopts.h> {"tmpdir", 't', "Directory for temporary files.",
int my_search_option_files(const char *conf_file, int *argc, char ***argv, uint *args_used, Process_option_func func, void *func_ctx) { const char **dirs, *forced_default_file, *forced_extra_defaults; int error= 0; DBUG_ENTER("my_search_option_files"); /* Check if we want to force the use a specific default file */ *args_used+= get_defaults_options(*argc - *args_used, *argv + *args_used, (char **) &forced_default_file, (char **) &forced_extra_defaults, (char **) &my_defaults_group_suffix); if (! my_defaults_group_suffix) my_defaults_group_suffix= getenv(STRINGIFY_ARG(DEFAULT_GROUP_SUFFIX_ENV)); if (forced_extra_defaults) my_defaults_extra_file= (char *) forced_extra_defaults; if (forced_default_file) my_defaults_file= forced_default_file; /* We can only handle 'defaults-group-suffix' if we are called from load_defaults() as otherwise we can't know the type of 'func_ctx' */ if (my_defaults_group_suffix && func == handle_default_option) { /* Handle --defaults-group-suffix= */ uint i; const char **extra_groups; const uint instance_len= strlen(my_defaults_group_suffix); struct handle_option_ctx *ctx= (struct handle_option_ctx*) func_ctx; char *ptr; TYPELIB *group= ctx->group; if (!(extra_groups= (const char**)alloc_root(ctx->alloc, (2*group->count+1)*sizeof(char*)))) goto err; for (i= 0; i < group->count; i++) { uint len; extra_groups[i]= group->type_names[i]; /** copy group */ len= strlen(extra_groups[i]); if (!(ptr= alloc_root(ctx->alloc, len+instance_len+1))) goto err; extra_groups[i+group->count]= ptr; /** Construct new group */ memcpy(ptr, extra_groups[i], len); memcpy(ptr+len, my_defaults_group_suffix, instance_len+1); } group->count*= 2; group->type_names= extra_groups; group->type_names[group->count]= 0; } if (forced_default_file) { if ((error= search_default_file_with_ext(func, func_ctx, "", "", forced_default_file, 0)) < 0) goto err; if (error > 0) { fprintf(stderr, "Could not open required defaults file: %s\n", forced_default_file); goto err; } } else if (dirname_length(conf_file)) { if ((error= search_default_file(func, func_ctx, NullS, conf_file)) < 0) goto err; } else { for (dirs= default_directories ; *dirs; dirs++) { if (**dirs) { if (search_default_file(func, func_ctx, *dirs, conf_file) < 0) goto err; } else if (my_defaults_extra_file) { if ((error= search_default_file_with_ext(func, func_ctx, "", "", my_defaults_extra_file, 0)) < 0) goto err; /* Fatal error */ if (error > 0) { fprintf(stderr, "Could not open required defaults file: %s\n", my_defaults_extra_file); goto err; } } } } DBUG_RETURN(error); err: fprintf(stderr,"Fatal error in defaults handling. Program aborted\n"); exit(1); return 0; /* Keep compiler happy */ }