Error File::Read (size_t &num_bytes, off_t &offset, bool null_terminate, DataBufferSP &data_buffer_sp) { Error error; if (num_bytes > 0) { int fd = GetDescriptor(); if (fd != kInvalidDescriptor) { struct stat file_stats; if (::fstat (fd, &file_stats) == 0) { if (file_stats.st_size > offset) { const size_t bytes_left = file_stats.st_size - offset; if (num_bytes > bytes_left) num_bytes = bytes_left; size_t num_bytes_plus_nul_char = num_bytes + (null_terminate ? 1 : 0); std::unique_ptr<DataBufferHeap> data_heap_ap; data_heap_ap.reset(new DataBufferHeap()); data_heap_ap->SetByteSize(num_bytes_plus_nul_char); if (data_heap_ap.get()) { error = Read (data_heap_ap->GetBytes(), num_bytes, offset); if (error.Success()) { // Make sure we read exactly what we asked for and if we got // less, adjust the array if (num_bytes_plus_nul_char < data_heap_ap->GetByteSize()) data_heap_ap->SetByteSize(num_bytes_plus_nul_char); data_buffer_sp.reset(data_heap_ap.release()); return error; } } } else error.SetErrorString("file is empty"); } else error.SetErrorToErrno(); } else error.SetErrorString("invalid file handle"); } else error.SetErrorString("invalid file handle"); num_bytes = 0; data_buffer_sp.reset(); return error; }
bool RegisterContextPOSIXProcessMonitor_x86_64::ReadAllRegisterValues(DataBufferSP &data_sp) { bool success = false; data_sp.reset (new DataBufferHeap (REG_CONTEXT_SIZE, 0)); if (data_sp && ReadGPR () && ReadFPR ()) { uint8_t *dst = data_sp->GetBytes(); success = dst != 0; if (success) { ::memcpy (dst, &m_gpr, GetGPRSize()); dst += GetGPRSize(); } if (GetFPRType() == eFXSAVE) ::memcpy (dst, &m_fpr.xstate.fxsave, sizeof(m_fpr.xstate.fxsave)); if (GetFPRType() == eXSAVE) { ByteOrder byte_order = GetByteOrder(); // Assemble the YMM register content from the register halves. for (uint32_t reg = fpu_ymm0; success && reg <= fpu_ymm15; ++reg) success = CopyXSTATEtoYMM(reg, byte_order); if (success) { // Copy the extended register state including the assembled ymm registers. ::memcpy (dst, &m_fpr, sizeof(m_fpr)); } } } return success; }
bool RegisterContextPOSIXProcessMonitor_powerpc::ReadAllRegisterValues( DataBufferSP &data_sp) { bool success = false; data_sp.reset(new DataBufferHeap(REG_CONTEXT_SIZE, 0)); if (data_sp && ReadGPR() && ReadFPR()) { uint8_t *dst = data_sp->GetBytes(); success = dst != 0; if (success) { ::memcpy(dst, &m_gpr_powerpc, GetGPRSize()); dst += GetGPRSize(); } } return success; }