[vlc-commits] src: fix lib dir lookup on OS X if vlc is not part of any Mac-style package ( close #11681)

Felix Paul Kühne git at videolan.org
Sat Jul 12 19:44:24 CEST 2014


vlc/vlc-2.2 | branch: master | Felix Paul Kühne <fkuehne at videolan.org> | Sat Jul 12 13:42:55 2014 +0200| [1dfa595dc8ac4b57912f38fb7126fc3d8eab3ba1] | committer: Felix Paul Kühne

src: fix lib dir lookup on OS X if vlc is not part of any Mac-style package (close #11681)

(cherry picked from commit 7359eb80ba5a2ed37979935688a516098a897678)

> http://git.videolan.org/gitweb.cgi/vlc/vlc-2.2.git/?a=commit;h=1dfa595dc8ac4b57912f38fb7126fc3d8eab3ba1
---

 src/darwin/dirs.c |   71 +++++++++++++++++++----------------------------------
 1 file changed, 25 insertions(+), 46 deletions(-)

diff --git a/src/darwin/dirs.c b/src/darwin/dirs.c
index 83c27a4..1041b6b 100644
--- a/src/darwin/dirs.c
+++ b/src/darwin/dirs.c
@@ -42,7 +42,7 @@
 # define MAXPATHLEN 1024
 #endif
 
-static char *config_GetLibPath (void)
+char *config_GetLibDir (void)
 {
     /* Get the full program path and name */
     /* First try to see if we are linked to the framework */
@@ -54,54 +54,37 @@ static char *config_GetLibPath (void)
         /* Check for "VLCKit.framework/Versions/Current/VLCKit",
          * as well as "VLCKit.framework/Versions/A/VLCKit" and
          * "VLC.framework/Versions/B/VLCKit" */
-        if( p != NULL )
-        {
+        if (p != NULL) {
             /* Look for the next forward slash */
             p += 26; /* p_char += strlen(" VLCKit.framework/Versions/" ) */
             p += strcspn( p, "/" );
 
-            /* If the string ends with VLC then we've found a winner */
-            if ( !strcmp( p, "/VLCKit" ) )
-                return strdup( psz_img_name );
+            /* If the string ends with VLCKit then we've found a winner */
+            if (!strcmp( p, "/VLCKit"))
+                return strdup( dirname(psz_img_name) );
         }
 
         /* Do we end by "VLC"? If so we are the legacy VLC.app that doesn't
          * link to VLCKit. */
         size_t len = strlen(psz_img_name);
-        if( len >= 3 && !strcmp( psz_img_name + len - 3, "VLC") )
-            return strdup( psz_img_name );
+        if (len >= 3 && !strcmp( psz_img_name + len - 3, "VLC"))
+            return strdup( dirname(psz_img_name) );
 
         /* Do we end by "VLC-Plugin"? oh, we must be the NPAPI plugin */
-        if( len >= 10 && !strcmp( psz_img_name + len - 10, "VLC-Plugin") )
-            return strdup( psz_img_name );
+        if (len >= 10 && !strcmp( psz_img_name + len - 10, "VLC-Plugin"))
+            return strdup( dirname(psz_img_name) );
     }
 
-    /* We are not linked to the VLC.framework, let's use dladdr to figure
-     * libvlc path */
+    /* we are not part of any Mac-style package but were installed
+     * the UNIX way. let's trick-around a bit */
     Dl_info info;
-    if( dladdr(system_Init, &info) )
-        return strdup(dirname( info.dli_fname ));
-
-    char path[MAXPATHLEN+1];
-    uint32_t path_len = sizeof(path) - 1;
-
-    if ( !_NSGetExecutablePath(path, &path_len) )
-        return strdup(path);
-    return NULL;
-}
-
-char *config_GetLibDir (void)
-{
-    char *path = config_GetLibPath ();
-    if (path != NULL)
-    {
-        char *p = strrchr (path, '/');
-        if (p != NULL)
-        {
-            *p = '\0';
-            return path;
-        }
-        free (path);
+    if (dladdr(system_Init, &info)) {
+        char *incompletepath = strdup(dirname( (char *)info.dli_fname ));
+        char *path = NULL;
+        asprintf(&path, "%s/"PACKAGE, incompletepath);
+        free(incompletepath);
+        printf("final path %s\n", path);
+        return path;
     }
 
     /* should never happen */
@@ -137,8 +120,7 @@ static char *config_GetHomeDir (void)
 static char *getAppDependentDir(vlc_userdir_t type)
 {
     const char *psz_path;
-    switch (type)
-    {
+    switch (type) {
         case VLC_CONFIG_DIR:
             psz_path = "%s/Library/Preferences/%s";
             break;
@@ -158,11 +140,9 @@ static char *getAppDependentDir(vlc_userdir_t type)
     const char *name = "org.videolan.vlc";
 
     CFBundleRef mainBundle = CFBundleGetMainBundle();
-    if (mainBundle)
-    {
+    if (mainBundle) {
         CFStringRef identifierAsNS = CFBundleGetIdentifier(mainBundle);
-        if (identifierAsNS)
-        {
+        if (identifierAsNS) {
             char identifier[256];
             Boolean ret = CFStringGetCString(identifierAsNS, identifier, sizeof(identifier), kCFStringEncodingUTF8);
             if (ret)
@@ -172,7 +152,7 @@ static char *getAppDependentDir(vlc_userdir_t type)
 
     char *psz_parent = config_GetHomeDir ();
     char *psz_dir;
-    if( asprintf( &psz_dir, psz_path, psz_parent, name) == -1 )
+    if ( asprintf( &psz_dir, psz_path, psz_parent, name) == -1 )
         psz_dir = NULL;
     free(psz_parent);
 
@@ -182,8 +162,7 @@ static char *getAppDependentDir(vlc_userdir_t type)
 char *config_GetUserDir (vlc_userdir_t type)
 {
     const char *psz_path;
-    switch (type)
-    {
+    switch (type) {
         case VLC_CONFIG_DIR:
         case VLC_TEMPLATES_DIR:
         case VLC_DATA_DIR:
@@ -215,9 +194,9 @@ char *config_GetUserDir (vlc_userdir_t type)
         default:
             psz_path = "%s";
     }
-    char *psz_parent = config_GetHomeDir ();
+    char *psz_parent = config_GetHomeDir();
     char *psz_dir;
-    if( asprintf( &psz_dir, psz_path, psz_parent ) == -1 )
+    if (asprintf( &psz_dir, psz_path, psz_parent ) == -1)
         psz_dir = NULL;
     free(psz_parent);
     return psz_dir;



More information about the vlc-commits mailing list