From d3a3cfe54c26055c0686ea1b9a245eb7f88af521 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 1 May 2015 21:13:44 +0200 Subject: path: refactor Somewhat less ifdeffery, higher flexibility. Now there are 3 separate config file resolvers for 3 platforms (unix, win, osx), and they can still interact with each other somewhat. For example, OSX for now uses most of Unix, but adds the OSX bundle path. This can be extended to resolve very specific platform paths, such as location of the desktop. Most of the Unix specific code moves to path-unix.c. The behavior should be the same - if not, it is likely a bug. --- osdep/path-unix.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 osdep/path-unix.c (limited to 'osdep/path-unix.c') diff --git a/osdep/path-unix.c b/osdep/path-unix.c new file mode 100644 index 0000000000..c3b70d7e06 --- /dev/null +++ b/osdep/path-unix.c @@ -0,0 +1,64 @@ +/* + * This file is part of mpv. + * + * mpv is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * mpv is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with mpv. If not, see . + */ + +#include +#include + +#include "options/path.h" +#include "path.h" + +#include "config.h" + +static pthread_once_t path_init_once = PTHREAD_ONCE_INIT; + +static char mpv_home[512]; +static char old_home[512]; + +static void path_init(void) +{ + char *home = getenv("HOME"); + char *xdg_dir = getenv("XDG_CONFIG_HOME"); + + if (xdg_dir && xdg_dir[0]) { + snprintf(mpv_home, sizeof(mpv_home), "%s/mpv", xdg_dir); + } else if (home && home[0]) { + snprintf(mpv_home, sizeof(mpv_home), "%s/.config/mpv", home); + } + + // Maintain compatibility with old ~/.mpv + if (home && home[0]) + snprintf(old_home, sizeof(old_home), "%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(old_home) && !mp_path_exists(mpv_home)) { + snprintf(mpv_home, sizeof(mpv_home), "%s", old_home); + old_home[0] = '\0'; + } +} + +const char *mp_get_platform_path_unix(void *talloc_ctx, const char *type) +{ + pthread_once(&path_init_once, path_init); + if (strcmp(type, "home") == 0) + return mpv_home; + if (strcmp(type, "old_home") == 0) + return old_home; + if (strcmp(type, "global") == 0) + return MPV_CONFDIR; + return NULL; +} -- cgit v1.2.3