Tracking modules down when you have a UUID and a path has been improved. DynamicLoaderDarwinKernel no longer parses mach-o load commands and it now uses the memory based modules now that we can load modules from memory. Added a target setting named "target.exec-search-paths" which can be used to supply a list of directories to use when trying to look for executables. This allows one or more directories to be used when searching for modules that may not exist in the SDK/PDK. The target automatically adds the directory for the main executable to this list so this should help us in tracking down shared libraries and other binaries. llvm-svn: 150426
100 lines
2.7 KiB
C++
100 lines
2.7 KiB
C++
//===-- CFCBundle.cpp -------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "CFCBundle.h"
|
|
#include "CFCString.h"
|
|
|
|
//----------------------------------------------------------------------
|
|
// CFCBundle constructor
|
|
//----------------------------------------------------------------------
|
|
CFCBundle::CFCBundle(const char *path) :
|
|
CFCReleaser<CFBundleRef>()
|
|
{
|
|
if (path && path[0])
|
|
SetPath(path);
|
|
}
|
|
|
|
CFCBundle::CFCBundle(CFURLRef url) :
|
|
CFCReleaser<CFBundleRef>(url ? CFBundleCreate(NULL, url) : NULL)
|
|
{
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// Destructor
|
|
//----------------------------------------------------------------------
|
|
CFCBundle::~CFCBundle()
|
|
{
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// Set the path for a bundle by supplying a
|
|
//----------------------------------------------------------------------
|
|
bool
|
|
CFCBundle::SetPath (const char *path)
|
|
{
|
|
CFAllocatorRef alloc = kCFAllocatorDefault;
|
|
// Release our old bundle and URL
|
|
reset();
|
|
|
|
// Make a CFStringRef from the supplied path
|
|
CFCString cf_path;
|
|
cf_path.SetFileSystemRepresentation(path);
|
|
if (cf_path.get())
|
|
{
|
|
// Make our Bundle URL
|
|
CFCReleaser<CFURLRef> bundle_url (::CFURLCreateWithFileSystemPath (alloc, cf_path.get(), kCFURLPOSIXPathStyle, true));
|
|
if (bundle_url.get())
|
|
reset (::CFBundleCreate (alloc, bundle_url.get()));
|
|
}
|
|
return get() != NULL;
|
|
}
|
|
|
|
bool
|
|
CFCBundle::GetPath (char *dst, size_t dst_len)
|
|
{
|
|
CFBundleRef bundle = get();
|
|
if (bundle)
|
|
{
|
|
CFCReleaser<CFURLRef> bundle_url (CFBundleCopyBundleURL (bundle));
|
|
if (bundle_url.get())
|
|
{
|
|
Boolean resolveAgainstBase = 0;
|
|
return ::CFURLGetFileSystemRepresentation (bundle_url.get(), resolveAgainstBase, (UInt8 *)dst, dst_len) != 0;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
CFStringRef
|
|
CFCBundle::GetIdentifier () const
|
|
{
|
|
CFBundleRef bundle = get();
|
|
if (bundle != NULL)
|
|
return ::CFBundleGetIdentifier (bundle);
|
|
return NULL;
|
|
}
|
|
|
|
CFTypeRef
|
|
CFCBundle::GetValueForInfoDictionaryKey(CFStringRef key) const
|
|
{
|
|
CFBundleRef bundle = get();
|
|
if (bundle != NULL)
|
|
return ::CFBundleGetValueForInfoDictionaryKey(bundle, key);
|
|
return NULL;
|
|
}
|
|
|
|
CFURLRef
|
|
CFCBundle::CopyExecutableURL () const
|
|
{
|
|
CFBundleRef bundle = get();
|
|
if (bundle != NULL)
|
|
return CFBundleCopyExecutableURL(bundle);
|
|
return NULL;
|
|
}
|