diff options
Diffstat (limited to 'src/common/mac/macho_id.cc')
-rw-r--r-- | src/common/mac/macho_id.cc | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/src/common/mac/macho_id.cc b/src/common/mac/macho_id.cc index 44e78205..ce0ecff3 100644 --- a/src/common/mac/macho_id.cc +++ b/src/common/mac/macho_id.cc @@ -52,17 +52,24 @@ extern "C" { // necessary for Leopard namespace MacFileUtilities { MachoID::MachoID(const char *path) - : file_(0), + : memory_(0), + memory_size_(0), + crc_(0), + md5_context_(), + update_function_(NULL) { + strlcpy(path_, path, sizeof(path_)); +} + +MachoID::MachoID(const char *path, void *memory, size_t size) + : memory_(memory), + memory_size_(size), crc_(0), md5_context_(), update_function_(NULL) { strlcpy(path_, path, sizeof(path_)); - file_ = open(path, O_RDONLY); } MachoID::~MachoID() { - if (file_ != -1) - close(file_); } // The CRC info is from http://en.wikipedia.org/wiki/Adler-32 @@ -144,10 +151,8 @@ void MachoID::Update(MachoWalker *walker, off_t offset, size_t size) { bool MachoID::UUIDCommand(int cpu_type, unsigned char bytes[16]) { struct breakpad_uuid_command uuid_cmd; - MachoWalker walker(path_, UUIDWalkerCB, &uuid_cmd); - uuid_cmd.cmd = 0; - if (!walker.WalkHeader(cpu_type)) + if (!WalkHeader(cpu_type, UUIDWalkerCB, &uuid_cmd)) return false; // If we found the command, we'll have initialized the uuid_command @@ -162,10 +167,8 @@ bool MachoID::UUIDCommand(int cpu_type, unsigned char bytes[16]) { bool MachoID::IDCommand(int cpu_type, unsigned char identifier[16]) { struct dylib_command dylib_cmd; - MachoWalker walker(path_, IDWalkerCB, &dylib_cmd); - dylib_cmd.cmd = 0; - if (!walker.WalkHeader(cpu_type)) + if (!WalkHeader(cpu_type, IDWalkerCB, &dylib_cmd)) return false; // If we found the command, we'll have initialized the dylib_command @@ -204,29 +207,39 @@ bool MachoID::IDCommand(int cpu_type, unsigned char identifier[16]) { } uint32_t MachoID::Adler32(int cpu_type) { - MachoWalker walker(path_, WalkerCB, this); update_function_ = &MachoID::UpdateCRC; crc_ = 0; - if (!walker.WalkHeader(cpu_type)) + if (!WalkHeader(cpu_type, WalkerCB, this)) return 0; return crc_; } bool MachoID::MD5(int cpu_type, unsigned char identifier[16]) { - MachoWalker walker(path_, WalkerCB, this); update_function_ = &MachoID::UpdateMD5; MD5Init(&md5_context_); - if (!walker.WalkHeader(cpu_type)) + if (!WalkHeader(cpu_type, WalkerCB, this)) return false; MD5Final(identifier, &md5_context_); return true; } +bool MachoID::WalkHeader(int cpu_type, + MachoWalker::LoadCommandCallback callback, + void *context) { + if (memory_) { + MachoWalker walker(memory_, memory_size_, callback, context); + return walker.WalkHeader(cpu_type); + } else { + MachoWalker walker(path_, callback, context); + return walker.WalkHeader(cpu_type); + } +} + // static bool MachoID::WalkerCB(MachoWalker *walker, load_command *cmd, off_t offset, bool swap, void *context) { |