mirror of
https://github.com/yuzu-emu/yuzu-android.git
synced 2025-06-14 07:27:56 -05:00
Core: Add a passthrough backend for the filesystem, exposed as SDMC.
This commit is contained in:
63
src/core/file_sys/file_sdmc.cpp
Normal file
63
src/core/file_sys/file_sdmc.cpp
Normal file
@ -0,0 +1,63 @@
|
||||
// Copyright 2014 Citra Emulator Project
|
||||
// Licensed under GPLv2
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "common/common_types.h"
|
||||
#include "common/file_util.h"
|
||||
|
||||
#include "core/file_sys/file_sdmc.h"
|
||||
#include "core/file_sys/archive_sdmc.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// FileSys namespace
|
||||
|
||||
namespace FileSys {
|
||||
|
||||
File_SDMC::File_SDMC(const Archive_SDMC* archive, const std::string& path, const Mode mode) {
|
||||
// TODO(Link Mauve): normalize path into an absolute path without "..", it can currently bypass
|
||||
// the root directory we set while opening the archive.
|
||||
// For example, opening /../../etc/passwd can give the emulated program your users list.
|
||||
std::string real_path = archive->GetMountPoint() + path;
|
||||
|
||||
if (!mode.create_flag && !FileUtil::Exists(real_path)) {
|
||||
file = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
std::string mode_string;
|
||||
if (mode.read_flag)
|
||||
mode_string += "r";
|
||||
if (mode.write_flag)
|
||||
mode_string += "w";
|
||||
|
||||
file = new FileUtil::IOFile(real_path, mode_string.c_str());
|
||||
}
|
||||
|
||||
File_SDMC::~File_SDMC() {
|
||||
Close();
|
||||
}
|
||||
|
||||
size_t File_SDMC::Read(const u64 offset, const u32 length, u8* buffer) const {
|
||||
file->Seek(offset, SEEK_SET);
|
||||
return file->ReadBytes(buffer, length);
|
||||
}
|
||||
|
||||
size_t File_SDMC::Write(const u64 offset, const u32 length, const u32 flush, const u8* buffer) const {
|
||||
file->Seek(offset, SEEK_SET);
|
||||
size_t written = file->WriteBytes(buffer, length);
|
||||
if (flush)
|
||||
file->Flush();
|
||||
return written;
|
||||
}
|
||||
|
||||
size_t File_SDMC::GetSize() const {
|
||||
return file->GetSize();
|
||||
}
|
||||
|
||||
bool File_SDMC::Close() const {
|
||||
return file->Close();
|
||||
}
|
||||
|
||||
} // namespace FileSys
|
Reference in New Issue
Block a user