Explorar o código

Utilities: tar: Always create parent directory when extracting

Tim Schumacher %!s(int64=3) %!d(string=hai) anos
pai
achega
bd6c48f6ea
Modificáronse 1 ficheiros con 8 adicións e 2 borrados
  1. 8 2
      Userland/Utilities/tar.cpp

+ 8 - 2
Userland/Utilities/tar.cpp

@@ -12,6 +12,7 @@
 #include <LibCompress/Gzip.h>
 #include <LibCore/ArgsParser.h>
 #include <LibCore/DirIterator.h>
+#include <LibCore/File.h>
 #include <LibCore/FileStream.h>
 #include <fcntl.h>
 #include <stdio.h>
@@ -75,10 +76,13 @@ int main(int argc, char** argv)
                 Archive::TarFileStream file_stream = tar_stream.file_contents();
 
                 const Archive::TarFileHeader& header = tar_stream.header();
+                String absolute_path = Core::File::absolute_path(header.filename());
                 switch (header.type_flag()) {
                 case Archive::TarFileType::NormalFile:
                 case Archive::TarFileType::AlternateNormalFile: {
-                    int fd = open(String(header.filename()).characters(), O_CREAT | O_WRONLY, header.mode());
+                    Core::File::ensure_parent_directories(absolute_path);
+
+                    int fd = open(absolute_path.characters(), O_CREAT | O_WRONLY, header.mode());
                     if (fd < 0) {
                         perror("open");
                         return 1;
@@ -96,7 +100,9 @@ int main(int argc, char** argv)
                     break;
                 }
                 case Archive::TarFileType::Directory: {
-                    if (mkdir(String(header.filename()).characters(), header.mode())) {
+                    Core::File::ensure_parent_directories(absolute_path);
+
+                    if (mkdir(absolute_path.characters(), header.mode())) {
                         perror("mkdir");
                         return 1;
                     }