summaryrefslogtreecommitdiff
path: root/src/core/loader/nsp.cpp
diff options
context:
space:
mode:
authorGravatar Zach Hilman2019-06-10 00:21:41 -0400
committerGravatar Zach Hilman2019-06-10 00:21:41 -0400
commitb957a4862ff370f7f8c213159eb49c3743dd93f5 (patch)
tree745ae07dba82dc4e6de3294c67acf1b3418b77fa /src/core/loader/nsp.cpp
parentnsp: Use title ID from NPDM metadata for extracted type NSPs (diff)
downloadyuzu-b957a4862ff370f7f8c213159eb49c3743dd93f5.tar.gz
yuzu-b957a4862ff370f7f8c213159eb49c3743dd93f5.tar.xz
yuzu-b957a4862ff370f7f8c213159eb49c3743dd93f5.zip
nsp: Correct status codes for extracted NSPs
Avoids all extracted NSPs being marked as error file type because they don't have program NCAs.
Diffstat (limited to 'src/core/loader/nsp.cpp')
-rw-r--r--src/core/loader/nsp.cpp25
1 files changed, 12 insertions, 13 deletions
diff --git a/src/core/loader/nsp.cpp b/src/core/loader/nsp.cpp
index 8b90bbd30..9035dc3f9 100644
--- a/src/core/loader/nsp.cpp
+++ b/src/core/loader/nsp.cpp
@@ -26,20 +26,18 @@ AppLoader_NSP::AppLoader_NSP(FileSys::VirtualFile file)
26 26
27 if (nsp->GetStatus() != ResultStatus::Success) 27 if (nsp->GetStatus() != ResultStatus::Success)
28 return; 28 return;
29 if (nsp->IsExtractedType())
30 return;
31
32 const auto control_nca =
33 nsp->GetNCA(nsp->GetProgramTitleID(), FileSys::ContentRecordType::Control);
34 if (control_nca == nullptr || control_nca->GetStatus() != ResultStatus::Success)
35 return;
36
37 std::tie(nacp_file, icon_file) =
38 FileSys::PatchManager(nsp->GetProgramTitleID()).ParseControlNCA(*control_nca);
39 29
40 if (nsp->IsExtractedType()) { 30 if (nsp->IsExtractedType()) {
41 secondary_loader = std::make_unique<AppLoader_DeconstructedRomDirectory>(nsp->GetExeFS()); 31 secondary_loader = std::make_unique<AppLoader_DeconstructedRomDirectory>(nsp->GetExeFS());
42 } else { 32 } else {
33 const auto control_nca =
34 nsp->GetNCA(nsp->GetProgramTitleID(), FileSys::ContentRecordType::Control);
35 if (control_nca == nullptr || control_nca->GetStatus() != ResultStatus::Success)
36 return;
37
38 std::tie(nacp_file, icon_file) =
39 FileSys::PatchManager(nsp->GetProgramTitleID()).ParseControlNCA(*control_nca);
40
43 if (title_id == 0) 41 if (title_id == 0)
44 return; 42 return;
45 43
@@ -56,11 +54,11 @@ FileType AppLoader_NSP::IdentifyType(const FileSys::VirtualFile& file) {
56 if (nsp.GetStatus() == ResultStatus::Success) { 54 if (nsp.GetStatus() == ResultStatus::Success) {
57 // Extracted Type case 55 // Extracted Type case
58 if (nsp.IsExtractedType() && nsp.GetExeFS() != nullptr && 56 if (nsp.IsExtractedType() && nsp.GetExeFS() != nullptr &&
59 FileSys::IsDirectoryExeFS(nsp.GetExeFS()) && nsp.GetRomFS() != nullptr) { 57 FileSys::IsDirectoryExeFS(nsp.GetExeFS())) {
60 return FileType::NSP; 58 return FileType::NSP;
61 } 59 }
62 60
63 // Non-Ectracted Type case 61 // Non-Extracted Type case
64 if (!nsp.IsExtractedType() && 62 if (!nsp.IsExtractedType() &&
65 nsp.GetNCA(nsp.GetFirstTitleID(), FileSys::ContentRecordType::Program) != nullptr && 63 nsp.GetNCA(nsp.GetFirstTitleID(), FileSys::ContentRecordType::Program) != nullptr &&
66 AppLoader_NCA::IdentifyType(nsp.GetNCAFile( 64 AppLoader_NCA::IdentifyType(nsp.GetNCAFile(
@@ -91,7 +89,8 @@ AppLoader_NSP::LoadResult AppLoader_NSP::Load(Kernel::Process& process) {
91 return {nsp_program_status, {}}; 89 return {nsp_program_status, {}};
92 } 90 }
93 91
94 if (nsp->GetNCA(title_id, FileSys::ContentRecordType::Program) == nullptr) { 92 if (!nsp->IsExtractedType() &&
93 nsp->GetNCA(title_id, FileSys::ContentRecordType::Program) == nullptr) {
95 if (!Core::Crypto::KeyManager::KeyFileExists(false)) { 94 if (!Core::Crypto::KeyManager::KeyFileExists(false)) {
96 return {ResultStatus::ErrorMissingProductionKeyFile, {}}; 95 return {ResultStatus::ErrorMissingProductionKeyFile, {}};
97 } 96 }