From: Rémi Denis-Courmont Date: Wed, 26 Aug 2009 18:51:34 +0000 (+0300) Subject: Split directories configuration per platform X-Git-Tag: 1.1.0-ff~3862 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=47d017ddce8265e287c841a2105c7ac437d87675;p=vlc Split directories configuration per platform There was almost no commonality. This also simplifies stuff a bit. --- diff --git a/src/Makefile.am b/src/Makefile.am index 88416dc693..78a92bfd37 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -259,22 +259,26 @@ SOURCES_libvlc_beos = \ $(NULL) SOURCES_libvlc_darwin = \ + config/dirs_macos.c \ misc/pthread.c \ misc/darwin_specific.c \ $(NULL) SOURCES_libvlc_linux = \ + config/dirs_xdg.c \ misc/pthread.c \ misc/linux_specific.c \ $(NULL) SOURCES_libvlc_win32 = \ + config/dirs_win.c \ misc/w32thread.c \ misc/win32_specific.c \ network/winsock.c \ $(NULL) SOURCES_libvlc_other = \ + config/dirs_xdg.c \ misc/pthread.c \ misc/not_specific.c @@ -404,7 +408,6 @@ SOURCES_libvlc_common = \ misc/action.c \ config/configuration.h \ config/core.c \ - config/dirs.c \ config/chain.c \ config/file.c \ config/intf.c \ diff --git a/src/config/configuration.h b/src/config/configuration.h index e078443a1e..6533c211fd 100644 --- a/src/config/configuration.h +++ b/src/config/configuration.h @@ -54,21 +54,9 @@ static inline int IsConfigFloatType (int type) int ConfigStringToKey( const char * ); -/* The configuration file and directory */ -#if defined (SYS_BEOS) -# define CONFIG_DIR "config/settings/VideoLAN Client" -#elif defined (__APPLE__) -# define CONFIG_DIR "Library/Preferences/VLC" -# define CACHES_DIR "Library/Caches/VLC" -#elif defined( WIN32 ) || defined( UNDER_CE ) -# define CONFIG_DIR "vlc" -#else -# define CONFIG_DIR ".vlc" -#endif +/* The configuration file */ #define CONFIG_FILE "vlcrc" - - # ifdef __cplusplus } # endif diff --git a/src/config/dirs_macos.c b/src/config/dirs_macos.c new file mode 100644 index 0000000000..4e0c8eccf6 --- /dev/null +++ b/src/config/dirs_macos.c @@ -0,0 +1,173 @@ +/***************************************************************************** + * dirs_macos.c: MacOS directories configuration + ***************************************************************************** + * Copyright (C) 2001-2007 the VideoLAN team + * Copyright © 2007-2009 Rémi Denis-Courmont + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "../libvlc.h" +#include +#include + +#include +#include +#include +#include + +const char *config_GetDataDir( void ) +{ + static char path[PATH_MAX] = ""; + +#warning FIXME: thread-safety! + if( *path == '\0' ) + { + snprintf( path, sizeof( path ), "%s" DIR_SEP DIR_SHARE, psz_vlcpath ); + path[sizeof( path ) - 1] = '\0'; + } + return path; +} + +static const char *GetDir(void) +{ + /* FIXME: a full memory page here - quite a waste... */ + static char homedir[PATH_MAX] = ""; + + static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; + pthread_mutex_lock (&lock); + + if (!*homedir) + { + const char *psz_localhome = getenv( "HOME" ); +#if defined(HAVE_GETPWUID_R) + char buf[sysconf (_SC_GETPW_R_SIZE_MAX)]; + if (psz_localhome == NULL) + { + struct passwd pw, *res; + + if (!getpwuid_r (getuid (), &pw, buf, sizeof (buf), &res) && res) + psz_localhome = pw.pw_dir; + } +#endif + if (psz_localhome == NULL) + psz_localhome = getenv( "TMP" ); + if (psz_localhome == NULL) + psz_localhome = "/tmp"; + + const char *uhomedir = FromLocale (psz_localhome); + strncpy (homedir, uhomedir, sizeof (homedir) - 1); + homedir[sizeof (homedir) - 1] = '\0'; + LocaleFree (uhomedir); + } + pthread_mutex_unlock (&lock); + return homedir; +} + +const char *config_GetConfDir( void ) +{ + static char path[PATH_MAX] = ""; + +#warning FIXME: system config is not the same as shared app data... + if( *path == '\0' ) + { + snprintf( path, sizeof( path ), "%s"DIR_SEP DIR_SHARE, /* FIXME: Duh? */ + psz_vlcpath ); + path[sizeof( path ) - 1] = '\0'; + } + return path; +} + +static char *config_GetHomeDir (void) +{ + /* 1/ Try $HOME */ + const char *home = getenv ("HOME"); +#if defined(HAVE_GETPWUID_R) + /* 2/ Try /etc/passwd */ + char buf[sysconf (_SC_GETPW_R_SIZE_MAX)]; + if (home == NULL) + { + struct passwd pw, *res; + + if (!getpwuid_r (getuid (), &pw, buf, sizeof (buf), &res) && res) + home = pw.pw_dir; + } +#endif + /* 3/ Desperately try $TMP */ + if (home == NULL) + home = getenv( "TMP" ); + /* 4/ Beyond hope, hard-code /tmp */ + if (home == NULL) + home = "/tmp"; + + return FromLocaleDup (home); +} + +static char *config_GetAppDir (void) +{ + char *psz_dir; + const char *psz_parent = GetDir (false); + + if( asprintf( &psz_dir, "%s/Library/Preferences/VLC", psz_parent ) == -1 ) + psz_dir = NULL; + return psz_dir; +} + +/** + * Get the user's VLC cache directory + * (used for stuff like the modules cache, the album art cache, ...) + */ +char *config_GetCacheDir( void ) +{ + char *psz_dir; + const char *psz_parent = GetDir (false); + + if( asprintf( &psz_dir, "%s/Library/Preferences/VLC", psz_parent ) == -1 ) + psz_dir = NULL; + + return psz_dir; +} + +char *config_GetUserDir (vlc_userdir_t type) +{ + switch (type) + { + case VLC_HOME_DIR: + return config_GetHomeDir (); + case VLC_CONFIG_DIR: + return config_GetAppDir (); + case VLC_DATA_DIR: + return config_GetAppDir (); + case VLC_DESKTOP_DIR: + case VLC_DOWNLOAD_DIR: + case VLC_TEMPLATES_DIR: + case VLC_PUBLICSHARE_DIR: + case VLC_DOCUMENTS_DIR: + case VLC_MUSIC_DIR: + case VLC_PICTURES_DIR: + case VLC_VIDEOS_DIR: +#warning FIXME not implemented + return config_GetUserDir (VLC_HOME_DIR);; + } + assert (0); +} diff --git a/src/config/dirs_win.c b/src/config/dirs_win.c new file mode 100644 index 0000000000..d80aecd413 --- /dev/null +++ b/src/config/dirs_win.c @@ -0,0 +1,140 @@ +/***************************************************************************** + * dirs.c: directories configuration + ***************************************************************************** + * Copyright (C) 2001-2007 the VideoLAN team + * Copyright © 2007-2008 Rémi Denis-Courmont + * + * Authors: Gildas Bazin + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#ifndef _WIN32_IE +# define _WIN32_IE 0x0501 +#endif +#include +#ifndef UNDER_CE +# include +#endif +#include + +#include "../libvlc.h" +#include +#include + +#include +#include + +const char *config_GetDataDir( void ) +{ + static char path[PATH_MAX] = ""; +#warning FIXME: thread-safety! + + if( *path == '\0' ) + strlcpy (path, psz_vlcpath, sizeof (path)); + return path; +} + +static const char *GetDir( bool b_common ) +{ + wchar_t wdir[MAX_PATH]; + +#if defined (UNDER_CE) + /*There are some errors in cegcc headers*/ +#undef SHGetSpecialFolderPath + BOOL WINAPI SHGetSpecialFolderPath(HWND,LPWSTR,int,BOOL); + if( SHGetSpecialFolderPath( NULL, wdir, CSIDL_APPDATA, 1 ) ) +#else + /* Get the "Application Data" folder for the current user */ + if( S_OK == SHGetFolderPathW( NULL, (b_common ? CSIDL_COMMON_APPDATA + : CSIDL_APPDATA) + | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, wdir ) ) +#endif + { + static char appdir[PATH_MAX] = ""; + static char comappdir[PATH_MAX] = ""; + WideCharToMultiByte (CP_UTF8, 0, wdir, -1, + b_common ? comappdir : appdir, + PATH_MAX, NULL, NULL); + return b_common ? comappdir : appdir; + } + return NULL; +} + +const char *config_GetConfDir( void ) +{ + return GetDir( true ); +} + +static char *config_GetHomeDir (void) +{ + wchar_t wdir[MAX_PATH]; + +#if defined (UNDER_CE) + /*There are some errors in cegcc headers*/ +#undef SHGetSpecialFolderPath + BOOL WINAPI SHGetSpecialFolderPath(HWND,LPWSTR,int,BOOL); + if (SHGetSpecialFolderPath (NULL, wdir, CSIDL_APPDATA, 1)) +#else + if (SHGetFolderPathW (NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, + NULL, SHGFP_TYPE_CURRENT, wdir ) == S_OK) +#endif + return FromWide (wdir); + return NULL; +} + +static char *config_GetAppDir (void) +{ + char *psz_dir; + const char *psz_parent = GetDir (false); + + if( asprintf( &psz_dir, "%s\\vlc", psz_parent ) == -1 ) + psz_dir = NULL; + return psz_dir; +} + +char *config_GetCacheDir( void ) +{ + return config_GetAppDir (); +} + +char *config_GetUserDir (vlc_userdir_t type) +{ + switch (type) + { + case VLC_HOME_DIR: + return config_GetHomeDir (); + case VLC_CONFIG_DIR: + return config_GetAppDir (); + case VLC_DATA_DIR: + return config_GetAppDir (); + case VLC_DESKTOP_DIR: + case VLC_DOWNLOAD_DIR: + case VLC_TEMPLATES_DIR: + case VLC_PUBLICSHARE_DIR: + case VLC_DOCUMENTS_DIR: + case VLC_MUSIC_DIR: + case VLC_PICTURES_DIR: + case VLC_VIDEOS_DIR: + return config_GetUserDir (VLC_HOME_DIR); + } + assert (0); +} diff --git a/src/config/dirs.c b/src/config/dirs_xdg.c similarity index 57% rename from src/config/dirs.c rename to src/config/dirs_xdg.c index d61506d6ed..d3a7ea214d 100644 --- a/src/config/dirs.c +++ b/src/config/dirs_xdg.c @@ -1,8 +1,8 @@ /***************************************************************************** - * dirs.c: directories configuration + * dirs_xdg.c: XDG directories configuration ***************************************************************************** * Copyright (C) 2001-2007 the VideoLAN team - * Copyright © 2007-2008 Rémi Denis-Courmont + * Copyright © 2007-2009 Rémi Denis-Courmont * * Authors: Gildas Bazin * @@ -27,123 +27,23 @@ #include -#if defined( WIN32 ) -# ifndef _WIN32_IE -# define _WIN32_IE 0x0501 -# endif -# include -#ifndef UNDER_CE -# include -#endif -# include -#else -# include -# include -#endif - #include "../libvlc.h" -#include "configuration.h" #include -#include -#include /* errno */ +#include +#include #include #include -#if defined( WIN32 ) -# define DIR_SHARE "" -#else -# define DIR_SHARE "share" -#endif - - /** - * config_GetDataDir: find directory where shared data is installed + * Determines the shared data directory * * @return a string (always succeeds). */ const char *config_GetDataDir( void ) { -#if defined (WIN32) || defined(__APPLE__) || defined (SYS_BEOS) - static char path[PATH_MAX] = ""; - - if( *path == '\0' ) - { - snprintf( path, sizeof( path ), "%s" DIR_SEP DIR_SHARE, psz_vlcpath ); - path[sizeof( path ) - 1] = '\0'; - } - return path; -#else return DATA_PATH; -#endif -} - -#if defined (WIN32) || defined(__APPLE__) || defined (SYS_BEOS) -static const char *GetDir( bool b_common ) -{ - /* FIXME: a full memory page here - quite a waste... */ - static char homedir[PATH_MAX] = ""; - -#if defined (WIN32) - wchar_t wdir[MAX_PATH]; - -# if defined (UNDER_CE) - /*There are some errors in cegcc headers*/ -#undef SHGetSpecialFolderPath - BOOL WINAPI SHGetSpecialFolderPath(HWND,LPWSTR,int,BOOL); - if( SHGetSpecialFolderPath( NULL, wdir, CSIDL_APPDATA, 1 ) ) -# else - /* Get the "Application Data" folder for the current user */ - if( S_OK == SHGetFolderPathW( NULL, (b_common ? CSIDL_COMMON_APPDATA - : CSIDL_APPDATA) - | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, wdir ) ) -# endif - { - static char appdir[PATH_MAX] = ""; - static char comappdir[PATH_MAX] = ""; - WideCharToMultiByte (CP_UTF8, 0, wdir, -1, - b_common ? comappdir : appdir, - PATH_MAX, NULL, NULL); - return b_common ? comappdir : appdir; - } -#else - (void)b_common; -#endif - -#ifdef LIBVLC_USE_PTHREAD - static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_lock (&lock); -#endif - - if (!*homedir) - { - const char *psz_localhome = getenv( "HOME" ); -#if defined(HAVE_GETPWUID_R) - char buf[sysconf (_SC_GETPW_R_SIZE_MAX)]; - if (psz_localhome == NULL) - { - struct passwd pw, *res; - - if (!getpwuid_r (getuid (), &pw, buf, sizeof (buf), &res) && res) - psz_localhome = pw.pw_dir; - } -#endif - if (psz_localhome == NULL) - psz_localhome = getenv( "TMP" ); - if (psz_localhome == NULL) - psz_localhome = "/tmp"; - - const char *uhomedir = FromLocale (psz_localhome); - strncpy (homedir, uhomedir, sizeof (homedir) - 1); - homedir[sizeof (homedir) - 1] = '\0'; - LocaleFree (uhomedir); - } -#ifdef LIBVLC_USE_PTHREAD - pthread_mutex_unlock (&lock); -#endif - return homedir; } -#endif /** * Determines the system configuration directory. @@ -152,26 +52,11 @@ static const char *GetDir( bool b_common ) */ const char *config_GetConfDir( void ) { -#if defined (WIN32) - return GetDir( true ); -#elif defined(__APPLE__) || defined (SYS_BEOS) - static char path[PATH_MAX] = ""; - - if( *path == '\0' ) - { - snprintf( path, sizeof( path ), "%s"DIR_SEP DIR_SHARE, /* FIXME: Duh? */ - psz_vlcpath ); - path[sizeof( path ) - 1] = '\0'; - } - return path; -#else return SYSCONFDIR; -#endif } static char *config_GetHomeDir (void) { -#ifndef WIN32 /* 1/ Try $HOME */ const char *home = getenv ("HOME"); #if defined(HAVE_GETPWUID_R) @@ -185,44 +70,15 @@ static char *config_GetHomeDir (void) home = pw.pw_dir; } #endif - /* 3/ Desperately try $TMP */ - if (home == NULL) - home = getenv( "TMP" ); - /* 4/ Beyond hope, hard-code /tmp */ - if (home == NULL) - home = "/tmp"; return FromLocaleDup (home); - -#else /* WIN32 */ - wchar_t wdir[MAX_PATH]; - -# if defined (UNDER_CE) - /*There are some errors in cegcc headers*/ -#undef SHGetSpecialFolderPath - BOOL WINAPI SHGetSpecialFolderPath(HWND,LPWSTR,int,BOOL); - if (SHGetSpecialFolderPath (NULL, wdir, CSIDL_APPDATA, 1)) -# else - if (SHGetFolderPathW (NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, - NULL, SHGFP_TYPE_CURRENT, wdir ) == S_OK) -# endif - return FromWide (wdir); - return NULL; -#endif } static char *config_GetAppDir (const char *xdg_name, const char *xdg_default) { char *psz_dir; -#if defined(WIN32) || defined(__APPLE__) || defined(SYS_BEOS) - const char *psz_parent = GetDir (false); - - if( asprintf( &psz_dir, "%s" DIR_SEP CONFIG_DIR, psz_parent ) == -1 ) - psz_dir = NULL; - - (void)xdg_name; (void)xdg_default; -#else char var[sizeof ("XDG__HOME") + strlen (xdg_name)]; + /* XDG Base Directory Specification - Version 0.6 */ snprintf (var, sizeof (var), "XDG_%s_HOME", xdg_name); @@ -240,16 +96,11 @@ static char *config_GetAppDir (const char *xdg_name, const char *xdg_default) || asprintf( &psz_dir, "%s/%s/vlc", psz_home, xdg_default ) == -1 ) psz_dir = NULL; free (psz_home); -#endif return psz_dir; } static char *config_GetTypeDir (const char *xdg_name) { -#if defined(WIN32) || defined(__APPLE__) || defined(SYS_BEOS) - (void)xdg_name; - return config_GetAppDir (NULL, NULL); -#else const size_t namelen = strlen (xdg_name); const char *home = getenv ("HOME"); const size_t homelen = strlen (home); @@ -345,7 +196,6 @@ done: char *ret = FromLocaleDup (path); free (path); return ret; -#endif } @@ -355,17 +205,7 @@ done: */ char *config_GetCacheDir( void ) { -#if defined(__APPLE__) - char *psz_dir; - const char *psz_parent = GetDir (false); - - if( asprintf( &psz_dir, "%s" DIR_SEP CACHES_DIR, psz_parent ) == -1 ) - psz_dir = NULL; - - return psz_dir; -#else return config_GetAppDir ("CACHE", ".cache"); -#endif } char *config_GetUserDir (vlc_userdir_t type) diff --git a/src/config/file.c b/src/config/file.c index 84ebec6abc..1da0a698ab 100644 --- a/src/config/file.c +++ b/src/config/file.c @@ -92,7 +92,7 @@ static FILE *config_OpenConfigFile( vlc_object_t *p_obj ) char *psz_old; if( home != NULL - && asprintf( &psz_old, "%s" DIR_SEP CONFIG_DIR DIR_SEP CONFIG_FILE, + && asprintf( &psz_old, "%s/.vlc/" CONFIG_FILE, home ) != -1 ) { p_stream = utf8_fopen( psz_old, "rt" ); @@ -103,7 +103,7 @@ static FILE *config_OpenConfigFile( vlc_object_t *p_obj ) msg_Info( p_obj->p_libvlc, "Found old config file at %s. " "VLC will now use %s.", psz_old, psz_filename ); char *psz_readme; - if( asprintf(&psz_readme,"%s"DIR_SEP CONFIG_DIR DIR_SEP"README", + if( asprintf(&psz_readme,"%s/.vlc/README", home ) != -1 ) { FILE *p_readme = utf8_fopen( psz_readme, "wt" );