blob: 7a3fd3e60cf85d10f15cd0c801761df455f68533 [file] [log] [blame]
// Copyright 2022 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 <lib/efi/testing/stdio_file_protocol.h>
#include <sys/stat.h>
#include <cstring>
namespace efi {
efi_status StdioFileProtocol::GetInfo(const efi_guid* info_type, size_t* buf_size, void* buf) {
if (memcmp(info_type, &FileInfoGuid, sizeof(efi_guid))) {
return EFI_UNSUPPORTED;
}
constexpr size_t kInfoSize = sizeof(efi_file_info) + sizeof(char16_t);
if (*buf_size < kInfoSize) {
return EFI_BUFFER_TOO_SMALL;
}
*buf_size = kInfoSize;
efi_file_info* info = static_cast<efi_file_info*>(buf);
struct stat st;
if (fstat(fileno(stdio_file_), &st) != 0) {
return EFI_DEVICE_ERROR;
}
*info = {
.Size = kInfoSize,
.FileSize = static_cast<uint64_t>(st.st_size),
.PhysicalSize = static_cast<uint64_t>(st.st_blocks) * 512,
};
info->FileName[0] = {};
return EFI_SUCCESS;
}
efi_status StdioFileProtocol::SetInfo(const efi_guid* info_type, size_t buf_size, void* buf) {
if (memcmp(info_type, &FileInfoGuid, sizeof(efi_guid))) {
return EFI_UNSUPPORTED;
}
if (buf_size < sizeof(efi_file_info)) {
return EFI_BAD_BUFFER_SIZE;
}
const efi_file_info* info = reinterpret_cast<const efi_file_info*>(buf);
if (ftruncate(fileno(stdio_file_), static_cast<off_t>(info->FileSize)) < 0) {
return EFI_DEVICE_ERROR;
}
return EFI_SUCCESS;
}
} // namespace efi