Added an API for user-space to list the initrd, and 'ls' does so now.

This commit is contained in:
Jonas 'Sortie' Termansen 2011-11-03 18:26:43 +01:00
parent 329c8cc468
commit f9e10ab265
5 changed files with 64 additions and 2 deletions

View File

@ -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();

View File

@ -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!

View File

@ -24,6 +24,7 @@
#include "platform.h"
#include "initrd.h"
#include <libmaxsi/memory.h>
#include <libmaxsi/string.h>
#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)

View File

@ -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

View File

@ -2,9 +2,17 @@
#include <libmaxsi/platform.h>
#include <libmaxsi/process.h>
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;
}