// Copyright 2017 The Chromium OS 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 "smbprovider/temp_file_manager.h"

#include <stdlib.h>
#include <unistd.h>

#include <memory>
#include <string>
#include <vector>

#include <base/files/file_util.h>

namespace smbprovider {

TempFileManager::TempFileManager() {
  CHECK(temp_dir_.CreateUniqueTempDir());
}

TempFileManager::~TempFileManager() = default;

const base::FilePath& TempFileManager::GetTempDirectoryPath() const {
  return temp_dir_.GetPath();
}

base::ScopedFD TempFileManager::CreateTempFile(
    const std::vector<uint8_t>& data) {
  base::ScopedFD temp_fd = CreateTempFile();

  // Write the data into the newly created file.
  if (!base::WriteFileDescriptor(temp_fd.get(),
                                 reinterpret_cast<const char*>(data.data()),
                                 data.size())) {
    LOG(ERROR) << "Error writing to temporary file";
    temp_fd.reset();
    return temp_fd;
  }

  // Seek the file descriptor to the start of the file in preparation for
  // reading.
  if (lseek(temp_fd.get(), 0, SEEK_SET) < 0) {
    LOG(ERROR) << "Error seeking to beginning of temporary file";
    temp_fd.reset();
    return temp_fd;
  }

  return temp_fd;
}

base::ScopedFD TempFileManager::CreateTempFile() {
  const std::string str = temp_dir_.GetPath().Append("XXXXXX").value();
  // Make sure that the string we are passing is null-terminated.
  std::unique_ptr<char[]> file_path = std::make_unique<char[]>(str.size() + 1);
  memcpy(file_path.get(), str.c_str(), str.size());
  file_path[str.size()] = '\0';

  // mkstemp() modifies the passed in array.
  base::ScopedFD temp_fd(HANDLE_EINTR(mkstemp(file_path.get())));
  if (!temp_fd.is_valid()) {
    LOG(ERROR) << "mkstemp failed to create a temporary file";
    temp_fd.reset();
    return temp_fd;
  }

  // Unlink causes the file to be deleted when the file descriptor is closed.
  if (unlink(file_path.get()) != 0) {
    LOG(ERROR) << "Failed to unlink temporary file: " << file_path.get();
    temp_fd.reset();
    return temp_fd;
  }

  return temp_fd;
}

}  // namespace smbprovider
