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_configuration.h>
35 #include "config/configuration.h"
39 #include <mach-o/dyld.h>
42 # define MAXPATHLEN 1024
45 static char *configdir = NULL;
47 static pthread_once_t once = PTHREAD_ONCE_INIT;
49 static void init_dirs( void )
51 configdir = config_GetUserDir(VLC_CONFIG_DIR);
54 const char *config_GetConfDir( void )
56 pthread_once(&once, init_dirs);
60 static char *config_GetLibPath (void)
62 /* Get the full program path and name */
63 /* First try to see if we are linked to the framework */
64 for (unsigned i = 0; i < _dyld_image_count(); i++)
66 const char *psz_img_name = _dyld_get_image_name(i);
67 const char *p = strstr( psz_img_name, "VLCKit.framework/Versions/" );
69 /* Check for "VLCKit.framework/Versions/Current/VLCKit",
70 * as well as "VLCKit.framework/Versions/A/VLCKit" and
71 * "VLC.framework/Versions/B/VLCKit" */
74 /* Look for the next forward slash */
75 p += 26; /* p_char += strlen(" VLCKit.framework/Versions/" ) */
76 p += strcspn( p, "/" );
78 /* If the string ends with VLC then we've found a winner */
79 if ( !strcmp( p, "/VLCKit" ) )
80 return strdup( psz_img_name );
83 /* Do we end by "VLC"? If so we are the legacy VLC.app that doesn't
85 size_t len = strlen(psz_img_name);
86 if( len >= 3 && !strcmp( psz_img_name + len - 3, "VLC") )
87 return strdup( psz_img_name );
90 /* We are not linked to the VLC.framework, let's use dladdr to figure
93 if( dladdr(system_Init, &info) )
94 return strdup(dirname( info.dli_fname ));
96 char path[MAXPATHLEN+1];
97 uint32_t path_len = sizeof(path) - 1;
99 if ( !_NSGetExecutablePath(path, &path_len) )
104 char *config_GetLibDir (void)
106 char *path = config_GetLibPath ();
109 char *p = strrchr (path, '/');
118 /* should never happen */
122 char *config_GetDataDirDefault (void)
124 char *vlcpath = config_GetLibDir ();
127 if (asprintf (&datadir, "%s/share", vlcpath) == -1)
134 static char *config_GetHomeDir (void)
136 const char *home = getenv ("HOME");
141 return strdup (home);
144 static char *getAppDependentDir(vlc_userdir_t type)
146 const char *psz_path;
150 psz_path = "%s/Library/Preferences/%s";
152 case VLC_TEMPLATES_DIR:
154 psz_path = "%s/Library/Application Support/%s";
157 psz_path = "%s/Library/Caches/%s";
165 const char *name = "org.videolan.vlc";
167 CFBundleRef mainBundle = CFBundleGetMainBundle();
170 CFStringRef identifierAsNS = CFBundleGetIdentifier(mainBundle);
173 char identifier[256];
174 Boolean ret = CFStringGetCString(identifierAsNS, identifier, sizeof(identifier), kCFStringEncodingUTF8);
180 char *psz_parent = config_GetHomeDir ();
182 if( asprintf( &psz_dir, psz_path, psz_parent, name) == -1 )
189 char *config_GetUserDir (vlc_userdir_t type)
191 const char *psz_path;
195 case VLC_TEMPLATES_DIR:
198 return getAppDependentDir(type);
200 case VLC_DESKTOP_DIR:
201 psz_path = "%s/Desktop";
203 case VLC_DOWNLOAD_DIR:
204 psz_path = "%s/Downloads";
206 case VLC_DOCUMENTS_DIR:
207 psz_path = "%s/Documents";
210 psz_path = "%s/Music";
212 case VLC_PICTURES_DIR:
213 psz_path = "%s/Pictures";
216 psz_path = "%s/Movies";
218 case VLC_PUBLICSHARE_DIR:
219 psz_path = "%s/Public";
225 char *psz_parent = config_GetHomeDir ();
227 if( asprintf( &psz_dir, psz_path, psz_parent ) == -1 )