mirror of
https://gitlab.com/sortix/sortix.git
synced 2023-02-13 20:55:38 -05:00
Added an API for user-space to list the initrd, and 'ls' does so now.
This commit is contained in:
parent
329c8cc468
commit
f9e10ab265
5 changed files with 64 additions and 2 deletions
|
@ -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();
|
||||
|
|
|
@ -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!
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
10
utils/ls.cpp
10
utils/ls.cpp
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue