Resolve any bundle paths we are given when the specified executable is a bundle.

llvm-svn: 167175
This commit is contained in:
Greg Clayton 2012-10-31 21:44:39 +00:00
parent 4cb8cdab5e
commit 48baf7a788
3 changed files with 36 additions and 3 deletions

View 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))
{

View 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;
}

View 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;
};