// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "byte_block_file.h"

#include <unistd.h>

#include <cinttypes>

#include "src/lib/fxl/logging.h"
#include "src/lib/fxl/strings/string_printf.h"
#include "util.h"

namespace debugger_utils {

FileByteBlock::FileByteBlock(int fd) : fd_(fd) { FX_DCHECK(fd >= 0); }

FileByteBlock::~FileByteBlock() { close(fd_); }

bool FileByteBlock::Read(uintptr_t address, void* out_buffer, size_t length) const {
  FX_DCHECK(out_buffer);

  off_t where = lseek(fd_, address, SEEK_SET);
  if (where != static_cast<off_t>(address)) {
    FX_LOGS(ERROR) << fxl::StringPrintf("lseek to 0x%" PRIxPTR, address) << ", "
                   << ErrnoString(errno);
    return false;
  }

  ssize_t bytes_read = read(fd_, out_buffer, length);
  if (bytes_read < 0) {
    FX_LOGS(ERROR) << fxl::StringPrintf("Failed to read memory at addr: 0x%" PRIxPTR, address)
                   << ", " << ErrnoString(errno);
    return false;
  }

  if (length != static_cast<size_t>(bytes_read)) {
    FX_LOGS(ERROR) << fxl::StringPrintf("Short read, got %zu bytes, expected %zu", bytes_read,
                                        length);
    return false;
  }

  // TODO(dje): Dump the bytes read at sufficiently high logging level (>2).

  return true;
}

bool FileByteBlock::Write(uintptr_t address, const void* buffer, size_t length) const {
  FX_DCHECK(buffer);

  if (length == 0) {
    FX_VLOGS(2) << "No data to write";
    return true;
  }

  off_t where = lseek(fd_, address, SEEK_SET);
  if (where != static_cast<off_t>(address)) {
    FX_LOGS(ERROR) << fxl::StringPrintf("lseek to 0x%" PRIxPTR, address) << ", "
                   << ErrnoString(errno);
    return false;
  }

  ssize_t bytes_written = write(fd_, buffer, length);
  if (bytes_written < 0) {
    FX_LOGS(ERROR) << fxl::StringPrintf("Failed to read memory at addr: 0x%" PRIxPTR, address)
                   << ", " << ErrnoString(errno);
    return false;
  }

  if (length != static_cast<size_t>(bytes_written)) {
    FX_LOGS(ERROR) << fxl::StringPrintf("Short write, wrote %zu bytes, expected %zu", bytes_written,
                                        length);
    return false;
  }

  // TODO(dje): Dump the bytes written at sufficiently high logging level (>2).

  return true;
}

}  // namespace debugger_utils
