Update user dir config file search path

Search in XDG_CONFIG_HOME as per XDG Base Directory Specification
in addition to $HOME/.openocd.

On Darwin, search in ~/Library/Preferences/org.openocd/ which
appears to be one of the conventional locations.

Make $OPENOCD_SCRIPTS highest priority on all platforms, previously
it was only higher on WIN32.

Update the documentation to reflect the search order.

Change-Id: Ibaf4b59b51fdf452712d91b47ea2b5312bb5ada9
Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Reviewed-on: http://openocd.zylin.com/3890
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
This commit is contained in:
Andreas Fritiofson 2016-12-24 11:38:04 +01:00 committed by Antonio Borneo
parent 2ff1824a87
commit 87d2651edc
2 changed files with 62 additions and 23 deletions

View File

@ -724,8 +724,11 @@ Configuration files and scripts are searched for in
@item the current directory,
@item any search dir specified on the command line using the @option{-s} option,
@item any search dir specified using the @command{add_script_search_dir} command,
@item @file{$HOME/.openocd} (not on Windows),
@item a directory in the @env{OPENOCD_SCRIPTS} environment variable (if set),
@item @file{%APPDATA%/OpenOCD} (only on Windows),
@item @file{$HOME/Library/Preferences/org.openocd} (only on Darwin),
@item @file{$XDG_CONFIG_HOME/openocd} (@env{$XDG_CONFIG_HOME} defaults to @file{$HOME/.config}),
@item @file{$HOME/.openocd},
@item the site wide script library @file{$pkgdatadir/site} and
@item the OpenOCD-supplied script library @file{$pkgdatadir/scripts}.
@end enumerate

View File

@ -178,6 +178,63 @@ static char *find_relative_path(const char *from, const char *to)
return relpath;
}
static void add_user_dirs(void)
{
char *path;
#if IS_WIN32
const char *appdata = getenv("APPDATA");
if (appdata) {
path = alloc_printf("%s/OpenOCD", appdata);
if (path) {
/* Convert path separators to UNIX style, should work on Windows also. */
for (char *p = path; *p; p++) {
if (*p == '\\')
*p = '/';
}
add_script_search_dir(path);
free(path);
}
}
/* WIN32 may also have HOME defined, particularly under Cygwin, so add those paths below too */
#endif
const char *home = getenv("HOME");
#if IS_DARWIN
if (home) {
path = alloc_printf("%s/Library/Preferences/org.openocd", home);
if (path) {
add_script_search_dir(path);
free(path);
}
}
#endif
const char *xdg_config = getenv("XDG_CONFIG_HOME");
if (xdg_config) {
path = alloc_printf("%s/openocd", xdg_config);
if (path) {
add_script_search_dir(path);
free(path);
}
} else if (home) {
path = alloc_printf("%s/.config/openocd", home);
if (path) {
add_script_search_dir(path);
free(path);
}
}
if (home) {
path = alloc_printf("%s/.openocd", home);
if (path) {
add_script_search_dir(path);
free(path);
}
}
}
static void add_default_dirs(void)
{
char *path;
@ -194,32 +251,11 @@ static void add_default_dirs(void)
* listed last in the built-in search order, so the user can
* override these scripts with site-specific customizations.
*/
const char *home = getenv("HOME");
if (home) {
path = alloc_printf("%s/.openocd", home);
if (path) {
add_script_search_dir(path);
free(path);
}
}
path = getenv("OPENOCD_SCRIPTS");
if (path)
add_script_search_dir(path);
#ifdef _WIN32
const char *appdata = getenv("APPDATA");
if (appdata) {
path = alloc_printf("%s/OpenOCD", appdata);
if (path) {
add_script_search_dir(path);
free(path);
}
}
#endif
add_user_dirs();
path = alloc_printf("%s/%s/%s", exepath, bin2data, "site");
if (path) {