Merge pull request #6766 from leoetlino/ncd

IOS/NCD: Migrate to new filesystem interface
This commit is contained in:
Léo Lam 2018-05-06 17:10:19 +02:00 committed by GitHub
commit c3d88a622d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 64 additions and 31 deletions

View File

@ -61,4 +61,29 @@ void FileSystem::Init()
if (Delete(0, 0, "/tmp") == ResultCode::Success) if (Delete(0, 0, "/tmp") == ResultCode::Success)
CreateDirectory(0, 0, "/tmp", 0, Mode::ReadWrite, Mode::ReadWrite, Mode::ReadWrite); CreateDirectory(0, 0, "/tmp", 0, Mode::ReadWrite, Mode::ReadWrite, Mode::ReadWrite);
} }
ResultCode FileSystem::CreateFullPath(Uid uid, Gid gid, const std::string& path,
FileAttribute attribute, Mode owner, Mode group, Mode other)
{
std::string::size_type position = 1;
while (true)
{
position = path.find('/', position);
if (position == std::string::npos)
return ResultCode::Success;
const std::string subpath = path.substr(0, position);
const Result<Metadata> metadata = GetMetadata(uid, gid, subpath);
if (!metadata && metadata.Error() != ResultCode::NotFound)
return metadata.Error();
if (metadata && metadata->is_file)
return ResultCode::Invalid;
const ResultCode result = CreateDirectory(uid, gid, subpath, attribute, owner, group, other);
if (result != ResultCode::Success && result != ResultCode::AlreadyExists)
return result;
++position;
}
}
} // namespace IOS::HLE::FS } // namespace IOS::HLE::FS

View File

@ -157,6 +157,11 @@ public:
FileAttribute attribute, Mode owner_mode, Mode group_mode, FileAttribute attribute, Mode owner_mode, Mode group_mode,
Mode other_mode) = 0; Mode other_mode) = 0;
/// Create any parent directories for a path with the specified metadata.
/// Example: "/a/b" to create directory /a; "/a/b/" to create directories /a and /a/b
ResultCode CreateFullPath(Uid caller_uid, Gid caller_gid, const std::string& path,
FileAttribute attribute, Mode ownerm, Mode group, Mode other);
/// Delete a file or directory with the specified path. /// Delete a file or directory with the specified path.
virtual ResultCode Delete(Uid caller_uid, Gid caller_gid, const std::string& path) = 0; virtual ResultCode Delete(Uid caller_uid, Gid caller_gid, const std::string& path) = 0;
/// Rename a file or directory with the specified path. /// Rename a file or directory with the specified path.

View File

@ -21,6 +21,7 @@ namespace Device
{ {
NetNCDManage::NetNCDManage(Kernel& ios, const std::string& device_name) : Device(ios, device_name) NetNCDManage::NetNCDManage(Kernel& ios, const std::string& device_name) : Device(ios, device_name)
{ {
config.ReadConfig(ios.GetFS().get());
} }
IPCCommandResult NetNCDManage::IOCtlV(const IOCtlVRequest& request) IPCCommandResult NetNCDManage::IOCtlV(const IOCtlVRequest& request)
@ -51,14 +52,14 @@ IPCCommandResult NetNCDManage::IOCtlV(const IOCtlVRequest& request)
case IOCTLV_NCD_READCONFIG: case IOCTLV_NCD_READCONFIG:
INFO_LOG(IOS_NET, "NET_NCD_MANAGE: IOCTLV_NCD_READCONFIG"); INFO_LOG(IOS_NET, "NET_NCD_MANAGE: IOCTLV_NCD_READCONFIG");
config.ReadConfig(); config.ReadConfig(m_ios.GetFS().get());
config.WriteToMem(request.io_vectors.at(0).address); config.WriteToMem(request.io_vectors.at(0).address);
break; break;
case IOCTLV_NCD_WRITECONFIG: case IOCTLV_NCD_WRITECONFIG:
INFO_LOG(IOS_NET, "NET_NCD_MANAGE: IOCTLV_NCD_WRITECONFIG"); INFO_LOG(IOS_NET, "NET_NCD_MANAGE: IOCTLV_NCD_WRITECONFIG");
config.ReadFromMem(request.in_vectors.at(0).address); config.ReadFromMem(request.in_vectors.at(0).address);
config.WriteConfig(); config.WriteConfig(m_ios.GetFS().get());
break; break;
case IOCTLV_NCD_GETLINKSTATUS: case IOCTLV_NCD_GETLINKSTATUS:

View File

@ -8,10 +8,10 @@
#include "Common/CommonPaths.h" #include "Common/CommonPaths.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/File.h"
#include "Common/FileUtil.h"
#include "Common/Logging/Log.h" #include "Common/Logging/Log.h"
#include "Core/HW/Memmap.h" #include "Core/HW/Memmap.h"
#include "Core/IOS/FS/FileSystem.h"
#include "Core/IOS/IOS.h"
namespace IOS namespace IOS
{ {
@ -19,36 +19,34 @@ namespace HLE
{ {
namespace Net namespace Net
{ {
WiiNetConfig::WiiNetConfig() static const std::string CONFIG_PATH = "/shared2/sys/net/02/config.dat";
{
m_path = File::GetUserPath(D_SESSION_WIIROOT_IDX) + "/" WII_SYSCONF_DIR "/net/02/config.dat";
ReadConfig();
}
void WiiNetConfig::ReadConfig() WiiNetConfig::WiiNetConfig() = default;
{
if (!File::IOFile(m_path, "rb").ReadBytes(&m_data, sizeof(m_data)))
ResetConfig();
}
void WiiNetConfig::WriteConfig() const void WiiNetConfig::ReadConfig(FS::FileSystem* fs)
{ {
if (!File::Exists(m_path))
{ {
if (!File::CreateFullPath(File::GetUserPath(D_SESSION_WIIROOT_IDX) + "/" WII_SYSCONF_DIR const auto file = fs->OpenFile(PID_NCD, PID_NCD, CONFIG_PATH, FS::Mode::Read);
"/net/02/")) if (file && file->Read(&m_data, 1))
{ return;
ERROR_LOG(IOS_NET, "Failed to create directory for network config file");
}
} }
ResetConfig(fs);
File::IOFile(m_path, "wb").WriteBytes(&m_data, sizeof(m_data));
} }
void WiiNetConfig::ResetConfig() void WiiNetConfig::WriteConfig(FS::FileSystem* fs) const
{ {
if (File::Exists(m_path)) fs->CreateFullPath(PID_NCD, PID_NCD, CONFIG_PATH, 0, FS::Mode::ReadWrite, FS::Mode::ReadWrite,
File::Delete(m_path); FS::Mode::ReadWrite);
fs->CreateFile(PID_NCD, PID_NCD, CONFIG_PATH, 0, FS::Mode::ReadWrite, FS::Mode::ReadWrite,
FS::Mode::ReadWrite);
const auto file = fs->OpenFile(PID_NCD, PID_NCD, CONFIG_PATH, FS::Mode::Write);
if (!file || !file->Write(&m_data, 1))
ERROR_LOG(IOS_NET, "Failed to write config");
}
void WiiNetConfig::ResetConfig(FS::FileSystem* fs)
{
fs->Delete(PID_NCD, PID_NCD, CONFIG_PATH);
memset(&m_data, 0, sizeof(m_data)); memset(&m_data, 0, sizeof(m_data));
m_data.connType = ConfigData::IF_WIRED; m_data.connType = ConfigData::IF_WIRED;
@ -56,7 +54,7 @@ void WiiNetConfig::ResetConfig()
ConnectionSettings::WIRED_IF | ConnectionSettings::DNS_DHCP | ConnectionSettings::IP_DHCP | ConnectionSettings::WIRED_IF | ConnectionSettings::DNS_DHCP | ConnectionSettings::IP_DHCP |
ConnectionSettings::CONNECTION_TEST_OK | ConnectionSettings::CONNECTION_SELECTED; ConnectionSettings::CONNECTION_TEST_OK | ConnectionSettings::CONNECTION_SELECTED;
WriteConfig(); WriteConfig(fs);
} }
void WiiNetConfig::WriteToMem(const u32 address) const void WiiNetConfig::WriteToMem(const u32 address) const

View File

@ -11,6 +11,11 @@ namespace IOS
{ {
namespace HLE namespace HLE
{ {
namespace FS
{
class FileSystem;
}
namespace Net namespace Net
{ {
#pragma pack(push, 1) #pragma pack(push, 1)
@ -105,9 +110,9 @@ class WiiNetConfig final
public: public:
WiiNetConfig(); WiiNetConfig();
void ReadConfig(); void ReadConfig(FS::FileSystem* fs);
void WriteConfig() const; void WriteConfig(FS::FileSystem* fs) const;
void ResetConfig(); void ResetConfig(FS::FileSystem* fs);
void WriteToMem(u32 address) const; void WriteToMem(u32 address) const;
void ReadFromMem(u32 address); void ReadFromMem(u32 address);
@ -135,7 +140,6 @@ private:
}; };
#pragma pack(pop) #pragma pack(pop)
std::string m_path;
ConfigData m_data; ConfigData m_data;
}; };
} // namespace Net } // namespace Net