From f9e10ab2656f94d8da1dc2a51540d0f4e9f5308b Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Thu, 3 Nov 2011 18:26:43 +0100 Subject: [PATCH] Added an API for user-space to list the initrd, and 'ls' does so now. --- libmaxsi/hsrc/process.h | 8 ++++++++ libmaxsi/process.cpp | 12 ++++++++++++ sortix/initrd.cpp | 32 ++++++++++++++++++++++++++++++++ sortix/syscallnum.h | 4 +++- utils/ls.cpp | 10 +++++++++- 5 files changed, 64 insertions(+), 2 deletions(-) diff --git a/libmaxsi/hsrc/process.h b/libmaxsi/hsrc/process.h index 3e925b0c..ed905437 100644 --- a/libmaxsi/hsrc/process.h +++ b/libmaxsi/hsrc/process.h @@ -27,10 +27,18 @@ namespace Maxsi { + struct FileInfo + { + mode_t permissions; + char name[128]; + }; + namespace Process { int Execute(const char* filepath, int argc, const char** argv); void PrintPathFiles(); + size_t GetNumFiles(); + int GetFileInfo(size_t index, FileInfo* fileinfo); void Abort(); void Exit(int code); pid_t Fork(); diff --git a/libmaxsi/process.cpp b/libmaxsi/process.cpp index 028a2efb..92282176 100644 --- a/libmaxsi/process.cpp +++ b/libmaxsi/process.cpp @@ -35,6 +35,8 @@ namespace Maxsi DEFN_SYSCALL0(pid_t, SysFork, 12); DEFN_SYSCALL0(pid_t, SysGetPID, 13); DEFN_SYSCALL0(pid_t, SysGetParentPID, 14); + DEFN_SYSCALL2(int, SysGetFileInfo, 15, size_t, FileInfo*); + DEFN_SYSCALL0(size_t, SysGetNumFiles, 16); int Execute(const char* filepath, int argc, const char** argv) { @@ -46,6 +48,16 @@ namespace Maxsi SysPrintPathFiles(); } + size_t GetNumFiles() + { + return SysGetNumFiles(); + } + + int GetFileInfo(size_t index, FileInfo* fileinfo) + { + return SysGetFileInfo(index, fileinfo); + } + void Abort() { // TODO: Send SIGABRT instead! diff --git a/sortix/initrd.cpp b/sortix/initrd.cpp index c8212254..041b44a3 100644 --- a/sortix/initrd.cpp +++ b/sortix/initrd.cpp @@ -24,6 +24,7 @@ #include "platform.h" #include "initrd.h" +#include #include #include "syscall.h" @@ -49,6 +50,35 @@ namespace Sortix } } + size_t SysGetNumFiles() + { + Header* header = (Header*) initrd; + return header->numfiles; + } + + struct FileInfo + { + mode_t permissions; + char name[128]; + }; + + int SysGetFileInfo(size_t index, FileInfo* fileinfo) + { + Header* header = (Header*) initrd; + if ( index >= header->numfiles ) { return -1; } + FileHeader* fhtbl = (FileHeader*) (initrd + sizeof(Header)); + FileHeader* fileheader = &(fhtbl[index]); + + // TODO: Check that fileinfo is a userspace writable buffer. + + STATIC_ASSERT(sizeof(fileheader->name) == sizeof(fileinfo->name)); + + fileinfo->permissions = fileheader->permissions; + Maxsi::Memory::Copy(fileinfo->name, fileheader->name, sizeof(fileheader->name)); + + return 0; + } + void Init(byte* theinitrd, size_t size) { initrd = theinitrd; @@ -61,6 +91,8 @@ namespace Sortix // TODO: We need to do more validation here! Syscall::Register(SYSCALL_PRINT_PATH_FILES, (void*) SysPrintPathFiles); + Syscall::Register(SYSCALL_GET_FILEINFO, (void*) SysGetFileInfo); + Syscall::Register(SYSCALL_GET_NUM_FILES, (void*) SysGetNumFiles); } byte* Open(const char* filepath, size_t* size) diff --git a/sortix/syscallnum.h b/sortix/syscallnum.h index 776ceed6..487cda86 100644 --- a/sortix/syscallnum.h +++ b/sortix/syscallnum.h @@ -40,7 +40,9 @@ #define SYSCALL_FORK 12 #define SYSCALL_GETPID 13 #define SYSCALL_GETPPID 14 -#define SYSCALL_MAX_NUM 15 /* index of highest constant + 1 */ +#define SYSCALL_GET_FILEINFO 15 +#define SYSCALL_GET_NUM_FILES 16 +#define SYSCALL_MAX_NUM 17 /* index of highest constant + 1 */ #endif diff --git a/utils/ls.cpp b/utils/ls.cpp index c053b2b2..6ad0e954 100644 --- a/utils/ls.cpp +++ b/utils/ls.cpp @@ -2,9 +2,17 @@ #include #include +using namespace Maxsi; + int main(int argc, char* argv[]) { - Maxsi::Process::PrintPathFiles(); + size_t numfiles = Process::GetNumFiles(); + for ( size_t i = 0; i < numfiles; i++ ) + { + FileInfo fileinfo; + Process::GetFileInfo(i, &fileinfo); + printf("%s\n", fileinfo.name); + } return 0; }