// Copyright 2020 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 "src/storage/volume_image/utils/fd_reader.h"

#include <fcntl.h>
#include <lib/fit/result.h>
#include <sys/stat.h>

#include <cstdio>
#include <cstdlib>

#include <fbl/span.h>
#include <fbl/unique_fd.h>
#include <safemath/safe_conversions.h>

namespace storage::volume_image {

fit::result<FdReader, std::string> FdReader::Create(std::string_view path) {
  if (path.empty()) {
    return fit::error("Cannot obtain file descriptor from empty path.");
  }

  std::string pathname(path);
  fbl::unique_fd fd(open(pathname.c_str(), O_RDONLY));
  if (!fd.is_valid()) {
    std::string error = "Failed to obtain file descriptor from ";
    error.append(pathname).append(". More specifically ").append(strerror(errno));
    return fit::error(error);
  }
  struct stat file_stats = {};
  if (fstat(fd.get(), &file_stats) != 0) {
    return fit::error("Failed to obtain size for file descriptor at " + std::string(path) +
                      ". More specifically: " + strerror(errno));
  }

  return fit::ok(FdReader(std::move(fd), path, file_stats.st_size));
}

fit::result<void, std::string> FdReader::Read(uint64_t offset, fbl::Span<uint8_t> buffer) const {
  size_t bytes_read = 0;
  while (bytes_read < buffer.size()) {
    uint8_t* destination = buffer.data() + bytes_read;
    size_t remaining_bytes = buffer.size() - bytes_read;
    off_t source_offset = offset + bytes_read;
    ssize_t result = pread(fd_.get(), destination, remaining_bytes, source_offset);

    if (result < 0) {
      std::string_view error_description(strerror(errno));
      std::string error = "Read failed from ";
      error.append(name_).append(". More specifically ").append(error_description);
      return fit::error(error);
    }
    if (result == 0) {
      std::string_view error_description(strerror(errno));
      std::string error = "Read failed from  ";
      error.append(name_).append(". End of file reached before reading requested bytes.");
      return fit::error(error);
    }

    bytes_read += result;
  }
  return fit::ok();
}

}  // namespace storage::volume_image
