diff --git a/common/global.h b/common/global.h index 879ca72386..8adc59e02c 100644 --- a/common/global.h +++ b/common/global.h @@ -8,6 +8,7 @@ struct mpv_global { struct mp_log *log; struct m_config_shadow *config; struct mp_client_api *client_api; + char *configdir; // Using this is deprecated and should be avoided (missing synchronization). // Use m_config_cache to access mpv_global.config instead. diff --git a/options/path.c b/options/path.c index dac9238cf9..d2b74516e1 100644 --- a/options/path.c +++ b/options/path.c @@ -61,6 +61,19 @@ static const char *const config_dirs[] = { "global", }; +void mp_init_paths(struct mpv_global *global, struct MPOpts *opts) +{ + TA_FREEP(&global->configdir); + + const char *force_configdir = getenv("MPV_HOME"); + if (opts->force_configdir && opts->force_configdir[0]) + force_configdir = opts->force_configdir; + if (!opts->load_config) + force_configdir = ""; + + global->configdir = talloc_strdup(global, force_configdir); +} + // Return a platform specific path using a path type as defined in osdep/path.h. // Keep in mind that the only way to free the return value is freeing talloc_ctx // (or its children), as this function can return a statically allocated string. @@ -70,15 +83,10 @@ static const char *mp_get_platform_path(void *talloc_ctx, { assert(talloc_ctx); - const char *force_configdir = getenv("MPV_HOME"); - if (global->opts->force_configdir && global->opts->force_configdir[0]) - force_configdir = global->opts->force_configdir; - if (!global->opts->load_config) - force_configdir = ""; - if (force_configdir) { + if (global->configdir) { for (int n = 0; n < MP_ARRAY_SIZE(config_dirs); n++) { if (strcmp(config_dirs[n], type) == 0) - return (n == 0 && force_configdir[0]) ? force_configdir : NULL; + return (n == 0 && global->configdir[0]) ? global->configdir : NULL; } } diff --git a/options/path.h b/options/path.h index 0d488fcb89..c3c3699a0b 100644 --- a/options/path.h +++ b/options/path.h @@ -24,6 +24,9 @@ #include "misc/bstr.h" struct mpv_global; +struct MPOpts; + +void mp_init_paths(struct mpv_global *global, struct MPOpts *opts); // Search for the input filename in several paths. These include user and global // config locations by default. Some platforms may implement additional platform diff --git a/player/main.c b/player/main.c index 5870574844..d94b61230e 100644 --- a/player/main.c +++ b/player/main.c @@ -338,6 +338,7 @@ int mp_initialize(struct MPContext *mpctx, char **options) if (options) m_config_preparse_command_line(mpctx->mconfig, mpctx->global, options); + mp_init_paths(mpctx->global, opts); mp_update_logging(mpctx, true); if (options) {