Added an API for user-space to list the initrd, and 'ls' does so now.
This commit is contained in:
parent
329c8cc468
commit
f9e10ab265
|
@ -27,10 +27,18 @@
|
||||||
|
|
||||||
namespace Maxsi
|
namespace Maxsi
|
||||||
{
|
{
|
||||||
|
struct FileInfo
|
||||||
|
{
|
||||||
|
mode_t permissions;
|
||||||
|
char name[128];
|
||||||
|
};
|
||||||
|
|
||||||
namespace Process
|
namespace Process
|
||||||
{
|
{
|
||||||
int Execute(const char* filepath, int argc, const char** argv);
|
int Execute(const char* filepath, int argc, const char** argv);
|
||||||
void PrintPathFiles();
|
void PrintPathFiles();
|
||||||
|
size_t GetNumFiles();
|
||||||
|
int GetFileInfo(size_t index, FileInfo* fileinfo);
|
||||||
void Abort();
|
void Abort();
|
||||||
void Exit(int code);
|
void Exit(int code);
|
||||||
pid_t Fork();
|
pid_t Fork();
|
||||||
|
|
|
@ -35,6 +35,8 @@ namespace Maxsi
|
||||||
DEFN_SYSCALL0(pid_t, SysFork, 12);
|
DEFN_SYSCALL0(pid_t, SysFork, 12);
|
||||||
DEFN_SYSCALL0(pid_t, SysGetPID, 13);
|
DEFN_SYSCALL0(pid_t, SysGetPID, 13);
|
||||||
DEFN_SYSCALL0(pid_t, SysGetParentPID, 14);
|
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)
|
int Execute(const char* filepath, int argc, const char** argv)
|
||||||
{
|
{
|
||||||
|
@ -46,6 +48,16 @@ namespace Maxsi
|
||||||
SysPrintPathFiles();
|
SysPrintPathFiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t GetNumFiles()
|
||||||
|
{
|
||||||
|
return SysGetNumFiles();
|
||||||
|
}
|
||||||
|
|
||||||
|
int GetFileInfo(size_t index, FileInfo* fileinfo)
|
||||||
|
{
|
||||||
|
return SysGetFileInfo(index, fileinfo);
|
||||||
|
}
|
||||||
|
|
||||||
void Abort()
|
void Abort()
|
||||||
{
|
{
|
||||||
// TODO: Send SIGABRT instead!
|
// TODO: Send SIGABRT instead!
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
#include "initrd.h"
|
#include "initrd.h"
|
||||||
|
#include <libmaxsi/memory.h>
|
||||||
#include <libmaxsi/string.h>
|
#include <libmaxsi/string.h>
|
||||||
#include "syscall.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)
|
void Init(byte* theinitrd, size_t size)
|
||||||
{
|
{
|
||||||
initrd = theinitrd;
|
initrd = theinitrd;
|
||||||
|
@ -61,6 +91,8 @@ namespace Sortix
|
||||||
// TODO: We need to do more validation here!
|
// TODO: We need to do more validation here!
|
||||||
|
|
||||||
Syscall::Register(SYSCALL_PRINT_PATH_FILES, (void*) SysPrintPathFiles);
|
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)
|
byte* Open(const char* filepath, size_t* size)
|
||||||
|
|
|
@ -40,7 +40,9 @@
|
||||||
#define SYSCALL_FORK 12
|
#define SYSCALL_FORK 12
|
||||||
#define SYSCALL_GETPID 13
|
#define SYSCALL_GETPID 13
|
||||||
#define SYSCALL_GETPPID 14
|
#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
|
#endif
|
||||||
|
|
||||||
|
|
10
utils/ls.cpp
10
utils/ls.cpp
|
@ -2,9 +2,17 @@
|
||||||
#include <libmaxsi/platform.h>
|
#include <libmaxsi/platform.h>
|
||||||
#include <libmaxsi/process.h>
|
#include <libmaxsi/process.h>
|
||||||
|
|
||||||
|
using namespace Maxsi;
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue