void my_print_default_files(const char *conf_file) { const char *empty_list[]= { "", 0 }; my_bool have_ext= fn_ext(conf_file)[0] != 0; const char **exts_to_use= have_ext ? empty_list : f_extensions; char name[FN_REFLEN], **ext; puts("\nDefault options are read from the following files in the given order:"); if (dirname_length(conf_file)) fputs(conf_file,stdout); else { const char **dirs; MEM_ROOT alloc; init_alloc_root(&alloc, 512, 0, MYF(0)); if ((dirs= init_default_directories(&alloc)) == NULL) { fputs("Internal error initializing default directories list", stdout); } else { for ( ; *dirs; dirs++) { for (ext= (char**) exts_to_use; *ext; ext++) { const char *pos; char *end; if (**dirs) pos= *dirs; else if (my_defaults_extra_file) pos= my_defaults_extra_file; else continue; end= convert_dirname(name, pos, NullS); if (name[0] == FN_HOMELIB) /* Add . to filenames in home */ *end++= '.'; strxmov(end, conf_file, *ext, " ", NullS); fputs(name, stdout); } } } free_root(&alloc, MYF(0)); } puts(""); }
void my_print_default_files(const char *conf_file) { const char *empty_list[]= { "", 0 }; my_bool have_ext= fn_ext(conf_file)[0] != 0; const char **exts_to_use= have_ext ? empty_list : f_extensions; char name[FN_REFLEN], **ext; const char **dirs; init_default_directories(); puts("\nDefault options are read from the following files in the given order:"); if (dirname_length(conf_file)) fputs(conf_file,stdout); else { for (dirs=default_directories ; *dirs; dirs++) { for (ext= (char**) exts_to_use; *ext; ext++) { const char *pos; char *end; if (**dirs) pos= *dirs; else if (my_defaults_extra_file) pos= my_defaults_extra_file; else continue; end= convert_dirname(name, pos, NullS); if (name[0] == FN_HOMELIB) /* Add . to filenames in home */ *end++='.'; strxmov(end, conf_file, *ext, " ", NullS); fputs(name,stdout); } } } puts(""); }
int my_load_defaults(const char *conf_file, const char **groups, int *argc, char ***argv, const char ***default_directories) { DYNAMIC_ARRAY args; TYPELIB group; my_bool found_print_defaults= 0; uint args_used= 0; int error= 0; MEM_ROOT alloc; 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, MYF(0)); if ((dirs= init_default_directories(&alloc)) == NULL) goto err; /* Check if the user doesn't want any default option processing --no-defaults is always the first option */ if (*argc >= 2 && !strcmp(argv[0][1],"--no-defaults")) { /* remove the --no-defaults argument and return only the other arguments */ 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 */ 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) *default_directories= dirs; DBUG_RETURN(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, MYF(0))) goto err; ctx.alloc= &alloc; ctx.args= &args; ctx.group= &group; error= my_search_option_files(conf_file, argc, argv, &args_used, handle_default_option, (void *) &ctx, dirs); /* 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 + args_sep) *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((uchar*) (res+1), args.buffer, args.elements*sizeof(char*)); /* Skip --defaults-xxx options */ (*argc)-= args_used; (*argv)+= args_used; /* Check if we wan't to see the new argument list This options must always be the last of the default options */ if (*argc >= 2 && !strcmp(argv[0][1],"--print-defaults")) { found_print_defaults=1; --*argc; ++*argv; /* skip argument */ } 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+args_sep), (char*) ((*argv)+1), (*argc-1)*sizeof(char*)); res[args.elements+ *argc+args_sep]=0; /* last null */ (*argc)+=args.elements+args_sep; *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++) if (!my_getopt_is_args_separator((*argv)[i])) /* skip arguments separator */ printf("%s ", (*argv)[i]); puts(""); exit(0); } if (error == 0 && default_directories) *default_directories= dirs; DBUG_RETURN(error); err: fprintf(stderr,"Fatal error in defaults handling. Program aborted\n"); exit(1); return 0; /* Keep compiler happy */ }