diff --git a/Userland/Utilities/tar.cpp b/Userland/Utilities/tar.cpp index 417f8cbdbf9..8f077129f89 100644 --- a/Userland/Utilities/tar.cpp +++ b/Userland/Utilities/tar.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -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; }