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); }
int load_defaults(const char *conf_file, const char **groups, int *argc, char ***argv) { DYNAMIC_ARRAY args; const char **dirs, *forced_default_file, *forced_extra_defaults; TYPELIB group; my_bool found_print_defaults=0; uint args_used=0; int error= 0; MEM_ROOT alloc; char *ptr, **res; DBUG_ENTER("load_defaults"); init_alloc_root(&alloc,512,0); if (*argc >= 2 && !strcmp(argv[0][1],"--no-defaults")) { /* remove the --no-defaults argument and return only the other arguments */ uint i; 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 */ for (i=2 ; i < (uint) *argc ; i++) res[i-1]=argv[0][i]; res[i-1]=0; /* End pointer */ (*argc)--; *argv=res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ DBUG_RETURN(0); } get_defaults_files(*argc, *argv, (char **)&forced_default_file, (char **)&forced_extra_defaults); if (forced_default_file) forced_default_file= strchr(forced_default_file,'=')+1; if (forced_extra_defaults) defaults_extra_file= strchr(forced_extra_defaults,'=')+1; args_used+= (forced_default_file ? 1 : 0) + (forced_extra_defaults ? 1 : 0); group.count=0; group.name= "defaults"; group.type_names= groups; for (; *groups ; groups++) group.count++; if (my_init_dynamic_array(&args, sizeof(char*),*argc, 32)) goto err; if (forced_default_file) { if ((error= search_default_file_with_ext(&args, &alloc, "", "", forced_default_file, &group, 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(&args, &alloc, NullS, conf_file, &group)) < 0) goto err; } else { #ifdef __WIN__ char system_dir[FN_REFLEN]; GetWindowsDirectory(system_dir,sizeof(system_dir)); if ((search_default_file(&args, &alloc, system_dir, conf_file, &group))) goto err; #endif #if defined(__EMX__) || defined(OS2) { const char *etc; if ((etc= getenv("ETC")) && (search_default_file(&args, &alloc, etc, conf_file, &group)) < 0) goto err; } #endif for (dirs=default_directories ; *dirs; dirs++) { if (**dirs) { if (search_default_file(&args, &alloc, *dirs, conf_file, &group) < 0) goto err; } else if (defaults_extra_file) { if (search_default_file(&args, &alloc, NullS, defaults_extra_file, &group) < 0) goto err; /* Fatal error */ } } } /* Here error contains <> 0 only if we have a fully specified conf_file or a forced default file */ if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+ (args.elements + *argc +1) *sizeof(char*)))) goto err; res= (char**) (ptr+sizeof(alloc)); /* copy name + found arguments + command line arguments to new array */ res[0]= argv[0][0]; /* Name MUST be set, even by embedded library */ memcpy((gptr) (res+1), args.buffer, args.elements*sizeof(char*)); /* Skip --defaults-file and --defaults-extra-file */ (*argc)-= args_used; (*argv)+= args_used; /* Check if we wan't to see the new argument list */ if (*argc >= 2 && !strcmp(argv[0][1],"--print-defaults")) { found_print_defaults=1; --*argc; ++*argv; /* skip argument */ } if (*argc) memcpy((gptr) (res+1+args.elements), (char*) ((*argv)+1), (*argc-1)*sizeof(char*)); res[args.elements+ *argc]=0; /* last null */ (*argc)+=args.elements; *argv= (char**) res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ delete_dynamic(&args); if (found_print_defaults) { int i; printf("%s would have been started with the following arguments:\n", **argv); for (i=1 ; i < *argc ; i++) printf("%s ", (*argv)[i]); puts(""); exit(0); } DBUG_RETURN(error); err: fprintf(stderr,"Fatal error in defaults handling. Program aborted\n"); exit(1); return 0; /* Keep compiler happy */ }
void load_defaults(const char *conf_file, const char **groups, int *argc, char ***argv) { DYNAMIC_ARRAY args; const char **dirs, *forced_default_file; TYPELIB group; my_bool found_print_defaults=0; uint args_used=0; MEM_ROOT alloc; char *ptr,**res; DBUG_ENTER("load_defaults"); init_alloc_root(&alloc,128,0); if (*argc >= 2 && !strcmp(argv[0][1],"--no-defaults")) { /* remove the --no-defaults argument and return only the other arguments */ uint i; 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 */ for (i=2 ; i < (uint) *argc ; i++) res[i-1]=argv[0][i]; (*argc)--; *argv=res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ DBUG_VOID_RETURN; } /* Check if we want to force the use a specific default file */ forced_default_file=0; if (*argc >= 2) { if (is_prefix(argv[0][1],"--defaults-file=")) { forced_default_file=strchr(argv[0][1],'=')+1; args_used++; } else if (is_prefix(argv[0][1],"--defaults-extra-file=")) { defaults_extra_file=strchr(argv[0][1],'=')+1; args_used++; } } group.count=0; group.name= "defaults"; group.type_names= groups; for (; *groups ; groups++) group.count++; if (my_init_dynamic_array(&args, sizeof(char*),*argc, 32)) goto err; if (forced_default_file) { if (search_default_file(&args, &alloc, "", forced_default_file, "", &group)) goto err; } else if (dirname_length(conf_file)) { if (search_default_file(&args, &alloc, NullS, conf_file, default_ext, &group)) goto err; } else { #ifdef _WIN32 char system_dir[FN_REFLEN]; GetWindowsDirectory(system_dir,sizeof(system_dir)); if (search_default_file(&args, &alloc, system_dir, conf_file, windows_ext, &group)) goto err; #endif #if defined(__EMX__) || defined(OS2) if (getenv("ETC") && search_default_file(&args, &alloc, getenv("ETC"), conf_file, default_ext, &group)) goto err; #endif for (dirs=default_directories ; *dirs; dirs++) { int error=0; if (**dirs) error=search_default_file(&args, &alloc, *dirs, conf_file, default_ext, &group); else if (defaults_extra_file) error=search_default_file(&args, &alloc, NullS, defaults_extra_file, default_ext, &group); if (error) goto err; } } if (!(ptr=(char*) alloc_root(&alloc,sizeof(alloc)+ (args.elements + *argc +1) *sizeof(char*)))) goto err; res= (char**) (ptr+sizeof(alloc)); /* copy name + found arguments + command line arguments to new array */ res[0]=argv[0][0]; memcpy((gptr) (res+1), args.buffer, args.elements*sizeof(char*)); /* Skipp --defaults-file and --defaults-extra-file */ (*argc)-= args_used; (*argv)+= args_used; /* Check if we wan't to see the new argument list */ if (*argc >= 2 && !strcmp(argv[0][1],"--print-defaults")) { found_print_defaults=1; --*argc; ++*argv; /* skipp argument */ } memcpy((gptr) (res+1+args.elements), (char*) ((*argv)+1), (*argc-1)*sizeof(char*)); res[args.elements+ *argc]=0; /* last null */ (*argc)+=args.elements; *argv= (char**) res; *(MEM_ROOT*) ptr= alloc; /* Save alloc root for free */ delete_dynamic(&args); if (found_print_defaults) { int i; printf("%s would have been started with the following arguments:\n", **argv); for (i=1 ; i < *argc ; i++) printf("%s ", (*argv)[i]); puts(""); exit(1); } DBUG_VOID_RETURN; err: fprintf(stderr,"Program aborted\n"); exit(1); }
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 */ }