diff --git a/kernel/include/init/InitRD.h b/kernel/include/init/InitRD.h index 9c7b89fe..d0ce7b42 100644 --- a/kernel/include/init/InitRD.h +++ b/kernel/include/init/InitRD.h @@ -1,5 +1,6 @@ #pragma once #include +#include #define TAR_MAGIC "ustar" #define TAR_BLOCKSIZE 512 @@ -33,6 +34,7 @@ namespace InitRD uint64_t size; uint64_t size_in_blocks; void* addr; + mode_t mode; }; uint64_t get_total_blocks(); diff --git a/kernel/src/init/InitRD.cpp b/kernel/src/init/InitRD.cpp index 24ce377b..82382ded 100644 --- a/kernel/src/init/InitRD.cpp +++ b/kernel/src/init/InitRD.cpp @@ -62,6 +62,13 @@ InitRD::File InitRD::get_file(TarHeader* header) } result.addr = (void*)((uint64_t)header + TAR_BLOCKSIZE); result.size_in_blocks = Utilities::get_blocks_from_size(TAR_BLOCKSIZE, result.size); + result.mode = 0; + multiplier = 1; + for (int i = 6; i >= 0; i--) + { + result.mode += (mode_t)(multiplier * (header->mode[i] - 48)); + multiplier *= 8; + } return result; } @@ -345,7 +352,7 @@ static bool initrd_register_file(InitRD::File& f, uint64_t inode) node.read_func = initrd_read; node.length = f.size; node.type = VFS_FILE; - node.mode = 0555; + node.mode = f.mode & 07555; // don't allow writing node.uid = node.gid = 0; strncpy(node.name, buffer, sizeof(node.name)); strncpy(f.name, buffer, sizeof(f.name));