blob: 8005b8ff0fb0d94ebc0bb354c820cc58081a227e [file] [log] [blame]
/*
* Copyright 2018 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "file_handler.hpp"
#include <filesystem>
#include <ios>
#include <optional>
#include <utility>
#include <vector>
namespace ipmi_flash
{
bool FileHandler::open(const std::string& path, std::ios_base::openmode mode)
{
/* force binary mode */
mode |= std::ios::binary;
this->path = path;
if (file.is_open())
{
return true;
}
file.open(filename, mode);
return file.good();
}
void FileHandler::close()
{
file.close();
}
bool FileHandler::write(std::uint32_t offset,
const std::vector<std::uint8_t>& data)
{
file.seekp(offset);
file.write(reinterpret_cast<const char*>(data.data()), data.size());
return file.good();
}
std::optional<std::vector<uint8_t>>
FileHandler::read(std::uint32_t offset, std::uint32_t size)
{
uint32_t file_size = getSize();
if (offset > file_size)
{
return std::nullopt;
}
std::vector<uint8_t> ret(std::min(file_size - offset, size));
file.seekg(offset);
file.read(reinterpret_cast<char*>(ret.data()), ret.size());
if (!file.good())
{
return std::nullopt;
}
return ret;
}
int FileHandler::getSize()
{
std::error_code ec;
auto ret = std::filesystem::file_size(filename, ec);
if (ec)
{
auto error = ec.message();
std::fprintf(stderr, "Failed to get filesize `%s`: %s\n",
filename.c_str(), error.c_str());
return 0;
}
return ret;
}
} // namespace ipmi_flash