diff --git a/kernel/src/fs/InitRD.cpp b/kernel/src/fs/InitRD.cpp index 2fe7d038..fbaa8f5c 100644 --- a/kernel/src/fs/InitRD.cpp +++ b/kernel/src/fs/InitRD.cpp @@ -37,13 +37,13 @@ Result InitRD::populate_vfs() { if (entry.type == TarStream::EntryType::RegularFile) { - auto file = TRY(VFS::create_file(entry.name, Credentials {})); + auto file = TRY(VFS::create_file(entry.name.chars(), Credentials {})); file->write(entry.data(), 0, entry.size); file->chmod(entry.mode & (mode_t)~S_IFMT); } else if (entry.type == TarStream::EntryType::Directory) { - TRY(vfs_create_dir_if_not_exists(entry.name, entry.mode)); + TRY(vfs_create_dir_if_not_exists(entry.name.chars(), entry.mode)); } } diff --git a/libluna/include/luna/TarStream.h b/libluna/include/luna/TarStream.h index e58a6db2..05e8b84c 100644 --- a/libluna/include/luna/TarStream.h +++ b/libluna/include/luna/TarStream.h @@ -1,5 +1,6 @@ #pragma once #include +#include #include #include @@ -9,12 +10,13 @@ class TarStream enum class EntryType { RegularFile, - Directory + Directory, + Unimplemented, }; struct Entry { - char name[257]; + String name; usize size; mode_t mode; EntryType type; diff --git a/libluna/src/TarStream.cpp b/libluna/src/TarStream.cpp index 9612798a..316dff67 100644 --- a/libluna/src/TarStream.cpp +++ b/libluna/src/TarStream.cpp @@ -1,8 +1,8 @@ -#define _LUNA_SYSTEM_ERROR_EXTENSIONS #include #include #include #include +#include #include TarStream::TarStream(void* base, usize size) : m_base(base), m_pos(base), m_size(size) @@ -52,11 +52,19 @@ Result TarStream::parse_header(const TarStream::TarHeader* hdr case '\0': case '0': entry.type = EntryType::RegularFile; break; case '5': entry.type = EntryType::Directory; break; - default: return err(EFIXME); + default: entry.type = EntryType::Unimplemented; break; } - if (!strlen(hdr->prefix)) { strlcpy(entry.name, hdr->name, 101); } - else { return err(EFIXME); } + if (!strlen(hdr->prefix)) + entry.name = TRY(String::from_string_view(StringView::from_fixed_size_cstring(hdr->name, sizeof(hdr->name)))); + else + { + StringBuilder sb; + TRY(sb.add(StringView::from_fixed_size_cstring(hdr->prefix, sizeof(hdr->prefix)))); + TRY(sb.add('/')); + TRY(sb.add(StringView::from_fixed_size_cstring(hdr->name, sizeof(hdr->name)))); + entry.name = TRY(sb.string()); + } if (entry.size) {