85
84
const char *config_file, int recursion_level);
90
88
Create the list of default directories.
90
@param alloc MEM_ROOT where the list of directories is stored
93
The directories searched, in order, are:
94
- Windows: GetSystemWindowsDirectory()
95
- Windows: GetWindowsDirectory()
97
- Windows: Directory above where the executable is located
101
- Unix: --sysconfdir=<path> (compile-time option)
102
- ALL: getenv(DEFAULT_HOME_ENV)
103
- ALL: --defaults-extra-file=<path> (run-time option)
93
106
On all systems, if a directory is already in the list, it will be moved
94
107
to the end of the list. This avoids reading defaults files multiple times,
95
108
while ensuring the correct precedence.
110
@retval NULL Failure (out of memory, probably)
111
@retval other Pointer to NULL-terminated array of default directories
100
static void (*init_default_directories)();
114
static const char **init_default_directories(MEM_ROOT *alloc);
103
117
static char *remove_end_comment(char *ptr);
873
888
my_bool have_ext= fn_ext(conf_file)[0] != 0;
874
889
const char **exts_to_use= have_ext ? empty_list : f_extensions;
875
890
char name[FN_REFLEN], **ext;
878
init_default_directories();
879
892
puts("\nDefault options are read from the following files in the given order:");
881
894
if (dirname_length(conf_file))
882
895
fputs(conf_file,stdout);
885
for (dirs=default_directories ; *dirs; dirs++)
887
for (ext= (char**) exts_to_use; *ext; ext++)
899
If default_directories is already initialized, use it. Otherwise,
900
use a private MEM_ROOT.
902
const char **dirs = default_directories;
904
init_alloc_root(&alloc,512,0);
906
if (!dirs && (dirs= init_default_directories(&alloc)) == NULL)
908
fputs("Internal error initializing default directories list", stdout);
912
for ( ; *dirs; dirs++)
893
else if (my_defaults_extra_file)
894
pos= my_defaults_extra_file;
897
end= convert_dirname(name, pos, NullS);
898
if (name[0] == FN_HOMELIB) /* Add . to filenames in home */
900
strxmov(end, conf_file, *ext, " ", NullS);
914
for (ext= (char**) exts_to_use; *ext; ext++)
920
else if (my_defaults_extra_file)
921
pos= my_defaults_extra_file;
924
end= convert_dirname(name, pos, NullS);
925
if (name[0] == FN_HOMELIB) /* Add . to filenames in home */
927
strxmov(end, conf_file, *ext, " ", NullS);
933
free_root(&alloc, MYF(0));
937
967
#include <help_end.h>
941
This extra complexity is to avoid declaring 'rc' if it won't be
944
#define ADD_DIRECTORY_INTERNAL(DIR) \
945
array_append_string_unique((DIR), default_directories, \
946
array_elements(default_directories))
948
# define ADD_DIRECTORY(DIR) (void) ADD_DIRECTORY_INTERNAL(DIR)
950
#define ADD_DIRECTORY(DIR) \
952
my_bool rc= ADD_DIRECTORY_INTERNAL(DIR); \
953
DBUG_ASSERT(rc == FALSE); /* Success */ \
958
#define ADD_COMMON_DIRECTORIES() \
961
if ((env= getenv(STRINGIFY_ARG(DEFAULT_HOME_ENV)))) \
962
ADD_DIRECTORY(env); \
963
/* Placeholder for --defaults-extra-file=<path> */ \
970
static int add_directory(MEM_ROOT *alloc, const char *dir, const char **dirs)
975
my_bool err __attribute__((unused));
977
/* Normalize directory name */
978
len= unpack_dirname(buf, dir);
979
if (!(p= strmake_root(alloc, buf, len)))
980
return 1; /* Failure */
981
/* Should never fail if DEFAULT_DIRS_SIZE is correct size */
982
err= array_append_string_unique(p, dirs, DEFAULT_DIRS_SIZE);
983
DBUG_ASSERT(err == FALSE);
1005
Initialize default directories for Microsoft Windows
1008
1. GetSystemWindowsDirectory()
1009
2. GetWindowsDirectory()
1011
4. Directory above where the executable is located
1012
5. getenv(DEFAULT_HOME_ENV)
1013
6. --defaults-extra-file=<path> (run-time option)
1016
static void init_default_directories_win()
1025
static const char *my_get_module_parent(char *buf, size_t size)
1018
bzero((char *) default_directories, sizeof(default_directories));
1020
if (my_get_system_windows_directory(shared_system_dir,
1021
sizeof(shared_system_dir)))
1022
ADD_DIRECTORY(shared_system_dir);
1024
if (GetWindowsDirectory(system_dir,sizeof(system_dir)))
1025
ADD_DIRECTORY(system_dir);
1027
ADD_DIRECTORY("C:/");
1029
if (GetModuleFileName(NULL, config_dir, sizeof(config_dir)))
1029
if (!GetModuleFileName(NULL, buf, size))
1034
Look for the second-to-last \ in the filename, but hang on
1035
to a pointer after the last \ in case we're in the root of
1038
for ( ; end > buf; end--)
1031
char *last= NULL, *end= strend(config_dir);
1033
Look for the second-to-last \ in the filename, but hang on
1034
to a pointer after the last \ in case we're in the root of
1037
for ( ; end > config_dir; end--)
1040
if (*end == FN_LIBCHAR)
1039
if (*end == FN_LIBCHAR)
1043
if (end != config_dir)
1045
/* Keep the last '\' as this works both with D:\ and a directory */
1050
/* No parent directory (strange). Use current dir + '\' */
1044
/* Keep the last '\' as this works both with D:\ and a directory */
1058
ADD_DIRECTORY(config_dir);
1061
ADD_COMMON_DIRECTORIES();
1064
static void (*init_default_directories)()= init_default_directories_win;
1054
#endif /* __WIN__ */
1057
static const char **init_default_directories(MEM_ROOT *alloc)
1063
dirs= (const char **)alloc_root(alloc, DEFAULT_DIRS_SIZE * sizeof(char *));
1066
bzero((char *) dirs, DEFAULT_DIRS_SIZE * sizeof(char *));
1071
char fname_buffer[FN_REFLEN];
1072
if (my_get_system_windows_directory(fname_buffer, sizeof(fname_buffer)))
1073
errors += add_directory(alloc, fname_buffer, dirs);
1075
if (GetWindowsDirectory(fname_buffer, sizeof(fname_buffer)))
1076
errors += add_directory(alloc, fname_buffer, dirs);
1078
errors += add_directory(alloc, "C:/", dirs);
1080
if (my_get_module_parent(fname_buffer, sizeof(fname_buffer)) != NULL)
1081
errors += add_directory(alloc, fname_buffer, dirs);
1066
1084
#elif defined(__NETWARE__)
1069
Initialize default directories for Novell Netware
1073
2. getenv(DEFAULT_HOME_ENV)
1074
3. --defaults-extra-file=<path> (run-time option)
1077
static void init_default_directories_netware()
1079
bzero((char *) default_directories, sizeof(default_directories));
1080
ADD_DIRECTORY("sys:/etc/");
1081
ADD_COMMON_DIRECTORIES();
1084
static void (*init_default_directories)()= init_default_directories_netware;
1086
errors += add_directory(alloc, "sys:/etc/", dirs);
1089
Initialize default directories for Unix
1094
3. --sysconfdir=<path> (compile-time option)
1095
4. getenv(DEFAULT_HOME_ENV)
1096
5. --defaults-extra-file=<path> (run-time option)
1100
static void init_default_directories_unix()
1102
bzero((char *) default_directories, sizeof(default_directories));
1103
ADD_DIRECTORY("/etc/");
1104
ADD_DIRECTORY("/etc/mysql/");
1105
#ifdef DEFAULT_SYSCONFDIR
1090
errors += add_directory(alloc, "/etc/", dirs);
1091
errors += add_directory(alloc, "/etc/mysql/", dirs);
1093
#if defined(DEFAULT_SYSCONFDIR)
1106
1094
if (DEFAULT_SYSCONFDIR != "")
1107
ADD_DIRECTORY(DEFAULT_SYSCONFDIR);
1109
ADD_COMMON_DIRECTORIES();
1110
ADD_DIRECTORY("~/");
1095
errors += add_directory(alloc, DEFAULT_SYSCONFDIR, dirs);
1096
#endif /* DEFAULT_SYSCONFDIR */
1100
if ((env= getenv(STRINGIFY_ARG(DEFAULT_HOME_ENV))))
1101
errors += add_directory(alloc, env, dirs);
1103
/* Placeholder for --defaults-extra-file=<path> */
1104
errors += add_directory(alloc, "", dirs);
1106
#if !defined(__WIN__) && !defined(__NETWARE__)
1107
errors += add_directory(alloc, "~/", dirs);
1110
return (errors > 0 ? NULL : dirs);
1113
static void (*init_default_directories)()= init_default_directories_unix;