mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-15 16:59:18 +01:00
ES: Create system directories with correct metadata
This commit is contained in:
parent
f47f916afb
commit
606d25213b
@ -23,6 +23,7 @@
|
|||||||
#include "Core/ConfigManager.h"
|
#include "Core/ConfigManager.h"
|
||||||
#include "Core/HW/Memmap.h"
|
#include "Core/HW/Memmap.h"
|
||||||
#include "Core/IOS/ES/Formats.h"
|
#include "Core/IOS/ES/Formats.h"
|
||||||
|
#include "Core/IOS/FS/FileSystem.h"
|
||||||
#include "Core/IOS/IOSC.h"
|
#include "Core/IOS/IOSC.h"
|
||||||
#include "Core/IOS/VersionInfo.h"
|
#include "Core/IOS/VersionInfo.h"
|
||||||
|
|
||||||
@ -38,41 +39,42 @@ static u64 s_title_to_launch;
|
|||||||
struct DirectoryToCreate
|
struct DirectoryToCreate
|
||||||
{
|
{
|
||||||
const char* path;
|
const char* path;
|
||||||
u32 attributes;
|
FS::FileAttribute attribute;
|
||||||
OpenMode owner_perm;
|
FS::Mode owner_mode;
|
||||||
OpenMode group_perm;
|
FS::Mode group_mode;
|
||||||
OpenMode other_perm;
|
FS::Mode other_mode;
|
||||||
|
FS::Uid uid = PID_KERNEL;
|
||||||
|
FS::Gid gid = PID_KERNEL;
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr std::array<DirectoryToCreate, 9> s_directories_to_create = {{
|
constexpr std::array<DirectoryToCreate, 9> s_directories_to_create = {{
|
||||||
{"/sys", 0, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_NONE},
|
{"/sys", 0, FS::Mode::ReadWrite, FS::Mode::ReadWrite, FS::Mode::None},
|
||||||
{"/ticket", 0, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_NONE},
|
{"/ticket", 0, FS::Mode::ReadWrite, FS::Mode::ReadWrite, FS::Mode::None},
|
||||||
{"/title", 0, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_READ},
|
{"/title", 0, FS::Mode::ReadWrite, FS::Mode::ReadWrite, FS::Mode::Read},
|
||||||
{"/shared1", 0, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_NONE},
|
{"/shared1", 0, FS::Mode::ReadWrite, FS::Mode::ReadWrite, FS::Mode::None},
|
||||||
{"/shared2", 0, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_RW},
|
{"/shared2", 0, FS::Mode::ReadWrite, FS::Mode::ReadWrite, FS::Mode::ReadWrite},
|
||||||
{"/tmp", 0, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_RW},
|
{"/tmp", 0, FS::Mode::ReadWrite, FS::Mode::ReadWrite, FS::Mode::ReadWrite},
|
||||||
{"/import", 0, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_NONE},
|
{"/import", 0, FS::Mode::ReadWrite, FS::Mode::ReadWrite, FS::Mode::None},
|
||||||
{"/meta", 0, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_RW},
|
{"/meta", 0, FS::Mode::ReadWrite, FS::Mode::ReadWrite, FS::Mode::ReadWrite,
|
||||||
{"/wfs", 0, OpenMode::IOS_OPEN_RW, OpenMode::IOS_OPEN_NONE, OpenMode::IOS_OPEN_NONE},
|
IOS::ES::FIRST_PPC_UID, 0x1},
|
||||||
|
{"/wfs", 0, FS::Mode::ReadWrite, FS::Mode::None, FS::Mode::None, PID_UNKNOWN, PID_UNKNOWN},
|
||||||
}};
|
}};
|
||||||
|
|
||||||
ES::ES(Kernel& ios, const std::string& device_name) : Device(ios, device_name)
|
ES::ES(Kernel& ios, const std::string& device_name) : Device(ios, device_name)
|
||||||
{
|
{
|
||||||
for (const auto& directory : s_directories_to_create)
|
for (const auto& directory : s_directories_to_create)
|
||||||
{
|
{
|
||||||
const std::string path = Common::RootUserPath(Common::FROM_SESSION_ROOT) + directory.path;
|
// Note: ES sets its own UID and GID to 0/0 at boot, so all filesystem accesses in ES are done
|
||||||
|
// as UID 0 even though its PID is 1.
|
||||||
|
const auto result = m_ios.GetFS()->CreateDirectory(PID_KERNEL, PID_KERNEL, directory.path,
|
||||||
|
directory.attribute, directory.owner_mode,
|
||||||
|
directory.group_mode, directory.other_mode);
|
||||||
|
if (result != FS::ResultCode::Success && result != FS::ResultCode::AlreadyExists)
|
||||||
|
ERROR_LOG(IOS_ES, "Failed to create %s: error %d", directory.path, FS::ConvertResult(result));
|
||||||
|
|
||||||
// Create the directory if it does not exist.
|
// Now update the UID/GID and other attributes.
|
||||||
if (File::IsDirectory(path))
|
m_ios.GetFS()->SetMetadata(0, directory.path, directory.uid, directory.gid, directory.attribute,
|
||||||
continue;
|
directory.owner_mode, directory.group_mode, directory.other_mode);
|
||||||
|
|
||||||
File::CreateFullPath(path);
|
|
||||||
if (File::CreateDir(path))
|
|
||||||
INFO_LOG(IOS_ES, "Created %s (at %s)", directory.path, path.c_str());
|
|
||||||
else
|
|
||||||
ERROR_LOG(IOS_ES, "Failed to create %s (at %s)", directory.path, path.c_str());
|
|
||||||
|
|
||||||
// TODO: Set permissions.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FinishAllStaleImports();
|
FinishAllStaleImports();
|
||||||
|
@ -617,7 +617,7 @@ u32 UIDSys::GetUIDFromTitle(u64 title_id) const
|
|||||||
u32 UIDSys::GetNextUID() const
|
u32 UIDSys::GetNextUID() const
|
||||||
{
|
{
|
||||||
if (m_entries.empty())
|
if (m_entries.empty())
|
||||||
return 0x00001000;
|
return FIRST_PPC_UID;
|
||||||
return m_entries.rbegin()->first + 1;
|
return m_entries.rbegin()->first + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,6 +271,8 @@ private:
|
|||||||
std::shared_ptr<HLE::FS::FileSystem> m_fs;
|
std::shared_ptr<HLE::FS::FileSystem> m_fs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr u32 FIRST_PPC_UID = 0x1000;
|
||||||
|
|
||||||
class UIDSys final
|
class UIDSys final
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user