mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-11-13 00:26:35 +00:00
sysupdater: make GetUpdateInformation work on hardware.
This commit is contained in:
parent
a6218ed814
commit
3324dd52ef
5 changed files with 37 additions and 8 deletions
|
@ -43,10 +43,9 @@ namespace ams::fs {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Result MountSdCard(const char *name) {
|
Result MountSdCard(const char *name) {
|
||||||
/* Validate the mount name. */
|
/* Validate the mount name. */
|
||||||
R_TRY(impl::CheckMountName(name));
|
R_TRY(impl::CheckMountNameAllowingReserved(name));
|
||||||
|
|
||||||
/* Open the SD card. This uses libnx bindings. */
|
/* Open the SD card. This uses libnx bindings. */
|
||||||
FsFileSystem fs;
|
FsFileSystem fs;
|
||||||
|
|
|
@ -139,6 +139,9 @@ namespace ams::mitm {
|
||||||
/* Open global SD card file system, so that other threads can begin using the SD. */
|
/* Open global SD card file system, so that other threads can begin using the SD. */
|
||||||
mitm::fs::OpenGlobalSdCardFileSystem();
|
mitm::fs::OpenGlobalSdCardFileSystem();
|
||||||
|
|
||||||
|
/* Mount the sd card at a convenient mountpoint. */
|
||||||
|
ams::fs::MountSdCard(ams::fs::impl::SdCardFileSystemMountName);
|
||||||
|
|
||||||
/* Initialize the reboot manager (load a payload off the SD). */
|
/* Initialize the reboot manager (load a payload off the SD). */
|
||||||
/* Discard result, since it doesn't need to succeed. */
|
/* Discard result, since it doesn't need to succeed. */
|
||||||
mitm::bpc::LoadRebootPayload();
|
mitm::bpc::LoadRebootPayload();
|
||||||
|
|
|
@ -82,6 +82,7 @@ void __appInit(void) {
|
||||||
R_ABORT_UNLESS(fsInitialize());
|
R_ABORT_UNLESS(fsInitialize());
|
||||||
R_ABORT_UNLESS(pmdmntInitialize());
|
R_ABORT_UNLESS(pmdmntInitialize());
|
||||||
R_ABORT_UNLESS(pminfoInitialize());
|
R_ABORT_UNLESS(pminfoInitialize());
|
||||||
|
ncm::Initialize();
|
||||||
spl::InitializeForFs();
|
spl::InitializeForFs();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -97,6 +98,7 @@ void __appInit(void) {
|
||||||
void __appExit(void) {
|
void __appExit(void) {
|
||||||
/* Cleanup services. */
|
/* Cleanup services. */
|
||||||
spl::Finalize();
|
spl::Finalize();
|
||||||
|
ncm::Finalize();
|
||||||
pminfoExit();
|
pminfoExit();
|
||||||
pmdmntExit();
|
pmdmntExit();
|
||||||
fsExit();
|
fsExit();
|
||||||
|
|
|
@ -27,7 +27,13 @@ namespace ams::mitm::sysupdater {
|
||||||
|
|
||||||
constexpr size_t MaxServers = 1;
|
constexpr size_t MaxServers = 1;
|
||||||
constexpr size_t MaxSessions = SystemUpdateMaxSessions;
|
constexpr size_t MaxSessions = SystemUpdateMaxSessions;
|
||||||
using ServerOptions = sf::hipc::DefaultServerManagerOptions;
|
|
||||||
|
struct ServerOptions {
|
||||||
|
static constexpr size_t PointerBufferSize = 1_KB;
|
||||||
|
static constexpr size_t MaxDomains = 0;
|
||||||
|
static constexpr size_t MaxDomainObjects = 0;
|
||||||
|
};
|
||||||
|
|
||||||
sf::hipc::ServerManager<MaxServers, ServerOptions, MaxSessions> g_server_manager;
|
sf::hipc::ServerManager<MaxServers, ServerOptions, MaxSessions> g_server_manager;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,9 +78,29 @@ namespace ams::mitm::sysupdater {
|
||||||
return info.version >= MinimumVersionForExFatDriver && ((info.attributes & ncm::ContentMetaAttribute_IncludesExFatDriver) != 0);
|
return info.version >= MinimumVersionForExFatDriver && ((info.attributes & ncm::ContentMetaAttribute_IncludesExFatDriver) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result FormatUserPackagePath(ncm::Path *out, const ncm::Path &user_path) {
|
||||||
|
/* Ensure that the user path is valid. */
|
||||||
|
R_UNLESS(user_path.str[0] == '/', fs::ResultInvalidPath());
|
||||||
|
|
||||||
|
/* Print as @Sdcard:<user_path>/ */
|
||||||
|
std::snprintf(out->str, sizeof(out->str), "%s:%s/", ams::fs::impl::SdCardFileSystemMountName, user_path.str);
|
||||||
|
|
||||||
|
/* Normalize, if the user provided an ending / */
|
||||||
|
const size_t len = std::strlen(out->str);
|
||||||
|
if (out->str[len - 1] == '/' && out->str[len - 2] == '/') {
|
||||||
|
out->str[len - 1] = '\x00';
|
||||||
|
}
|
||||||
|
|
||||||
|
return ResultSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Result SystemUpdateService::GetUpdateInformation(sf::Out<UpdateInformation> out, const ncm::Path &package_root) {
|
Result SystemUpdateService::GetUpdateInformation(sf::Out<UpdateInformation> out, const ncm::Path &path) {
|
||||||
|
/* Adjust the path. */
|
||||||
|
ncm::Path package_root;
|
||||||
|
R_TRY(FormatUserPackagePath(std::addressof(package_root), path));
|
||||||
|
|
||||||
/* Create a new update information. */
|
/* Create a new update information. */
|
||||||
UpdateInformation update_info = {};
|
UpdateInformation update_info = {};
|
||||||
|
|
||||||
|
@ -115,15 +135,14 @@ namespace ams::mitm::sysupdater {
|
||||||
/* Create a reader. */
|
/* Create a reader. */
|
||||||
const auto reader = ncm::PackagedContentMetaReader(content_meta_buffer.Get(), content_meta_buffer.GetSize());
|
const auto reader = ncm::PackagedContentMetaReader(content_meta_buffer.Get(), content_meta_buffer.GetSize());
|
||||||
|
|
||||||
|
/* Get the version from the header. */
|
||||||
|
update_info.version = reader.GetHeader()->version;
|
||||||
|
|
||||||
/* Iterate over infos to find the system update info. */
|
/* Iterate over infos to find the system update info. */
|
||||||
for (size_t i = 0; i < reader.GetContentMetaCount(); ++i) {
|
for (size_t i = 0; i < reader.GetContentMetaCount(); ++i) {
|
||||||
const auto &meta_info = *reader.GetContentMetaInfo(i);
|
const auto &meta_info = *reader.GetContentMetaInfo(i);
|
||||||
|
|
||||||
switch (meta_info.type) {
|
switch (meta_info.type) {
|
||||||
case ncm::ContentMetaType::SystemUpdate:
|
|
||||||
/* Set the version. */
|
|
||||||
update_info.version = meta_info.version;
|
|
||||||
break;
|
|
||||||
case ncm::ContentMetaType::BootImagePackage:
|
case ncm::ContentMetaType::BootImagePackage:
|
||||||
/* Detect exFAT support. */
|
/* Detect exFAT support. */
|
||||||
update_info.exfat_supported |= IsExFatDriverSupported(meta_info);
|
update_info.exfat_supported |= IsExFatDriverSupported(meta_info);
|
||||||
|
|
Loading…
Reference in a new issue