diff --git a/src/dwarfsextract.cpp b/src/dwarfsextract.cpp index 89729f8e..899b8700 100644 --- a/src/dwarfsextract.cpp +++ b/src/dwarfsextract.cpp @@ -144,22 +144,6 @@ int dwarfsextract(int argc, char** argv) { : nullptr)); } - // TODO: This can surely be implemented more efficiently inside libdwarfs - // using entry indices / inode numbers, which should reduce the - // amount of memory needed by roughly a factor of 8. - - std::vector> entries; - - fs.walk([&](auto entry, auto parent) { - if (!S_ISDIR(entry.mode())) { - entries.emplace_back(entry, parent); - } - }); - - std::sort(entries.begin(), entries.end(), [](auto& a, auto& b) { - return a.first.inode() < b.first.inode(); - }); - auto lr = ::archive_entry_linkresolver_new(); ::archive_entry_linkresolver_set_strategy(lr, ::archive_format(a)); @@ -178,7 +162,11 @@ int dwarfsextract(int argc, char** argv) { } }; - for (auto& [entry, parent] : entries) { + fs.walk_inode_order([&](auto entry, auto parent) { + if (entry.inode() == 0) { + return; + } + auto ae = ::archive_entry_new(); struct ::stat stbuf; @@ -221,7 +209,7 @@ int dwarfsextract(int argc, char** argv) { do_archive(spare, *ev); ::archive_entry_free(spare); } - } + }); // As we're visiting *all* hardlinks, we should never see any deferred // entries.