summaryrefslogtreecommitdiffstats
path: root/options/path.c
diff options
context:
space:
mode:
Diffstat (limited to 'options/path.c')
-rw-r--r--options/path.c83
1 files changed, 40 insertions, 43 deletions
diff --git a/options/path.c b/options/path.c
index 433f5112cd..d19b360b99 100644
--- a/options/path.c
+++ b/options/path.c
@@ -43,41 +43,36 @@
#include "osdep/io.h"
#include "osdep/path.h"
-#if !defined(_WIN32) || defined(__CYGWIN__)
-static int mp_add_xdg_config_dirs(struct mpv_global *global, char **dirs, int i)
-{
- void *talloc_ctx = dirs;
-
- char *home = getenv("HOME");
- char *tmp = NULL;
+#define MAX_CONFIG_PATHS 32
- char *xdg_home = NULL;
- tmp = getenv("XDG_CONFIG_HOME");
- if (tmp && *tmp)
- xdg_home = talloc_asprintf(talloc_ctx, "%s/mpv", tmp);
- else if (home && *home)
- xdg_home = talloc_asprintf(talloc_ctx, "%s/.config/mpv", home);
-
- // Maintain compatibility with old ~/.mpv
- char *old_home = NULL;
- if (home && *home)
- old_home = talloc_asprintf(talloc_ctx, "%s/.mpv", home);
-
- // If the old ~/.mpv exists, and the XDG config dir doesn't, use the old
- // config dir only.
- if (mp_path_exists(xdg_home) || !mp_path_exists(old_home))
- dirs[i++] = xdg_home;
- dirs[i++] = old_home;
+static const char *mp_get_forced_home(void *talloc_ctx, const char *type)
+{
+ return strcmp(type, "home") == 0 ? getenv("MPV_HOME") : NULL;
+}
+// In order of increasing priority: the first hiz has highest priority.
+static const mp_get_platform_path_cb path_resolvers[] = {
+ mp_get_forced_home,
#if HAVE_COCOA
- i = mp_add_macosx_bundle_dir(global, dirs, i);
+ mp_get_platform_path_osx,
#endif
+#if !defined(_WIN32) || defined(__CYGWIN__)
+ mp_get_platform_path_unix,
+#endif
+#if defined(_WIN32)
+ mp_get_platform_path_win,
+#endif
+};
- dirs[i++] = MPV_CONFDIR;
-
- return i;
+static const char *mp_get_platform_path(void *talloc_ctx, const char *type)
+{
+ for (int n = 0; n < MP_ARRAY_SIZE(path_resolvers); n++) {
+ const char *path = path_resolvers[n](talloc_ctx, type);
+ if (path && path[0])
+ return path;
+ }
+ return NULL;
}
-#endif
// Return NULL-terminated array of config directories, from highest to lowest
// priority
@@ -85,7 +80,8 @@ static char **mp_config_dirs(void *talloc_ctx, struct mpv_global *global)
{
struct MPOpts *opts = global->opts;
- char **ret = talloc_zero_array(talloc_ctx, char*, MAX_CONFIG_PATHS);
+ char **ret = talloc_zero_array(talloc_ctx, char*, MAX_CONFIG_PATHS + 1);
+ int num_ret = 0;
if (!opts->load_config)
return ret;
@@ -95,22 +91,23 @@ static char **mp_config_dirs(void *talloc_ctx, struct mpv_global *global)
return ret;
}
- const char *tmp = NULL;
- int i = 0;
-
- tmp = getenv("MPV_HOME");
- if (tmp && *tmp)
- ret[i++] = talloc_strdup(ret, tmp);
+ // from highest (most preferred) to lowest priority
+ static const char *const configdirs[] = {
+ "home",
+ "old_home",
+ "osxbundle",
+ "global",
+ };
-#if defined(_WIN32) && !defined(__CYGWIN__)
- i = mp_add_win_config_dirs(global, ret, i);
-#else
- i = mp_add_xdg_config_dirs(global, ret, i);
-#endif
+ for (int n = 0; n < MP_ARRAY_SIZE(configdirs); n++) {
+ const char *path = mp_get_platform_path(ret, configdirs[n]);
+ if (path && path[0] && num_ret < MAX_CONFIG_PATHS)
+ ret[num_ret++] = (char *)path;
+ }
MP_VERBOSE(global, "search dirs:");
- for (char **c = ret; *c; c++)
- MP_VERBOSE(global, " %s", *c);
+ for (int n = 0; n < num_ret; n++)
+ MP_VERBOSE(global, " %s", ret[n]);
MP_VERBOSE(global, "\n");
return ret;