@@ -129,7 +129,7 @@ Package::Result Package::save(const std::filesystem::path& lgxPath) const {
129129 addedDirs.insert (dirPath);
130130 }
131131 } else {
132- writer.addFile (entry. path , entry. data );
132+ writer.addEntry (entry);
133133 }
134134 }
135135
@@ -452,12 +452,24 @@ Package::Result Package::addFilesystemEntries(
452452 entry.path = normalizedBase;
453453 entry.data = std::move (data);
454454 entry.isDirectory = false ;
455+
456+ auto status = fs::status (fsPath, ec);
457+ if (!ec) {
458+ entry.mode = static_cast <uint32_t >(status.permissions () & fs::perms::mask);
459+ }
460+
455461 entries_.push_back (std::move (entry));
456462 } else if (fs::is_directory (fsPath, ec)) {
457463 // Directory - add entry for the directory itself
458464 TarEntry dirEntry;
459465 dirEntry.path = normalizedBase;
460466 dirEntry.isDirectory = true ;
467+
468+ auto status = fs::status (fsPath, ec);
469+ if (!ec) {
470+ dirEntry.mode = static_cast <uint32_t >(status.permissions () & fs::perms::mask);
471+ }
472+
461473 entries_.push_back (dirEntry);
462474
463475 // Recursively add contents
@@ -481,6 +493,12 @@ Package::Result Package::addFilesystemEntries(
481493 TarEntry entry;
482494 entry.path = *normalizedPathOpt;
483495 entry.isDirectory = true ;
496+
497+ auto status = fs::status (item.path (), ec);
498+ if (!ec) {
499+ entry.mode = static_cast <uint32_t >(status.permissions () & fs::perms::mask);
500+ }
501+
484502 entries_.push_back (std::move (entry));
485503 } else if (fs::is_regular_file (item.path (), ec)) {
486504 std::ifstream file (item.path (), std::ios::binary);
@@ -497,6 +515,12 @@ Package::Result Package::addFilesystemEntries(
497515 entry.path = *normalizedPathOpt;
498516 entry.data = std::move (data);
499517 entry.isDirectory = false ;
518+
519+ auto status = fs::status (item.path (), ec);
520+ if (!ec) {
521+ entry.mode = static_cast <uint32_t >(status.permissions () & fs::perms::mask);
522+ }
523+
500524 entries_.push_back (std::move (entry));
501525 } else {
502526 // Skip symlinks, special files, etc.
@@ -577,6 +601,14 @@ Package::Result Package::extractVariant(
577601 if (!file) {
578602 return Result::fail (" Failed to write file: " + fullPath.string ());
579603 }
604+ file.close ();
605+
606+ if (entry.mode != 0 ) {
607+ fs::permissions (fullPath, static_cast <fs::perms>(entry.mode & 0777 ), ec);
608+ if (ec) {
609+ return Result::fail (" Failed to set permissions on: " + fullPath.string () + " - " + ec.message ());
610+ }
611+ }
580612 }
581613 }
582614
0 commit comments