-static const char *GetDir( bool b_appdata, bool b_common_appdata )
-{
- /* 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)
- if( SHGetSpecialFolderPath( NULL, wdir, CSIDL_APPDATA, 1 ) )
-# else
- /* Get the "Application Data" folder for the current user */
- if( S_OK == SHGetFolderPathW( NULL,
- ( b_appdata ? CSIDL_APPDATA :
- ( b_common_appdata ? CSIDL_COMMON_APPDATA: CSIDL_PERSONAL ) )
- | 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_appdata ? appdir :
- (b_common_appdata ? comappdir :homedir),
- PATH_MAX, NULL, NULL);
- return b_appdata ? appdir : (b_common_appdata ? comappdir :homedir);
- }
-#else
- (void)b_appdata;
- (void)b_common_appdata;
-#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;
-}