Changeset b152c831cf6bd6dab1fe8e29859ea85d9f384022

Show
Ignore:
Timestamp:
22/05/08 20:29:04 (5 months ago)
Author:
Rémi Denis-Courmont <rem@videolan.org>
git-committer:
Rémi Denis-Courmont <rem@videolan.org> 1211480944 +0300
git-parent:

[eef284f3b6e266ffc7f82a2f447f74d5813afbc1]

git-author:
Rémi Denis-Courmont <rem@videolan.org> 1211476692 +0300
Message:

Store the home directory statically, as it cannot change

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/config/dirs.c

    re104a2e rb152c83  
    9191} 
    9292 
    93 static char *GetDir( bool b_appdata ) 
    94 
    95     const char *psz_localhome = NULL; 
    96  
    97 #if defined(WIN32) && !defined(UNDER_CE) 
    98     wchar_t whomedir[MAX_PATH]; 
     93static const char *GetDir( bool b_appdata ) 
     94
     95    static char homedir[PATH_MAX] = ""; 
     96 
     97#if defined (WIN32) 
     98    wchar_t wdir[MAX_PATH]; 
     99 
     100# if defined (UNDER_CE) 
     101    if( SHGetSpecialFolderPath( NULL, wdir, CSIDL_APPDATA, 1 ) ) 
     102# else 
    99103    /* Get the "Application Data" folder for the current user */ 
    100104    if( S_OK == SHGetFolderPathW( NULL, 
    101105              (b_appdata ? CSIDL_APPDATA : CSIDL_PROFILE) | CSIDL_FLAG_CREATE, 
    102                                   NULL, SHGFP_TYPE_CURRENT, whomedir ) ) 
    103         return FromWide( whomedir ); 
    104  
    105 #elif defined(UNDER_CE) 
     106                                  NULL, SHGFP_TYPE_CURRENT, wdir ) ) 
     107# endif 
     108    { 
     109        static char appdir[PATH_MAX] = ""; 
     110        WideCharToMultiByte (CP_UTF8, 0, wdir, -1, 
     111                             b_appdata ? appdir : homedir, PATH_MAX, 
     112                             NULL, NULL); 
     113        return b_appdata ? appdir : homedir; 
     114    } 
     115#else 
    106116    (void)b_appdata; 
    107 #ifndef CSIDL_APPDATA 
    108 #   define CSIDL_APPDATA 0x1A 
    109 #endif 
    110  
    111     wchar_t whomedir[MAX_PATH]; 
    112  
    113     /* get the "Application Data" folder for the current user */ 
    114     if( SHGetSpecialFolderPath( NULL, whomedir, CSIDL_APPDATA, 1 ) ) 
    115         return FromWide( whomedir ); 
    116 #else 
    117     (void)b_appdata; 
    118 #endif 
    119  
    120     psz_localhome = getenv( "HOME" ); 
     117#endif 
     118 
     119#ifdef LIBVLC_USE_PTHREAD 
     120    static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 
     121    pthread_mutex_lock (&lock); 
     122#endif 
     123 
     124    if (!*homedir) 
     125    { 
     126        const char *psz_localhome = getenv( "HOME" ); 
    121127#if defined(HAVE_GETPWUID_R) 
    122     char buf[sysconf (_SC_GETPW_R_SIZE_MAX)]; 
    123     if( psz_localhome == NULL ) 
    124     { 
    125         struct passwd pw, *res; 
    126  
    127         if (!getpwuid_r (getuid (), &pw, buf, sizeof (buf), &res) && res) 
    128             psz_localhome = pw.pw_dir; 
    129     } 
    130 #endif 
    131     if (psz_localhome == NULL) 
    132         psz_localhome = getenv( "TMP" ); 
    133     if (psz_localhome == NULL) 
    134         psz_localhome = "/tmp"; 
    135  
    136     return FromLocaleDup( psz_localhome ); 
     128        char buf[sysconf (_SC_GETPW_R_SIZE_MAX)]; 
     129        if (psz_localhome == NULL) 
     130        { 
     131            struct passwd pw, *res; 
     132 
     133            if (!getpwuid_r (getuid (), &pw, buf, sizeof (buf), &res) && res) 
     134                psz_localhome = pw.pw_dir; 
     135        } 
     136#endif 
     137        if (psz_localhome == NULL) 
     138            psz_localhome = getenv( "TMP" ); 
     139        if (psz_localhome == NULL) 
     140            psz_localhome = "/tmp"; 
     141 
     142        const char *uhomedir = FromLocale (psz_localhome); 
     143        strncpy (homedir, uhomedir, sizeof (homedir) - 1); 
     144        homedir[sizeof (homedir) - 1] = '\0'; 
     145        LocaleFree (uhomedir); 
     146    } 
     147#ifdef LIBVLC_USE_PTHREAD 
     148    pthread_mutex_unlock (&lock); 
     149#endif 
     150    return homedir; 
    137151} 
    138152 
     
    142156char *config_GetHomeDir( void ) 
    143157{ 
    144     return GetDir( false ); 
     158    return strdup (GetDir( false )); 
    145159} 
    146160 
     
    149163    char *psz_dir; 
    150164#if defined(WIN32) || defined(__APPLE__) || defined(SYS_BEOS) 
    151     char *psz_parent = GetDir (true); 
     165    char *psz_parent = strdup (GetDir (true)); 
    152166 
    153167    if( asprintf( &psz_dir, "%s" DIR_SEP CONFIG_DIR, psz_parent ) == -1 )