1 /*****************************************************************************
2 * darwin_dirs.c: Mac OS X directories configuration
3 *****************************************************************************
4 * Copyright (C) 2001-2009 VLC authors and VideoLAN
5 * Copyright © 2007-2012 Rémi Denis-Courmont
7 * Authors: Gildas Bazin <gbazin@videolan.org>
8 * Felix Paul Kühne <fkuehne at videolan dot org>
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU Lesser General Public License as published by
12 * the Free Software Foundation; either version 2.1 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public License
21 * along with this program; if not, write to the Free Software Foundation,
22 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
25 #include <CoreFoundation/CoreFoundation.h>
31 #include <vlc_common.h>
33 #include "../libvlc.h"
34 #include <vlc_charset.h>
35 #include <vlc_configuration.h>
36 #include "config/configuration.h"
40 #include <mach-o/dyld.h>
43 # define MAXPATHLEN 1024
46 static char *configdir = NULL;
48 static pthread_once_t once = PTHREAD_ONCE_INIT;
50 static void init_dirs( void )
52 configdir = config_GetUserDir(VLC_CONFIG_DIR);
55 const char *config_GetConfDir( void )
57 pthread_once(&once, init_dirs);
61 static char *config_GetLibPath (void)
63 /* Get the full program path and name */
64 /* First try to see if we are linked to the framework */
65 for (unsigned i = 0; i < _dyld_image_count(); i++)
67 const char *psz_img_name = _dyld_get_image_name(i);
68 const char *p = strstr( psz_img_name, "VLCKit.framework/Versions/" );
70 /* Check for "VLCKit.framework/Versions/Current/VLCKit",
71 * as well as "VLCKit.framework/Versions/A/VLCKit" and
72 * "VLC.framework/Versions/B/VLCKit" */
75 /* Look for the next forward slash */
76 p += 26; /* p_char += strlen(" VLCKit.framework/Versions/" ) */
77 p += strcspn( p, "/" );
79 /* If the string ends with VLC then we've found a winner */
80 if ( !strcmp( p, "/VLCKit" ) )
81 return strdup( psz_img_name );
84 /* Do we end by "VLC"? If so we are the legacy VLC.app that doesn't
86 size_t len = strlen(psz_img_name);
87 if( len >= 3 && !strcmp( psz_img_name + len - 3, "VLC") )
88 return strdup( psz_img_name );
91 /* We are not linked to the VLC.framework, let's use dladdr to figure
94 if( dladdr(system_Init, &info) )
95 return strdup(dirname( info.dli_fname ));
97 char path[MAXPATHLEN+1];
98 uint32_t path_len = sizeof(path) - 1;
100 if ( !_NSGetExecutablePath(path, &path_len) )
105 char *config_GetLibDir (void)
107 char *path = config_GetLibPath ();
110 char *p = strrchr (p, '/');
119 /* should never happen */
123 char *config_GetDataDirDefault (void)
125 char *vlcpath = config_GetLibDir ();
128 if (asprintf (&datadir, "%s/share", vlcpath) == -1)
135 static char *config_GetHomeDir (void)
137 const char *home = getenv ("HOME");
142 return FromLocaleDup (home);
145 static char *getAppDependentDir(vlc_userdir_t type)
147 const char *psz_path;
151 psz_path = "%s/Library/Preferences/%s";
153 case VLC_TEMPLATES_DIR:
155 psz_path = "%s/Library/Application Support/%s";
158 psz_path = "%s/Library/Caches/%s";
166 const char *name = "org.videolan.vlc";
168 CFBundleRef mainBundle = CFBundleGetMainBundle();
171 CFStringRef identifierAsNS = CFBundleGetIdentifier(mainBundle);
174 char identifier[256];
175 Boolean ret = CFStringGetCString(identifierAsNS, identifier, sizeof(identifier), kCFStringEncodingUTF8);
181 char *psz_parent = config_GetHomeDir ();
183 if( asprintf( &psz_dir, psz_path, psz_parent, name) == -1 )
190 char *config_GetUserDir (vlc_userdir_t type)
192 const char *psz_path;
196 case VLC_TEMPLATES_DIR:
199 return getAppDependentDir(type);
201 case VLC_DESKTOP_DIR:
202 psz_path = "%s/Desktop";
204 case VLC_DOWNLOAD_DIR:
205 psz_path = "%s/Downloads";
207 case VLC_DOCUMENTS_DIR:
208 psz_path = "%s/Documents";
211 psz_path = "%s/Music";
213 case VLC_PICTURES_DIR:
214 psz_path = "%s/Pictures";
217 psz_path = "%s/Movies";
219 case VLC_PUBLICSHARE_DIR:
220 psz_path = "%s/Public";
226 char *psz_parent = config_GetHomeDir ();
228 if( asprintf( &psz_dir, psz_path, psz_parent ) == -1 )