mirror of
https://github.com/Atmosphere-NX/hac2l.git
synced 2025-08-07 16:09:28 +02:00
hac2l: it's 2024, prefer 'nsp' to 'pfs' for various reasons
This commit is contained in:
parent
217f047375
commit
e98a8f5262
@ -146,8 +146,8 @@ namespace ams::hactool {
|
|||||||
MakeOptionHandler("outfile", "Specify output file path.", [] (Options &options, const char *arg) { return CreateFilePath(std::addressof(options.default_out_file_path), arg); }),
|
MakeOptionHandler("outfile", "Specify output file path.", [] (Options &options, const char *arg) { return CreateFilePath(std::addressof(options.default_out_file_path), arg); }),
|
||||||
MakeOptionHandler("basenca", "Specify a base nca to use when processing.", [] (Options &options, const char *arg) { return CreateFilePath(std::addressof(options.base_nca_path), arg); }),
|
MakeOptionHandler("basenca", "Specify a base nca to use when processing.", [] (Options &options, const char *arg) { return CreateFilePath(std::addressof(options.base_nca_path), arg); }),
|
||||||
MakeOptionHandler("basexci", "Specify a base xci to use when processing.", [] (Options &options, const char *arg) { return CreateFilePath(std::addressof(options.base_xci_path), arg); }),
|
MakeOptionHandler("basexci", "Specify a base xci to use when processing.", [] (Options &options, const char *arg) { return CreateFilePath(std::addressof(options.base_xci_path), arg); }),
|
||||||
MakeOptionHandler("basepfs", "Specify a base pfs to use when processing.", [] (Options &options, const char *arg) { return CreateFilePath(std::addressof(options.base_pfs_path), arg); }),
|
MakeOptionHandler("basepfs", "Specify a base pfs to use when processing.", [] (Options &options, const char *arg) { return CreateFilePath(std::addressof(options.base_nsp_path), arg); }),
|
||||||
MakeOptionHandler("basensp", "Specify a base nsp to use when processing. Synonym for basepfs.", [] (Options &options, const char *arg) { return CreateFilePath(std::addressof(options.base_pfs_path), arg); }),
|
MakeOptionHandler("basensp", "Specify a base nsp to use when processing. Synonym for basepfs.", [] (Options &options, const char *arg) { return CreateFilePath(std::addressof(options.base_nsp_path), arg); }),
|
||||||
MakeOptionHandler("baseappfs", "Specify a base appfs to use when processing.", [] (Options &options, const char *arg) { return CreateFilePath(std::addressof(options.base_appfs_path), arg); }),
|
MakeOptionHandler("baseappfs", "Specify a base appfs to use when processing.", [] (Options &options, const char *arg) { return CreateFilePath(std::addressof(options.base_appfs_path), arg); }),
|
||||||
MakeOptionHandler("appindex", "[appfs] Specify a preferred application index.", [] (Options &options, const char *arg) { return ParseIntegerArgument(std::addressof(options.preferred_app_index), arg); }),
|
MakeOptionHandler("appindex", "[appfs] Specify a preferred application index.", [] (Options &options, const char *arg) { return ParseIntegerArgument(std::addressof(options.preferred_app_index), arg); }),
|
||||||
MakeOptionHandler("programindex", "[appfs] Specify a preferred program index.", [] (Options &options, const char *arg) { return ParseIntegerArgument(std::addressof(options.preferred_program_index), arg); }),
|
MakeOptionHandler("programindex", "[appfs] Specify a preferred program index.", [] (Options &options, const char *arg) { return ParseIntegerArgument(std::addressof(options.preferred_program_index), arg); }),
|
||||||
|
@ -38,7 +38,7 @@ namespace ams::hactool {
|
|||||||
FileType file_type = FileType::Nca;
|
FileType file_type = FileType::Nca;
|
||||||
const char *base_nca_path = nullptr;
|
const char *base_nca_path = nullptr;
|
||||||
const char *base_xci_path = nullptr;
|
const char *base_xci_path = nullptr;
|
||||||
const char *base_pfs_path = nullptr;
|
const char *base_nsp_path = nullptr;
|
||||||
const char *base_appfs_path = nullptr;
|
const char *base_appfs_path = nullptr;
|
||||||
bool valid = false;
|
bool valid = false;
|
||||||
bool raw = false;
|
bool raw = false;
|
||||||
|
@ -126,7 +126,7 @@ namespace ams::hactool {
|
|||||||
ProcessAsApplicationFileSystemContext app_ctx;
|
ProcessAsApplicationFileSystemContext app_ctx;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ProcessAsPfsContext {
|
struct ProcessAsNspContext {
|
||||||
std::shared_ptr<fs::IStorage> storage;
|
std::shared_ptr<fs::IStorage> storage;
|
||||||
std::shared_ptr<fs::fsa::IFileSystem> fs;
|
std::shared_ptr<fs::fsa::IFileSystem> fs;
|
||||||
|
|
||||||
@ -148,11 +148,11 @@ namespace ams::hactool {
|
|||||||
|
|
||||||
bool m_has_base_nca;
|
bool m_has_base_nca;
|
||||||
bool m_has_base_xci;
|
bool m_has_base_xci;
|
||||||
bool m_has_base_pfs;
|
bool m_has_base_nsp;
|
||||||
bool m_has_base_appfs;
|
bool m_has_base_appfs;
|
||||||
ProcessAsNcaContext m_base_nca_ctx;
|
ProcessAsNcaContext m_base_nca_ctx;
|
||||||
ProcessAsXciContext m_base_xci_ctx;
|
ProcessAsXciContext m_base_xci_ctx;
|
||||||
ProcessAsPfsContext m_base_pfs_ctx;
|
ProcessAsNspContext m_base_nsp_ctx;
|
||||||
ProcessAsApplicationFileSystemContext m_base_appfs_ctx;
|
ProcessAsApplicationFileSystemContext m_base_appfs_ctx;
|
||||||
|
|
||||||
os::SdkMutex m_print_lock;
|
os::SdkMutex m_print_lock;
|
||||||
@ -240,7 +240,7 @@ namespace ams::hactool {
|
|||||||
Result ProcessAsNca(std::shared_ptr<fs::IStorage> storage, ProcessAsNcaContext *ctx = nullptr);
|
Result ProcessAsNca(std::shared_ptr<fs::IStorage> storage, ProcessAsNcaContext *ctx = nullptr);
|
||||||
Result ProcessAsNpdm(std::shared_ptr<fs::IStorage> storage, ProcessAsNpdmContext *ctx = nullptr);
|
Result ProcessAsNpdm(std::shared_ptr<fs::IStorage> storage, ProcessAsNpdmContext *ctx = nullptr);
|
||||||
Result ProcessAsXci(std::shared_ptr<fs::IStorage> storage, ProcessAsXciContext *ctx = nullptr);
|
Result ProcessAsXci(std::shared_ptr<fs::IStorage> storage, ProcessAsXciContext *ctx = nullptr);
|
||||||
Result ProcessAsPfs(std::shared_ptr<fs::IStorage> storage, ProcessAsPfsContext *ctx = nullptr);
|
Result ProcessAsNsp(std::shared_ptr<fs::IStorage> storage, ProcessAsNspContext *ctx = nullptr);
|
||||||
Result ProcessAsRomfs(std::shared_ptr<fs::IStorage> storage, ProcessAsRomfsContext *ctx = nullptr);
|
Result ProcessAsRomfs(std::shared_ptr<fs::IStorage> storage, ProcessAsRomfsContext *ctx = nullptr);
|
||||||
Result ProcessAsApplicationFileSystem(std::shared_ptr<fs::fsa::IFileSystem> fs, ProcessAsApplicationFileSystemContext *ctx = nullptr);
|
Result ProcessAsApplicationFileSystem(std::shared_ptr<fs::fsa::IFileSystem> fs, ProcessAsApplicationFileSystemContext *ctx = nullptr);
|
||||||
|
|
||||||
@ -248,7 +248,7 @@ namespace ams::hactool {
|
|||||||
void PrintAsNca(ProcessAsNcaContext &ctx);
|
void PrintAsNca(ProcessAsNcaContext &ctx);
|
||||||
void PrintAsNpdm(ProcessAsNpdmContext &ctx);
|
void PrintAsNpdm(ProcessAsNpdmContext &ctx);
|
||||||
void PrintAsXci(ProcessAsXciContext &ctx);
|
void PrintAsXci(ProcessAsXciContext &ctx);
|
||||||
void PrintAsPfs(ProcessAsPfsContext &ctx);
|
void PrintAsNsp(ProcessAsNspContext &ctx);
|
||||||
void PrintAsRomfs(ProcessAsRomfsContext &ctx);
|
void PrintAsRomfs(ProcessAsRomfsContext &ctx);
|
||||||
void PrintAsApplicationFileSystem(ProcessAsApplicationFileSystemContext &ctx);
|
void PrintAsApplicationFileSystem(ProcessAsApplicationFileSystemContext &ctx);
|
||||||
|
|
||||||
@ -256,7 +256,7 @@ namespace ams::hactool {
|
|||||||
void SaveAsNca(ProcessAsNcaContext &ctx);
|
void SaveAsNca(ProcessAsNcaContext &ctx);
|
||||||
void SaveAsNpdm(ProcessAsNpdmContext &ctx);
|
void SaveAsNpdm(ProcessAsNpdmContext &ctx);
|
||||||
void SaveAsXci(ProcessAsXciContext &ctx);
|
void SaveAsXci(ProcessAsXciContext &ctx);
|
||||||
void SaveAsPfs(ProcessAsPfsContext &ctx);
|
void SaveAsNsp(ProcessAsNspContext &ctx);
|
||||||
void SaveAsRomfs(ProcessAsRomfsContext &ctx);
|
void SaveAsRomfs(ProcessAsRomfsContext &ctx);
|
||||||
void SaveAsApplicationFileSystem(ProcessAsApplicationFileSystemContext &ctx);
|
void SaveAsApplicationFileSystem(ProcessAsApplicationFileSystemContext &ctx);
|
||||||
};
|
};
|
||||||
|
@ -19,11 +19,11 @@
|
|||||||
|
|
||||||
namespace ams::hactool {
|
namespace ams::hactool {
|
||||||
|
|
||||||
Processor::Processor(const Options &options) : m_options(options), m_base_nca_ctx{}, m_base_xci_ctx{}, m_base_pfs_ctx{}, m_base_appfs_ctx{} {
|
Processor::Processor(const Options &options) : m_options(options), m_base_nca_ctx{}, m_base_xci_ctx{}, m_base_nsp_ctx{}, m_base_appfs_ctx{} {
|
||||||
/* Default to no bases. */
|
/* Default to no bases. */
|
||||||
m_has_base_nca = false;
|
m_has_base_nca = false;
|
||||||
m_has_base_xci = false;
|
m_has_base_xci = false;
|
||||||
m_has_base_pfs = false;
|
m_has_base_nsp = false;
|
||||||
m_has_base_appfs = false;
|
m_has_base_appfs = false;
|
||||||
|
|
||||||
/* Create local file system for host root. */
|
/* Create local file system for host root. */
|
||||||
@ -67,16 +67,16 @@ namespace ams::hactool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_options.base_pfs_path != nullptr) {
|
if (m_options.base_nsp_path != nullptr) {
|
||||||
std::shared_ptr<fs::IStorage> storage = nullptr;
|
std::shared_ptr<fs::IStorage> storage = nullptr;
|
||||||
if (const auto open_res = OpenFileStorage(std::addressof(storage), m_local_fs, m_options.base_pfs_path); R_SUCCEEDED(open_res)) {
|
if (const auto open_res = OpenFileStorage(std::addressof(storage), m_local_fs, m_options.base_nsp_path); R_SUCCEEDED(open_res)) {
|
||||||
if (const auto proc_res = this->ProcessAsPfs(std::move(storage), std::addressof(m_base_pfs_ctx)); R_SUCCEEDED(proc_res)) {
|
if (const auto proc_res = this->ProcessAsNsp(std::move(storage), std::addressof(m_base_nsp_ctx)); R_SUCCEEDED(proc_res)) {
|
||||||
m_has_base_pfs = true;
|
m_has_base_nsp = true;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Failed to process base pfs (%s): 2%03d-%04d\n", m_options.base_pfs_path, proc_res.GetModule(), proc_res.GetDescription());
|
fprintf(stderr, "Failed to process base nsp (%s): 2%03d-%04d\n", m_options.base_nsp_path, proc_res.GetModule(), proc_res.GetDescription());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Failed to open base pfs (%s): 2%03d-%04d\n", m_options.base_pfs_path, open_res.GetModule(), open_res.GetDescription());
|
fprintf(stderr, "Failed to open base nsp (%s): 2%03d-%04d\n", m_options.base_nsp_path, open_res.GetModule(), open_res.GetDescription());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,7 +121,7 @@ namespace ams::hactool {
|
|||||||
R_TRY(this->ProcessAsXci(std::move(input)));
|
R_TRY(this->ProcessAsXci(std::move(input)));
|
||||||
break;
|
break;
|
||||||
case FileType::Pfs:
|
case FileType::Pfs:
|
||||||
R_TRY(this->ProcessAsPfs(std::move(input)));
|
R_TRY(this->ProcessAsNsp(std::move(input)));
|
||||||
break;
|
break;
|
||||||
case FileType::Romfs:
|
case FileType::Romfs:
|
||||||
R_TRY(this->ProcessAsRomfs(std::move(input)));
|
R_TRY(this->ProcessAsRomfs(std::move(input)));
|
||||||
|
@ -134,7 +134,7 @@ namespace ams::hactool {
|
|||||||
ctx->base_reader = m_base_nca_ctx.reader;
|
ctx->base_reader = m_base_nca_ctx.reader;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Next, we'll try looking for a match in the appfs of a base xci, pfs, or appfs. */
|
/* Next, we'll try looking for a match in the appfs of a base xci, nsp, or appfs. */
|
||||||
auto GetBaseFromAppFs = [&](ProcessAsApplicationFileSystemContext &app_ctx, const char *src) {
|
auto GetBaseFromAppFs = [&](ProcessAsApplicationFileSystemContext &app_ctx, const char *src) {
|
||||||
if (ctx->base_reader == nullptr) {
|
if (ctx->base_reader == nullptr) {
|
||||||
if (auto app_prog = app_ctx.apps.Find(ncm::ApplicationId{ctx->reader->GetProgramId() & ~static_cast<u64>(0xFF)}, 0, ctx->reader->GetProgramId() & 0xFF, ncm::ContentType::Program, ncm::ContentMetaType::Application); app_prog != app_ctx.apps.end()) {
|
if (auto app_prog = app_ctx.apps.Find(ncm::ApplicationId{ctx->reader->GetProgramId() & ~static_cast<u64>(0xFF)}, 0, ctx->reader->GetProgramId() & 0xFF, ncm::ContentType::Program, ncm::ContentMetaType::Application); app_prog != app_ctx.apps.end()) {
|
||||||
@ -155,10 +155,10 @@ namespace ams::hactool {
|
|||||||
m_has_base_xci = true;
|
m_has_base_xci = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_has_base_pfs && !m_base_pfs_ctx.is_exefs) {
|
if (m_has_base_nsp && !m_base_nsp_ctx.is_exefs) {
|
||||||
m_has_base_pfs = false;
|
m_has_base_nsp = false;
|
||||||
GetBaseFromAppFs(m_base_pfs_ctx.app_ctx, "basepfs");
|
GetBaseFromAppFs(m_base_nsp_ctx.app_ctx, "basensp");
|
||||||
m_has_base_pfs = true;
|
m_has_base_nsp = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_has_base_appfs) {
|
if (m_has_base_appfs) {
|
||||||
|
@ -19,9 +19,9 @@
|
|||||||
|
|
||||||
namespace ams::hactool {
|
namespace ams::hactool {
|
||||||
|
|
||||||
Result Processor::ProcessAsPfs(std::shared_ptr<fs::IStorage> storage, ProcessAsPfsContext *ctx) {
|
Result Processor::ProcessAsNsp(std::shared_ptr<fs::IStorage> storage, ProcessAsNspContext *ctx) {
|
||||||
/* Ensure we have a context. */
|
/* Ensure we have a context. */
|
||||||
ProcessAsPfsContext local_ctx{};
|
ProcessAsNspContext local_ctx{};
|
||||||
if (ctx == nullptr) {
|
if (ctx == nullptr) {
|
||||||
ctx = std::addressof(local_ctx);
|
ctx = std::addressof(local_ctx);
|
||||||
}
|
}
|
||||||
@ -78,18 +78,18 @@ namespace ams::hactool {
|
|||||||
|
|
||||||
/* Print. */
|
/* Print. */
|
||||||
if (ctx == std::addressof(local_ctx)) {
|
if (ctx == std::addressof(local_ctx)) {
|
||||||
this->PrintAsPfs(*ctx);
|
this->PrintAsNsp(*ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save. */
|
/* Save. */
|
||||||
if (ctx == std::addressof(local_ctx)) {
|
if (ctx == std::addressof(local_ctx)) {
|
||||||
this->SaveAsPfs(*ctx);
|
this->SaveAsNsp(*ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Processor::PrintAsPfs(ProcessAsPfsContext &ctx) {
|
void Processor::PrintAsNsp(ProcessAsNspContext &ctx) {
|
||||||
{
|
{
|
||||||
auto _ = this->PrintHeader("PartitionFileSystem");
|
auto _ = this->PrintHeader("PartitionFileSystem");
|
||||||
this->PrintMagic(ctx.magic);
|
this->PrintMagic(ctx.magic);
|
||||||
@ -98,7 +98,7 @@ namespace ams::hactool {
|
|||||||
|
|
||||||
char print_prefix[1_KB + 5];
|
char print_prefix[1_KB + 5];
|
||||||
std::memset(print_prefix, ' ', WidthToPrintFieldValue);
|
std::memset(print_prefix, ' ', WidthToPrintFieldValue);
|
||||||
util::TSNPrintf(print_prefix, sizeof(print_prefix), "%s%s", m_indent_buffer, "pfs:");
|
util::TSNPrintf(print_prefix, sizeof(print_prefix), "%s%s", m_indent_buffer, "nsp:");
|
||||||
|
|
||||||
PrintDirectory(ctx.fs, print_prefix, "/");
|
PrintDirectory(ctx.fs, print_prefix, "/");
|
||||||
}
|
}
|
||||||
@ -111,8 +111,8 @@ namespace ams::hactool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Processor::SaveAsPfs(ProcessAsPfsContext &ctx) {
|
void Processor::SaveAsNsp(ProcessAsNspContext &ctx) {
|
||||||
/* Save pfs contents. */
|
/* Save nsp contents. */
|
||||||
{
|
{
|
||||||
/* Determine path to extract to. */
|
/* Determine path to extract to. */
|
||||||
const char *dir_path = nullptr;
|
const char *dir_path = nullptr;
|
||||||
@ -128,7 +128,7 @@ namespace ams::hactool {
|
|||||||
|
|
||||||
/* If we have a path, extract to it. */
|
/* If we have a path, extract to it. */
|
||||||
if (dir_path != nullptr) {
|
if (dir_path != nullptr) {
|
||||||
ExtractDirectory(m_local_fs, ctx.fs, "pfs:", dir_path, "/");
|
ExtractDirectory(m_local_fs, ctx.fs, "nsp:", dir_path, "/");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ctx.is_exefs) {
|
if (ctx.is_exefs) {
|
Loading…
Reference in New Issue
Block a user