Resolve any bundle paths we are given when the specified executable is a bundle.
authorGreg Clayton <gclayton@apple.com>
Wed, 31 Oct 2012 21:44:39 +0000 (21:44 +0000)
committerGreg Clayton <gclayton@apple.com>
Wed, 31 Oct 2012 21:44:39 +0000 (21:44 +0000)
llvm-svn: 167175

lldb/tools/debugserver/source/DNB.cpp
lldb/tools/debugserver/source/MacOSX/CFBundle.cpp
lldb/tools/debugserver/source/MacOSX/CFBundle.h

index 4df1148..bb5e72c 100644 (file)
@@ -31,6 +31,8 @@
 #include "DNBDataRef.h"
 #include "DNBThreadResumeActions.h"
 #include "DNBTimer.h"
+#include "CFBundle.h"
+
 
 typedef STD_SHARED_PTR(MachProcess) MachProcessSP;
 typedef std::map<nub_process_t, MachProcessSP> ProcessMap;
@@ -2097,6 +2099,21 @@ DNBResolveExecutablePath (const char *path, char *resolved_path, size_t resolved
 
     if (result.empty())
         result = path;
+    
+    struct stat path_stat;
+    if (::stat(path, &path_stat) == 0)
+    {
+        if ((path_stat.st_mode & S_IFMT) == S_IFDIR)
+        {
+            CFBundle bundle (path);
+            CFReleaser<CFURLRef> url(bundle.CopyExecutableURL ());
+            if (url.get())
+            {
+                if (::CFURLGetFileSystemRepresentation (url.get(), true, (UInt8*)resolved_path, resolved_path_size))
+                    return true;
+            }
+        }
+    }
 
     if (realpath(path, max_path))
     {
index a157550..fdcb7cc 100644 (file)
@@ -85,3 +85,13 @@ CFBundle::GetIdentifier () const
         return ::CFBundleGetIdentifier (bundle);
     return NULL;
 }
+
+
+CFURLRef
+CFBundle::CopyExecutableURL () const
+{
+    CFBundleRef bundle = get();
+    if (bundle != NULL)
+        return CFBundleCopyExecutableURL(bundle);
+    return NULL;
+}
index d980c0b..e08290a 100644 (file)
@@ -25,11 +25,17 @@ public:
     CFBundle(const char *path = NULL);
     CFBundle(const CFBundle& rhs);
     CFBundle& operator=(const CFBundle& rhs);
-    virtual ~CFBundle();
+    virtual
+    ~CFBundle();
+    bool
+    SetPath (const char *path);
 
-        bool SetPath (const char *path);
-        CFStringRef GetIdentifier () const;
+    CFStringRef
+    GetIdentifier () const;
 
+    CFURLRef
+    CopyExecutableURL () const;
+    
 protected:
         CFReleaser<CFURLRef> m_bundle_url;
 };