From a49e5e9913e9989111fcf6cab7d484db2755f517 Mon Sep 17 00:00:00 2001 From: EnderIce2 Date: Mon, 1 Apr 2024 04:36:11 +0300 Subject: [PATCH] Remove redundant file operation functions --- core/driver/driver.cpp | 8 +- exec/binary_parse.cpp | 19 ++-- exec/elf/elf_loader.cpp | 136 ++++++++++++------------- exec/elf/elf_parse.cpp | 30 +++--- exec/elf/parse/elf_get_dynamic_tag.cpp | 14 +-- exec/elf/parse/elf_get_sections.cpp | 18 ++-- exec/elf/parse/elf_get_symbol_type.cpp | 18 ++-- exec/spawn.cpp | 22 ++-- include/exec.hpp | 41 +++----- include/filesystem.hpp | 10 -- kshell/commands/cat.cpp | 10 +- kshell/shell.cpp | 9 +- storage/README.md | 6 -- storage/kernel_io.cpp | 130 ----------------------- tests/lsof.cpp | 2 +- 15 files changed, 153 insertions(+), 320 deletions(-) delete mode 100644 storage/kernel_io.cpp diff --git a/core/driver/driver.cpp b/core/driver/driver.cpp index f8c4e792..9c4e8ef5 100644 --- a/core/driver/driver.cpp +++ b/core/driver/driver.cpp @@ -381,14 +381,14 @@ namespace Driver break; } - int fd = fopen(rDrv->node->FullPath, "r"); + vfs::RefNode *fd = fs->Open(rDrv->node->FullPath); std::vector SymTab = Execute::ELFGetDynamicTag_x86_64(fd, DT_SYMTAB); std::vector StrTab = Execute::ELFGetDynamicTag_x86_64(fd, DT_STRTAB); Elf64_Sym *_SymTab = (Elf64_Sym *)((uintptr_t)BaseAddress + SymTab[0].d_un.d_ptr); char *DynStr = (char *)((uintptr_t)BaseAddress + StrTab[0].d_un.d_ptr); UNUSED(DynStr); - fclose(fd); + delete fd; Elf64_Rela *Rela = (Elf64_Rela *)(BaseAddress + Dynamic->d_un.d_ptr); for (size_t i = 0; i < (PltRelSize->d_un.d_val / sizeof(Elf64_Rela)); i++) @@ -431,14 +431,14 @@ namespace Driver { fixme("DT_SYMTAB"); break; - int fd = fopen(rDrv->node->FullPath, "r"); + vfs::RefNode *fd = fs->Open(rDrv->node->FullPath); std::vector SymTab = Execute::ELFGetDynamicTag_x86_64(fd, DT_SYMTAB); std::vector StrTab = Execute::ELFGetDynamicTag_x86_64(fd, DT_STRTAB); Elf64_Sym *_SymTab = (Elf64_Sym *)((uintptr_t)BaseAddress + SymTab[0].d_un.d_ptr); char *DynStr = (char *)((uintptr_t)BaseAddress + StrTab[0].d_un.d_ptr); UNUSED(DynStr); - fclose(fd); + delete fd; size_t symtabEntrySize = 0; Elf64_Dyn *entrySizeDyn = Dynamic; diff --git a/exec/binary_parse.cpp b/exec/binary_parse.cpp index f30c6f15..1fccc495 100644 --- a/exec/binary_parse.cpp +++ b/exec/binary_parse.cpp @@ -19,6 +19,8 @@ #include +#include "../kernel.h" + namespace Execute { BinaryType GetBinaryType(const char *Path) @@ -26,18 +28,17 @@ namespace Execute debug("Checking binary type of %s(ptr: %#lx)", Path, Path); BinaryType Type; - int fd = fopen(Path, "r"); + vfs::RefNode *fd = fs->Open(Path); - if (fd < 0) + if (fd == nullptr) { - debug("Failed to open file %s: %s", - Path, strerror(fd)); - return (BinaryType)fd; + debug("Failed to open file %s", Path); + return (BinaryType)-ENOENT; } debug("File opened: %s, descriptor %d", Path, fd); Memory::SmartHeap sh = Memory::SmartHeap(1024); - fread(fd, sh, 128); + fd->read(sh, 128); Elf32_Ehdr *ELFHeader = (Elf32_Ehdr *)sh.Get(); IMAGE_DOS_HEADER *MZHeader = (IMAGE_DOS_HEADER *)sh.Get(); @@ -56,8 +57,8 @@ namespace Execute /* Check MZ header. */ else if (MZHeader->e_magic == IMAGE_DOS_SIGNATURE) { - lseek(fd, MZHeader->e_lfanew, SEEK_SET); - fread(fd, sh, 512); + fd->seek(MZHeader->e_lfanew, SEEK_SET); + fd->read(sh, 512); IMAGE_NT_HEADERS *PEHeader = (IMAGE_NT_HEADERS *)(((char *)sh.Get()) + MZHeader->e_lfanew); @@ -91,7 +92,7 @@ namespace Execute Type = BinaryType::BinTypeUnknown; Success: - fclose(fd); + delete fd; return Type; } } diff --git a/exec/elf/elf_loader.cpp b/exec/elf/elf_loader.cpp index 1ec16bc1..4eff8f1a 100644 --- a/exec/elf/elf_loader.cpp +++ b/exec/elf/elf_loader.cpp @@ -33,7 +33,7 @@ using namespace vfs; namespace Execute { void ELFObject::GenerateAuxiliaryVector_x86_32(Memory::VirtualMemoryArea *vma, - int fd, + vfs::RefNode *fd, Elf32_Ehdr ELFHeader, uint32_t EntryPoint, uint32_t BaseAddress) @@ -41,7 +41,7 @@ namespace Execute } void ELFObject::GenerateAuxiliaryVector_x86_64(Memory::VirtualMemoryArea *vma, - int fd, + vfs::RefNode *fd, Elf64_Ehdr ELFHeader, uint64_t EntryPoint, uint64_t BaseAddress) @@ -50,10 +50,8 @@ namespace Execute char *aux_platform = (char *)vma->RequestPages(1, true); /* TODO: 4KiB is too much for this */ strcpy(aux_platform, "x86_64"); - const char *execfn = thisProcess->FileDescriptors->GetAbsolutePath(fd); - void *execfn_str = vma->RequestPages(TO_PAGES(strlen(execfn) + 1), true); - strcpy((char *)execfn_str, execfn); - delete[] execfn; + void *execfn_str = vma->RequestPages(TO_PAGES(strlen(fd->node->FullPath) + 1), true); + strcpy((char *)execfn_str, fd->node->FullPath); void *at_random = vma->RequestPages(1, true); *(uint64_t *)at_random = Random::rand16(); @@ -95,25 +93,23 @@ namespace Execute #endif } - void ELFObject::LoadExec_x86_32(int fd, PCB *TargetProcess) + void ELFObject::LoadExec_x86_32(vfs::RefNode *, PCB *) { stub; - UNUSED(fd); - UNUSED(TargetProcess); } - void ELFObject::LoadExec_x86_64(int fd, PCB *TargetProcess) + void ELFObject::LoadExec_x86_64(vfs::RefNode *fd, PCB *TargetProcess) { #if defined(a64) std::vector PhdrINTERP = ELFGetSymbolType_x86_64(fd, PT_INTERP); foreach (auto Interp in PhdrINTERP) { Memory::SmartHeap InterpreterPath = Memory::SmartHeap(256); - lseek(fd, Interp.p_offset, SEEK_SET); - fread(fd, InterpreterPath, 256); + fd->seek(Interp.p_offset, SEEK_SET); + fd->read(InterpreterPath, 256); - int ifd = fopen((const char *)InterpreterPath.Get(), "r"); - if (ifd < 0) + vfs::RefNode *ifd = fs->Open((const char *)InterpreterPath.Get()); + if (ifd == nullptr) { warn("Failed to open interpreter file: %s", (const char *)InterpreterPath.Get()); @@ -125,7 +121,7 @@ namespace Execute { warn("Interpreter %s is not an ELF file", (const char *)InterpreterPath.Get()); - fclose(ifd); + delete ifd; continue; } @@ -134,15 +130,15 @@ namespace Execute /* FIXME: specify argv[1] as the location for the interpreter */ debug("Interpreter loaded successfully"); - fclose(ifd); + delete ifd; return; } } } Elf64_Ehdr ELFHeader; - lseek(fd, 0, SEEK_SET); - fread(fd, (uint8_t *)&ELFHeader, sizeof(Elf64_Ehdr)); + fd->seek(0, SEEK_SET); + fd->read((uint8_t *)&ELFHeader, sizeof(Elf64_Ehdr)); uintptr_t EntryPoint = ELFHeader.e_entry; debug("Entry point is %#lx", EntryPoint); @@ -156,8 +152,8 @@ namespace Execute Elf64_Phdr ProgramHeader; for (Elf64_Half i = 0; i < ELFHeader.e_phnum; i++) { - lseek(fd, ELFHeader.e_phoff + (i * sizeof(Elf64_Phdr)), SEEK_SET); - fread(fd, (uint8_t *)&ProgramHeader, sizeof(Elf64_Phdr)); + fd->seek(ELFHeader.e_phoff + (i * sizeof(Elf64_Phdr)), SEEK_SET); + fd->read((uint8_t *)&ProgramHeader, sizeof(Elf64_Phdr)); switch (ProgramHeader.p_type) { case PT_LOAD: @@ -188,8 +184,8 @@ namespace Execute { debug("%d %#lx %d", ProgramHeader.p_offset, (uint8_t *)pAddr + SegDestOffset, ProgramHeader.p_filesz); - lseek(fd, ProgramHeader.p_offset, SEEK_SET); - fread(fd, (uint8_t *)pAddr + SegDestOffset, ProgramHeader.p_filesz); + fd->seek(ProgramHeader.p_offset, SEEK_SET); + fd->read((uint8_t *)pAddr + SegDestOffset, ProgramHeader.p_filesz); } if (ProgramHeader.p_memsz - ProgramHeader.p_filesz > 0) @@ -207,40 +203,40 @@ namespace Execute case PT_NOTE: { Elf64_Nhdr NoteHeader; - lseek(fd, ProgramHeader.p_offset, SEEK_SET); - fread(fd, (uint8_t *)&NoteHeader, sizeof(Elf64_Nhdr)); + fd->seek(ProgramHeader.p_offset, SEEK_SET); + fd->read((uint8_t *)&NoteHeader, sizeof(Elf64_Nhdr)); switch (NoteHeader.n_type) { case NT_PRSTATUS: { Elf64_Prstatus prstatus; - lseek(fd, ProgramHeader.p_offset + sizeof(Elf64_Nhdr), SEEK_SET); - fread(fd, (uint8_t *)&prstatus, sizeof(Elf64_Prstatus)); + fd->seek(ProgramHeader.p_offset + sizeof(Elf64_Nhdr), SEEK_SET); + fd->read((uint8_t *)&prstatus, sizeof(Elf64_Prstatus)); debug("PRSTATUS: %#lx", prstatus.pr_reg[0]); break; } case NT_PRPSINFO: { Elf64_Prpsinfo prpsinfo; - lseek(fd, ProgramHeader.p_offset + sizeof(Elf64_Nhdr), SEEK_SET); - fread(fd, (uint8_t *)&prpsinfo, sizeof(Elf64_Prpsinfo)); + fd->seek(ProgramHeader.p_offset + sizeof(Elf64_Nhdr), SEEK_SET); + fd->read((uint8_t *)&prpsinfo, sizeof(Elf64_Prpsinfo)); debug("PRPSINFO: %s", prpsinfo.pr_fname); break; } case NT_PLATFORM: { char platform[256]; - lseek(fd, ProgramHeader.p_offset + sizeof(Elf64_Nhdr), SEEK_SET); - fread(fd, (uint8_t *)&platform, 256); + fd->seek(ProgramHeader.p_offset + sizeof(Elf64_Nhdr), SEEK_SET); + fd->read((uint8_t *)&platform, 256); debug("PLATFORM: %s", platform); break; } case NT_AUXV: { Elf64_auxv_t auxv; - lseek(fd, ProgramHeader.p_offset + sizeof(Elf64_Nhdr), SEEK_SET); - fread(fd, (uint8_t *)&auxv, sizeof(Elf64_auxv_t)); + fd->seek(ProgramHeader.p_offset + sizeof(Elf64_Nhdr), SEEK_SET); + fd->read((uint8_t *)&auxv, sizeof(Elf64_auxv_t)); debug("AUXV: %#lx", auxv.a_un.a_val); break; } @@ -258,8 +254,8 @@ namespace Execute debug("TLS Size: %ld (%ld pages)", tlsSize, TO_PAGES(tlsSize)); void *tlsMemory = vma->RequestPages(TO_PAGES(tlsSize)); - lseek(fd, ProgramHeader.p_offset, SEEK_SET); - fread(fd, (uint8_t *)tlsMemory, tlsSize); + fd->seek(ProgramHeader.p_offset, SEEK_SET); + fd->read((uint8_t *)tlsMemory, tlsSize); TargetProcess->TLS = { .pBase = uintptr_t(tlsMemory), .vBase = ProgramHeader.p_vaddr, @@ -327,26 +323,24 @@ namespace Execute #endif } - void ELFObject::LoadDyn_x86_32(int fd, PCB *TargetProcess) + void ELFObject::LoadDyn_x86_32(vfs::RefNode *, PCB *) { stub; - UNUSED(fd); - UNUSED(TargetProcess); } - void ELFObject::LoadDyn_x86_64(int fd, PCB *TargetProcess) + void ELFObject::LoadDyn_x86_64(vfs::RefNode *fd, PCB *TargetProcess) { #if defined(a64) std::vector PhdrINTERP = ELFGetSymbolType_x86_64(fd, PT_INTERP); foreach (auto Interp in PhdrINTERP) { Memory::SmartHeap InterpreterPath = Memory::SmartHeap(256); - lseek(fd, Interp.p_offset, SEEK_SET); - fread(fd, InterpreterPath, 256); + fd->seek(Interp.p_offset, SEEK_SET); + fd->read(InterpreterPath, 256); InterpreterPath = InterpreterPath; - int ifd = fopen((const char *)InterpreterPath.Get(), "r"); - if (ifd < 0) + vfs::RefNode *ifd = fs->Open((const char *)InterpreterPath.Get()); + if (ifd == nullptr) { warn("Failed to open interpreter file: %s", (const char *)InterpreterPath.Get()); @@ -358,22 +352,22 @@ namespace Execute { warn("Interpreter %s is not an ELF file", (const char *)InterpreterPath.Get()); - fclose(ifd); + delete ifd; continue; } if (LoadInterpreter(ifd, TargetProcess)) { debug("Interpreter loaded successfully"); - fclose(ifd); + delete ifd; return; } } } Elf64_Ehdr ELFHeader; - lseek(fd, 0, SEEK_SET); - fread(fd, (uint8_t *)&ELFHeader, sizeof(Elf64_Ehdr)); + fd->seek(0, SEEK_SET); + fd->read((uint8_t *)&ELFHeader, sizeof(Elf64_Ehdr)); uintptr_t EntryPoint = ELFHeader.e_entry; debug("Entry point is %#lx", EntryPoint); @@ -389,8 +383,8 @@ namespace Execute size_t SegmentsSize = 0; for (Elf64_Half i = 0; i < ELFHeader.e_phnum; i++) { - lseek(fd, ELFHeader.e_phoff + (i * sizeof(Elf64_Phdr)), SEEK_SET); - fread(fd, (uint8_t *)&ProgramHeader, sizeof(Elf64_Phdr)); + fd->seek(ELFHeader.e_phoff + (i * sizeof(Elf64_Phdr)), SEEK_SET); + fd->read((uint8_t *)&ProgramHeader, sizeof(Elf64_Phdr)); if (ProgramHeader.p_type == PT_LOAD || ProgramHeader.p_type == PT_DYNAMIC) @@ -414,8 +408,8 @@ namespace Execute for (Elf64_Half i = 0; i < ELFHeader.e_phnum; i++) { - lseek(fd, ELFHeader.e_phoff + (i * sizeof(Elf64_Phdr)), SEEK_SET); - fread(fd, (uint8_t *)&ProgramHeader, sizeof(Elf64_Phdr)); + fd->seek(ELFHeader.e_phoff + (i * sizeof(Elf64_Phdr)), SEEK_SET); + fd->read((uint8_t *)&ProgramHeader, sizeof(Elf64_Phdr)); switch (ProgramHeader.p_type) { @@ -434,8 +428,8 @@ namespace Execute if (ProgramHeader.p_filesz > 0) { - lseek(fd, ProgramHeader.p_offset, SEEK_SET); - fread(fd, (uint8_t *)SegmentDestination, ProgramHeader.p_filesz); + fd->seek(ProgramHeader.p_offset, SEEK_SET); + fd->read((uint8_t *)SegmentDestination, ProgramHeader.p_filesz); } if (ProgramHeader.p_memsz - ProgramHeader.p_filesz > 0) @@ -461,8 +455,8 @@ namespace Execute if (ProgramHeader.p_filesz > 0) { - lseek(fd, ProgramHeader.p_offset, SEEK_SET); - fread(fd, (uint8_t *)DynamicSegmentDestination, ProgramHeader.p_filesz); + fd->seek(ProgramHeader.p_offset, SEEK_SET); + fd->read((uint8_t *)DynamicSegmentDestination, ProgramHeader.p_filesz); } if (ProgramHeader.p_memsz - ProgramHeader.p_filesz > 0) @@ -565,14 +559,14 @@ namespace Execute // Elf64_Shdr shdr; // for (Elf64_Half i = 0; i < ELFHeader.e_shnum; i++) // { - // lseek(fd, ELFHeader.e_shoff + i * sizeof(Elf64_Shdr), SEEK_SET); - // fread(fd, (uint8_t *)&shdr, sizeof(Elf64_Shdr)); + // fd->seek(ELFHeader.e_shoff + i * sizeof(Elf64_Shdr), SEEK_SET); + // fd->read((uint8_t *)&shdr, sizeof(Elf64_Shdr)); // char sectionName[32]; // Elf64_Shdr n_shdr; - // lseek(fd, ELFHeader.e_shoff + ELFHeader.e_shstrndx * sizeof(Elf64_Shdr), SEEK_SET); - // fread(fd, (uint8_t *)&n_shdr, sizeof(Elf64_Shdr)); - // lseek(fd, n_shdr.sh_offset + shdr.sh_name, SEEK_SET); - // fread(fd, (uint8_t *)sectionName, 32); + // fd->seek(ELFHeader.e_shoff + ELFHeader.e_shstrndx * sizeof(Elf64_Shdr), SEEK_SET); + // fd->read((uint8_t *)&n_shdr, sizeof(Elf64_Shdr)); + // fd->seek(n_shdr.sh_offset + shdr.sh_name, SEEK_SET); + // fd->read((uint8_t *)sectionName, 32); // debug("shdr: %s", sectionName); // if (strcmp(sectionName, ".rela.plt") == 0) // { @@ -698,8 +692,8 @@ namespace Execute // // STT_OBJECT // Elf64_Xword numEntries = shdr.sh_size / shdr.sh_entsize; // Elf64_Sym *SymArray = new Elf64_Sym[numEntries]; - // lseek(fd, shdr.sh_offset, SEEK_SET); - // fread(fd, (uint8_t *)SymArray, shdr.sh_size); + // fd->seek(shdr.sh_offset, SEEK_SET); + // fd->read((uint8_t *)SymArray, shdr.sh_size); // debug("start %#lx (off %#lx), entries %ld", // SymArray, shdr.sh_addr, numEntries); // for (Elf64_Xword j = 0; j < numEntries; j++) @@ -740,10 +734,10 @@ namespace Execute #endif } - bool ELFObject::LoadInterpreter(int fd, PCB *TargetProcess) + bool ELFObject::LoadInterpreter(vfs::RefNode *fd, PCB *TargetProcess) { Elf32_Ehdr ELFHeader; - fread(fd, &ELFHeader, sizeof(Elf32_Ehdr)); + fd->read((uint8_t *)&ELFHeader, sizeof(Elf32_Ehdr)); switch (ELFHeader.e_type) { @@ -822,8 +816,8 @@ namespace Execute return; } - int fd = fopen(AbsolutePath, "r"); - if (fd < 0) + vfs::RefNode *fd = fs->Open(AbsolutePath); + if (fd == nullptr) { error("Failed to open %s, errno: %d", AbsolutePath, fd); return; @@ -839,17 +833,17 @@ namespace Execute envc++; Elf32_Ehdr ELFHeader; - fread(fd, &ELFHeader, sizeof(Elf32_Ehdr)); + fd->read((uint8_t *)&ELFHeader, sizeof(Elf32_Ehdr)); std::vector PhdrINTERP = ELFGetSymbolType_x86_64(fd, PT_INTERP); const char *ElfInterpPath = nullptr; if (!PhdrINTERP.empty() && ELFHeader.e_type == ET_DYN) { - lseek(fd, PhdrINTERP.front().p_offset, SEEK_SET); + fd->seek(PhdrINTERP.front().p_offset, SEEK_SET); ElfInterpPath = new char[256]; - fread(fd, (void *)ElfInterpPath, 256); + fd->read((uint8_t *)ElfInterpPath, 256); debug("Interpreter: %s", ElfInterpPath); - lseek(fd, 0, SEEK_SET); + fd->seek(0, SEEK_SET); argc++; } @@ -952,7 +946,7 @@ namespace Execute } } - fclose(fd); + delete fd; } ELFObject::~ELFObject() diff --git a/exec/elf/elf_parse.cpp b/exec/elf/elf_parse.cpp index 8d12ba59..d7e86989 100644 --- a/exec/elf/elf_parse.cpp +++ b/exec/elf/elf_parse.cpp @@ -92,14 +92,14 @@ namespace Execute return nullptr; } - Elf64_Sym ELFLookupSymbol(int fd, const char *Name) + Elf64_Sym ELFLookupSymbol(vfs::RefNode *fd, const char *Name) { #if defined(a64) - off_t OldOffset = lseek(fd, 0, SEEK_CUR); + off_t OldOffset = fd->seek(0, SEEK_CUR); Elf64_Ehdr Header; - lseek(fd, 0, SEEK_SET); - fread(fd, (uint8_t *)&Header, sizeof(Elf64_Ehdr)); + fd->seek(0, SEEK_SET); + fd->read((uint8_t *)&Header, sizeof(Elf64_Ehdr)); Elf64_Shdr SymbolTable; Elf64_Shdr StringTable; @@ -107,15 +107,15 @@ namespace Execute for (Elf64_Half i = 0; i < Header.e_shnum; i++) { Elf64_Shdr shdr; - lseek(fd, Header.e_shoff + (i * sizeof(Elf64_Shdr)), SEEK_SET); - fread(fd, (uint8_t *)&shdr, sizeof(Elf64_Shdr)); + fd->seek(Header.e_shoff + (i * sizeof(Elf64_Shdr)), SEEK_SET); + fd->read((uint8_t *)&shdr, sizeof(Elf64_Shdr)); switch (shdr.sh_type) { case SHT_SYMTAB: SymbolTable = shdr; - lseek(fd, Header.e_shoff + (shdr.sh_link * sizeof(Elf64_Shdr)), SEEK_SET); - fread(fd, (uint8_t *)&StringTable, sizeof(Elf64_Shdr)); + fd->seek(Header.e_shoff + (shdr.sh_link * sizeof(Elf64_Shdr)), SEEK_SET); + fd->read((uint8_t *)&StringTable, sizeof(Elf64_Shdr)); break; default: { @@ -128,7 +128,7 @@ namespace Execute StringTable.sh_name == 0) { error("Symbol table not found."); - lseek(fd, OldOffset, SEEK_SET); + fd->seek(OldOffset, SEEK_SET); return {}; } @@ -136,22 +136,22 @@ namespace Execute { // Elf64_Sym *Symbol = (Elf64_Sym *)((uintptr_t)Header + SymbolTable->sh_offset + (i * sizeof(Elf64_Sym))); Elf64_Sym Symbol; - lseek(fd, SymbolTable.sh_offset + (i * sizeof(Elf64_Sym)), SEEK_SET); - fread(fd, (uint8_t *)&Symbol, sizeof(Elf64_Sym)); + fd->seek(SymbolTable.sh_offset + (i * sizeof(Elf64_Sym)), SEEK_SET); + fd->read((uint8_t *)&Symbol, sizeof(Elf64_Sym)); // char *String = (char *)((uintptr_t)Header + StringTable->sh_offset + Symbol->st_name); char String[256]; - lseek(fd, StringTable.sh_offset + Symbol.st_name, SEEK_SET); - fread(fd, (uint8_t *)&String, 256); + fd->seek(StringTable.sh_offset + Symbol.st_name, SEEK_SET); + fd->read((uint8_t *)&String, 256); if (strcmp(String, Name) == 0) { - lseek(fd, OldOffset, SEEK_SET); + fd->seek(OldOffset, SEEK_SET); return Symbol; } } error("Symbol not found."); - lseek(fd, OldOffset, SEEK_SET); + fd->seek(OldOffset, SEEK_SET); #endif return {}; } diff --git a/exec/elf/parse/elf_get_dynamic_tag.cpp b/exec/elf/parse/elf_get_dynamic_tag.cpp index 202231de..0f46e40f 100644 --- a/exec/elf/parse/elf_get_dynamic_tag.cpp +++ b/exec/elf/parse/elf_get_dynamic_tag.cpp @@ -21,16 +21,16 @@ namespace Execute { - std::vector ELFGetDynamicTag_x86_64(int fd, + std::vector ELFGetDynamicTag_x86_64(vfs::RefNode *fd, DynamicArrayTags Tag) { #if defined(a64) || defined(aa64) - off_t OldOffset = lseek(fd, 0, SEEK_CUR); + off_t OldOffset = fd->seek(0, SEEK_CUR); std::vector Ret; Elf64_Ehdr ELFHeader; - lseek(fd, 0, SEEK_SET); - fread(fd, (uint8_t *)&ELFHeader, sizeof(Elf64_Ehdr)); + fd->seek(0, SEEK_SET); + fd->read((uint8_t *)&ELFHeader, sizeof(Elf64_Ehdr)); std::vector DYNAMICPhdrs = ELFGetSymbolType_x86_64(fd, PT_DYNAMIC); @@ -45,8 +45,8 @@ namespace Execute Elf64_Dyn Dynamic; for (size_t i = 0; i < Phdr.p_filesz / sizeof(Elf64_Dyn); i++) { - lseek(fd, Phdr.p_offset + (i * sizeof(Elf64_Dyn)), SEEK_SET); - fread(fd, (uint8_t *)&Dynamic, sizeof(Elf64_Dyn)); + fd->seek(Phdr.p_offset + (i * sizeof(Elf64_Dyn)), SEEK_SET); + fd->read((uint8_t *)&Dynamic, sizeof(Elf64_Dyn)); if (Dynamic.d_tag != Tag) continue; @@ -57,7 +57,7 @@ namespace Execute } } - lseek(fd, OldOffset, SEEK_SET); + fd->seek(OldOffset, SEEK_SET); return Ret; #elif defined(a32) return {}; diff --git a/exec/elf/parse/elf_get_sections.cpp b/exec/elf/parse/elf_get_sections.cpp index 249d1560..86e8c2f9 100644 --- a/exec/elf/parse/elf_get_sections.cpp +++ b/exec/elf/parse/elf_get_sections.cpp @@ -21,24 +21,24 @@ namespace Execute { - std::vector ELFGetSections_x86_64(int fd, + std::vector ELFGetSections_x86_64(vfs::RefNode *fd, const char *SectionName) { #if defined(a64) || defined(aa64) - off_t OldOffset = lseek(fd, 0, SEEK_CUR); + off_t OldOffset = fd->seek(0, SEEK_CUR); std::vector Ret; Elf64_Ehdr ELFHeader; - lseek(fd, 0, SEEK_SET); - fread(fd, (uint8_t *)&ELFHeader, sizeof(Elf64_Ehdr)); + fd->seek(0, SEEK_SET); + fd->read((uint8_t *)&ELFHeader, sizeof(Elf64_Ehdr)); Elf64_Shdr *SectionHeaders = new Elf64_Shdr[ELFHeader.e_shnum]; - lseek(fd, ELFHeader.e_shoff, SEEK_SET); - fread(fd, (uint8_t *)SectionHeaders, sizeof(Elf64_Shdr) * ELFHeader.e_shnum); + fd->seek(ELFHeader.e_shoff, SEEK_SET); + fd->read((uint8_t *)SectionHeaders, sizeof(Elf64_Shdr) * ELFHeader.e_shnum); char *SectionNames = new char[SectionHeaders[ELFHeader.e_shstrndx].sh_size]; - lseek(fd, SectionHeaders[ELFHeader.e_shstrndx].sh_offset, SEEK_SET); - fread(fd, (uint8_t *)SectionNames, SectionHeaders[ELFHeader.e_shstrndx].sh_size); + fd->seek(SectionHeaders[ELFHeader.e_shstrndx].sh_offset, SEEK_SET); + fd->read((uint8_t *)SectionNames, SectionHeaders[ELFHeader.e_shstrndx].sh_size); for (Elf64_Half i = 0; i < ELFHeader.e_shnum; ++i) { @@ -47,7 +47,7 @@ namespace Execute Ret.push_back(SectionHeaders[i]); } - lseek(fd, OldOffset, SEEK_SET); + fd->seek(OldOffset, SEEK_SET); delete[] SectionHeaders; delete[] SectionNames; return Ret; diff --git a/exec/elf/parse/elf_get_symbol_type.cpp b/exec/elf/parse/elf_get_symbol_type.cpp index b3af84a3..d6446b30 100644 --- a/exec/elf/parse/elf_get_symbol_type.cpp +++ b/exec/elf/parse/elf_get_symbol_type.cpp @@ -21,31 +21,31 @@ namespace Execute { - std::vector ELFGetSymbolType_x86_64(int fd, + std::vector ELFGetSymbolType_x86_64(vfs::RefNode *fd, SegmentTypes Tag) { #if defined(a64) || defined(aa64) - off_t OldOffset = lseek(fd, 0, SEEK_CUR); + off_t OldOffset = fd->seek(0, SEEK_CUR); std::vector Ret; Elf64_Ehdr ELFHeader; - lseek(fd, 0, SEEK_SET); - fread(fd, (uint8_t *)&ELFHeader, sizeof(Elf64_Ehdr)); + fd->seek(0, SEEK_SET); + fd->read((uint8_t *)&ELFHeader, sizeof(Elf64_Ehdr)); Elf64_Phdr ProgramHeaders; - lseek(fd, ELFHeader.e_phoff, SEEK_SET); - fread(fd, (uint8_t *)&ProgramHeaders, sizeof(Elf64_Phdr)); + fd->seek(ELFHeader.e_phoff, SEEK_SET); + fd->read((uint8_t *)&ProgramHeaders, sizeof(Elf64_Phdr)); for (Elf64_Half i = 0; i < ELFHeader.e_phnum; i++) { if (ProgramHeaders.p_type == Tag) Ret.push_back(ProgramHeaders); - lseek(fd, sizeof(Elf64_Phdr), SEEK_CUR); - fread(fd, (uint8_t *)&ProgramHeaders, sizeof(Elf64_Phdr)); + fd->seek(sizeof(Elf64_Phdr), SEEK_CUR); + fd->read((uint8_t *)&ProgramHeaders, sizeof(Elf64_Phdr)); } - lseek(fd, OldOffset, SEEK_SET); + fd->seek(OldOffset, SEEK_SET); return Ret; #elif defined(a32) return {}; diff --git a/exec/spawn.cpp b/exec/spawn.cpp index 0b8cc689..3d548a36 100644 --- a/exec/spawn.cpp +++ b/exec/spawn.cpp @@ -35,15 +35,13 @@ namespace Execute Tasking::TaskCompatibility Compatibility, bool Critical) { - int fd = fopen(Path, "r"); - if (fd < 0) - return fd; + vfs::RefNode *fd = fs->Open(Path); + if (fd == nullptr) + return -ENOENT; - struct stat statbuf; - fstat(fd, &statbuf); - if (!S_ISREG(statbuf.st_mode)) + if (fd->node->Type == vfs::NodeType::DIRECTORY) { - fclose(fd); + delete fd; return -EISDIR; } @@ -55,7 +53,7 @@ namespace Execute const char *BaseName; cwk_path_get_basename(Path, &BaseName, nullptr); Elf32_Ehdr ELFHeader; - fread(fd, (uint8_t *)&ELFHeader, sizeof(Elf32_Ehdr)); + fd->read((uint8_t *)&ELFHeader, sizeof(Elf32_Ehdr)); switch (ELFHeader.e_machine) { @@ -136,7 +134,7 @@ namespace Execute if (!obj->IsValid) { error("Failed to load ELF object"); - fclose(fd); + delete fd; delete Process; return -ENOEXEC; } @@ -186,19 +184,19 @@ namespace Execute Compatibility); Thread->SetCritical(Critical); } - fclose(fd); + delete fd; return Thread->ID; } default: { debug("Unknown binary type: %d", GetBinaryType(Path)); - fclose(fd); + delete fd; return -ENOEXEC; } } - fclose(fd); + delete fd; return -ENOEXEC; } } diff --git a/include/exec.hpp b/include/exec.hpp index 316d10fa..a78c3409 100644 --- a/include/exec.hpp +++ b/include/exec.hpp @@ -67,31 +67,20 @@ namespace Execute void *ELFProgramHeaders; void GenerateAuxiliaryVector_x86_32(Memory::VirtualMemoryArea *vma, - int fd, - Elf32_Ehdr ELFHeader, + vfs::RefNode *fd, Elf32_Ehdr ELFHeader, uint32_t EntryPoint, uint32_t BaseAddress); void GenerateAuxiliaryVector_x86_64(Memory::VirtualMemoryArea *vma, - int fd, - Elf64_Ehdr ELFHeader, + vfs::RefNode *fd, Elf64_Ehdr ELFHeader, uint64_t EntryPoint, uint64_t BaseAddress); - void LoadExec_x86_32(int fd, - Tasking::PCB *TargetProcess); - - void LoadExec_x86_64(int fd, - Tasking::PCB *TargetProcess); - - void LoadDyn_x86_32(int fd, - Tasking::PCB *TargetProcess); - - void LoadDyn_x86_64(int fd, - Tasking::PCB *TargetProcess); - - bool LoadInterpreter(int fd, - Tasking::PCB *TargetProcess); + void LoadExec_x86_32(vfs::RefNode *fd, Tasking::PCB *TargetProcess); + void LoadExec_x86_64(vfs::RefNode *fd, Tasking::PCB *TargetProcess); + void LoadDyn_x86_32(vfs::RefNode *fd, Tasking::PCB *TargetProcess); + void LoadDyn_x86_64(vfs::RefNode *fd, Tasking::PCB *TargetProcess); + bool LoadInterpreter(vfs::RefNode *fd, Tasking::PCB *TargetProcess); public: decltype(IsElfValid) &IsValid = IsElfValid; @@ -111,7 +100,7 @@ namespace Execute int Spawn(char *Path, const char **argv, const char **envp, Tasking::PCB *Parent = nullptr, bool Fork = false, - Tasking::TaskCompatibility Compatibility = Tasking::TaskCompatibility::Native, + Tasking::TaskCompatibility Compatibility = Tasking::Native, bool Critical = false); bool ELFIs64(void *Header); @@ -120,17 +109,17 @@ namespace Execute char *GetELFStringTable(Elf64_Ehdr *Header); char *ELFLookupString(Elf64_Ehdr *Header, uintptr_t Offset); Elf64_Sym *ELFLookupSymbol(Elf64_Ehdr *Header, const char *Name); - Elf64_Sym ELFLookupSymbol(int fd, const char *Name); + Elf64_Sym ELFLookupSymbol(vfs::RefNode *fd, const char *Name); uintptr_t ELFGetSymbolValue(Elf64_Ehdr *Header, uint64_t Table, uint64_t Index); - std::vector ELFGetSymbolType_x86_64(int fd, SegmentTypes Tag); - std::vector ELFGetSymbolType_x86_32(int fd, SegmentTypes Tag); + std::vector ELFGetSymbolType_x86_64(vfs::RefNode *fd, SegmentTypes Tag); + std::vector ELFGetSymbolType_x86_32(vfs::RefNode *fd, SegmentTypes Tag); - std::vector ELFGetSections_x86_64(int fd, const char *SectionName); - std::vector ELFGetSections_x86_32(int fd, const char *SectionName); + std::vector ELFGetSections_x86_64(vfs::RefNode *fd, const char *SectionName); + std::vector ELFGetSections_x86_32(vfs::RefNode *fd, const char *SectionName); - std::vector ELFGetDynamicTag_x86_64(int fd, DynamicArrayTags Tag); - std::vector ELFGetDynamicTag_x86_32(int fd, DynamicArrayTags Tag); + std::vector ELFGetDynamicTag_x86_64(vfs::RefNode *fd, DynamicArrayTags Tag); + std::vector ELFGetDynamicTag_x86_32(vfs::RefNode *fd, DynamicArrayTags Tag); } #endif // !__FENNIX_KERNEL_FILE_EXECUTE_H__ diff --git a/include/filesystem.hpp b/include/filesystem.hpp index 62b73970..0a9fc271 100644 --- a/include/filesystem.hpp +++ b/include/filesystem.hpp @@ -436,14 +436,4 @@ namespace vfs }; } -int fopen(const char *pathname, const char *mode); -int creat(const char *pathname, mode_t mode); -ssize_t fread(int fd, void *buf, size_t count); -ssize_t fwrite(int fd, const void *buf, size_t count); -int fclose(int fd); -off_t lseek(int fd, off_t offset, int whence); -int stat(const char *pathname, struct stat *statbuf); -int fstat(int fd, struct stat *statbuf); -int lstat(const char *pathname, struct stat *statbuf); - #endif // !__FENNIX_KERNEL_FILESYSTEM_H__ diff --git a/kshell/commands/cat.cpp b/kshell/commands/cat.cpp index ec61a67c..20baebbf 100644 --- a/kshell/commands/cat.cpp +++ b/kshell/commands/cat.cpp @@ -42,16 +42,14 @@ void cmd_cat(const char *args) return; } - int fd = fopen(thisNode->FullPath, "r"); - struct stat st; - fstat(fd, &st); + vfs::RefNode *fd = fs->Open(thisNode->FullPath); - char *buffer = new char[st.st_size + 1]; - ssize_t rBytes = fread(fd, buffer, st.st_size); + uint8_t *buffer = new uint8_t[fd->Size + 1]; + ssize_t rBytes = fd->read(buffer, fd->Size); if (rBytes > 0) printf("%s\n", buffer); else printf("cat: %s: Could not read file\n", args); delete[] buffer; - fclose(fd); + delete fd; } diff --git a/kshell/shell.cpp b/kshell/shell.cpp index 49d40db7..ace81a59 100644 --- a/kshell/shell.cpp +++ b/kshell/shell.cpp @@ -167,11 +167,10 @@ void StartKernelShell() bool upperCase = false; bool tabDblPress = false; - int kfd = fopen("/dev/key", "r"); - if (kfd < 0) + vfs::RefNode *kfd = fs->Open("/dev/key"); + if (kfd == nullptr) { - KPrint("Failed to open keyboard device! %s", - strerror(kfd)); + KPrint("Failed to open keyboard device!"); return; } @@ -216,7 +215,7 @@ void StartKernelShell() CurY.store(__cy); CurHalt.store(false); - nBytes = fread(kfd, scBuf, 2); + nBytes = kfd->read(scBuf, 2); if (nBytes == 0) continue; if (nBytes < 0) diff --git a/storage/README.md b/storage/README.md index aebd7bcd..7cdc92df 100644 --- a/storage/README.md +++ b/storage/README.md @@ -22,12 +22,6 @@ - **user <=> ref_node.cpp** - Manages the file descriptor table for user processes -
- -- `kernel_io.cpp` - - **kernel <=> file_descriptor.cpp** - - Performs a similar role as `file_descriptor.cpp` but for kernel processes - ### /storage/fs This directory contains the implementations of various file systems, such as `fat32.cpp` and `ustar.cpp`. diff --git a/storage/kernel_io.cpp b/storage/kernel_io.cpp deleted file mode 100644 index d1fa96a5..00000000 --- a/storage/kernel_io.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* - This file is part of Fennix Kernel. - - Fennix Kernel is free software: you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation, either version 3 of - the License, or (at your option) any later version. - - Fennix Kernel is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Fennix Kernel. If not, see . -*/ - -#include -#include - -#include "../kernel.h" - -using Tasking::PCB; -using vfs::FileDescriptorTable; - -static bool CheckForScheduler() -{ - if (TaskManager == nullptr) - return false; - return true; -} - -int fopen(const char *pathname, const char *mode) -{ - if (!CheckForScheduler()) - return -ENOSYS; - - PCB *pcb = thisProcess; - FileDescriptorTable *fdt = pcb->FileDescriptors; - int fd = fdt->_open(pathname, ConvertFileFlags(mode), 0666); - return fd; -} - -int creat(const char *pathname, mode_t mode) -{ - if (!CheckForScheduler()) - return -ENOSYS; - - PCB *pcb = thisProcess; - FileDescriptorTable *fdt = pcb->FileDescriptors; - int fd = fdt->_creat(pathname, mode); - return fd; -} - -ssize_t fread(int fd, void *buf, size_t count) -{ - if (!CheckForScheduler()) - return -ENOSYS; - - PCB *pcb = thisProcess; - FileDescriptorTable *fdt = pcb->FileDescriptors; - ssize_t ret = fdt->_read(fd, buf, count); - return ret; -} - -ssize_t fwrite(int fd, const void *buf, size_t count) -{ - if (!CheckForScheduler()) - return -ENOSYS; - - PCB *pcb = thisProcess; - FileDescriptorTable *fdt = pcb->FileDescriptors; - ssize_t ret = fdt->_write(fd, buf, count); - return ret; -} - -int fclose(int fd) -{ - if (!CheckForScheduler()) - return -ENOSYS; - - PCB *pcb = thisProcess; - FileDescriptorTable *fdt = pcb->FileDescriptors; - int ret = fdt->_close(fd); - return ret; -} - -off_t lseek(int fd, off_t offset, int whence) -{ - if (!CheckForScheduler()) - return -ENOSYS; - - PCB *pcb = thisProcess; - FileDescriptorTable *fdt = pcb->FileDescriptors; - off_t ret = fdt->_lseek(fd, offset, whence); - return ret; -} - -int stat(const char *pathname, struct stat *statbuf) -{ - if (!CheckForScheduler()) - return -ENOSYS; - - PCB *pcb = thisProcess; - FileDescriptorTable *fdt = pcb->FileDescriptors; - int ret = fdt->_stat(pathname, statbuf); - return ret; -} - -int fstat(int fd, struct stat *statbuf) -{ - if (!CheckForScheduler()) - return -ENOSYS; - - PCB *pcb = thisProcess; - FileDescriptorTable *fdt = pcb->FileDescriptors; - int ret = fdt->_fstat(fd, statbuf); - return ret; -} - -int lstat(const char *pathname, struct stat *statbuf) -{ - if (!CheckForScheduler()) - return -ENOSYS; - - PCB *pcb = thisProcess; - FileDescriptorTable *fdt = pcb->FileDescriptors; - int ret = fdt->_lstat(pathname, statbuf); - return ret; -} diff --git a/tests/lsof.cpp b/tests/lsof.cpp index 28f78c38..b1a692d2 100644 --- a/tests/lsof.cpp +++ b/tests/lsof.cpp @@ -37,7 +37,7 @@ void lsof() thisThread->SetPriority(Tasking::High); fs->Create("/dummy_lsof_file", NodeType::FILE); - fopen("/dummy_lsof_file", "r"); + fs->Open("/dummy_lsof_file"); while (true) {