mirror of
https://github.com/usatiuk/ficus.git
synced 2025-10-29 00:27:52 +01:00
Basic shell
This commit is contained in:
@@ -173,7 +173,8 @@ uint64_t syscall_execve(const char *pathname, char *const argv[], char *const en
|
||||
// Just copy for now;
|
||||
FDT::FD fd = VFSApi::open(StrToPath(pathname));
|
||||
if (fd == -1) return -1;
|
||||
File *f = VFSApi::get(fd);
|
||||
File *f = VFSApi::get(fd);
|
||||
if (f->dir().get() != nullptr) return -1;
|
||||
|
||||
cgistd::vector<char> read_data(f->size());
|
||||
f->read(read_data.begin(), f->size());
|
||||
|
||||
@@ -31,17 +31,17 @@ uint64_t File::seek(uint64_t pos) {
|
||||
}
|
||||
uint64_t File::read(char *buf, uint64_t size) {
|
||||
if (file().get() != nullptr) {
|
||||
file()->read(buf, _pos, size);
|
||||
_pos += size;
|
||||
return size;
|
||||
int64_t fret = file()->read(buf, _pos, size);
|
||||
_pos += fret;
|
||||
return fret;
|
||||
}
|
||||
}
|
||||
uint64_t File::write(const char *buf, uint64_t size) {
|
||||
if (!(_opts & FileOpts::O_WRONLY)) return -1;
|
||||
if (file().get() != nullptr) {
|
||||
file()->write(buf, _pos, size);
|
||||
_pos += size;
|
||||
return size;
|
||||
int64_t fret = file()->write(buf, _pos, size);
|
||||
_pos += fret;
|
||||
return fret;
|
||||
}
|
||||
}
|
||||
uint64_t File::size() {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
#include "MemFs.hpp"
|
||||
#include "LockGuard.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
Vector<SharedPtr<Node>> MemFs::MemFsNodeDir::children() {
|
||||
LockGuard l(_lock);
|
||||
|
||||
@@ -27,22 +29,21 @@ SharedPtr<NodeFile> MemFs::MemFsNodeDir::mkfile(const String &name) {
|
||||
_children.add(name, static_ptr_cast<Node>(newfile));
|
||||
return static_ptr_cast<NodeFile>(newfile);
|
||||
}
|
||||
bool MemFs::MemFsNodeFile::read(char *buf, size_t start, size_t num) {
|
||||
int64_t MemFs::MemFsNodeFile::read(char *buf, size_t start, size_t num) {
|
||||
LockGuard l(_lock);
|
||||
if (start >= _bytes.size()) return false;
|
||||
if (start + num > _bytes.size()) return false;
|
||||
num = std::min(num, _bytes.size() - start);
|
||||
for (size_t i = 0; i < num; i++) {
|
||||
buf[i] = _bytes[start + i];
|
||||
}
|
||||
return false;
|
||||
return num;
|
||||
}
|
||||
bool MemFs::MemFsNodeFile::write(const char *buf, size_t start, size_t num) {
|
||||
int64_t MemFs::MemFsNodeFile::write(const char *buf, size_t start, size_t num) {
|
||||
LockGuard l(_lock);
|
||||
while (_bytes.size() <= start + num) _bytes.emplace_back(0);
|
||||
for (size_t i = 0; i < num; i++) {
|
||||
_bytes[start + i] = buf[i];
|
||||
}
|
||||
return true;
|
||||
return num;
|
||||
}
|
||||
size_t MemFs::MemFsNodeFile::size() {
|
||||
LockGuard l(_lock);
|
||||
|
||||
@@ -31,8 +31,8 @@ class MemFs : public Filesystem {
|
||||
|
||||
struct MemFsNodeFile : public NodeFile {
|
||||
public:
|
||||
bool read(char *buf, size_t start, size_t num) override;
|
||||
bool write(const char *buf, size_t start, size_t num) override;
|
||||
int64_t read(char *buf, size_t start, size_t num) override;
|
||||
int64_t write(const char *buf, size_t start, size_t num) override;
|
||||
size_t size() override;
|
||||
bool is_tty() override { return false; }
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ protected:
|
||||
mutable Mutex _lock;
|
||||
|
||||
String _name;
|
||||
Filesystem *_mount = nullptr;
|
||||
Filesystem *_mount = nullptr;
|
||||
WeakPtr<Node> _self_weak = nullptr;
|
||||
};
|
||||
|
||||
@@ -50,8 +50,8 @@ class NodeFile;
|
||||
class NodeDir : public Node {
|
||||
public:
|
||||
virtual Vector<SharedPtr<Node>> children() = 0;
|
||||
virtual SharedPtr<NodeDir> mkdir(const String &name) = 0;
|
||||
virtual SharedPtr<NodeFile> mkfile(const String &name) = 0;
|
||||
virtual SharedPtr<NodeDir> mkdir(const String &name) = 0;
|
||||
virtual SharedPtr<NodeFile> mkfile(const String &name) = 0;
|
||||
virtual void set_mounted(Filesystem *mount);
|
||||
|
||||
protected:
|
||||
@@ -60,10 +60,10 @@ protected:
|
||||
|
||||
class NodeFile : public Node {
|
||||
public:
|
||||
virtual bool read(char *buf, size_t start, size_t num) = 0;
|
||||
virtual bool write(const char *buf, size_t start, size_t num) = 0;
|
||||
virtual size_t size() = 0;
|
||||
virtual bool is_tty() = 0;
|
||||
virtual int64_t read(char *buf, size_t start, size_t num) = 0;
|
||||
virtual int64_t write(const char *buf, size_t start, size_t num) = 0;
|
||||
virtual size_t size() = 0;
|
||||
virtual bool is_tty() = 0;
|
||||
|
||||
protected:
|
||||
NodeFile() : Node(Type::FILE) {}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
#include "TtyPipe.hpp"
|
||||
#include "TtyManager.hpp"
|
||||
bool TtyPipe::read(char *buf, size_t start, size_t num) {
|
||||
int64_t TtyPipe::read(char *buf, size_t start, size_t num) {
|
||||
auto c = buf;
|
||||
while ((c - buf) < num) {
|
||||
*c = GlobalTtyManager.get_tty(0)->readchar();
|
||||
@@ -16,7 +16,7 @@ bool TtyPipe::read(char *buf, size_t start, size_t num) {
|
||||
}
|
||||
return (c - buf);
|
||||
}
|
||||
bool TtyPipe::write(const char *buf, size_t start, size_t num) {
|
||||
int64_t TtyPipe::write(const char *buf, size_t start, size_t num) {
|
||||
auto c = buf;
|
||||
while (*c != '\0' && (c - buf) < num) {
|
||||
GlobalTtyManager.all_tty_putchar(*c);
|
||||
|
||||
@@ -9,12 +9,12 @@
|
||||
#include "Node.hpp"
|
||||
class TtyPipe : public NodeFile {
|
||||
public:
|
||||
bool read(char *buf, size_t start, size_t num) override;
|
||||
bool write(const char *buf, size_t start, size_t num) override;
|
||||
size_t size() override;
|
||||
bool is_tty() override { return true; }
|
||||
int64_t read(char *buf, size_t start, size_t num) override;
|
||||
int64_t write(const char *buf, size_t start, size_t num) override;
|
||||
size_t size() override;
|
||||
bool is_tty() override { return true; }
|
||||
|
||||
static SharedPtr<TtyPipe> create() {
|
||||
static SharedPtr<TtyPipe> create() {
|
||||
auto shared = SharedPtr(new TtyPipe());
|
||||
shared->_self_weak = static_ptr_cast<Node>(shared);
|
||||
return shared;
|
||||
|
||||
@@ -2,48 +2,48 @@
|
||||
|
||||
#include "stdio.h"
|
||||
#include "stdlib.h"
|
||||
#include <sys/fcntl.h>
|
||||
#include <dirent.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <unistd.h>
|
||||
|
||||
void ls() {
|
||||
DIR *rfd = opendir("/");
|
||||
struct dirent *cur = readdir(rfd);
|
||||
while (cur) {
|
||||
printf("%s\n", cur->d_name);
|
||||
cur = readdir(rfd);
|
||||
}
|
||||
closedir(rfd);
|
||||
}
|
||||
|
||||
int main() {
|
||||
malloc(100);
|
||||
malloc(100);
|
||||
malloc(100);
|
||||
malloc(100);
|
||||
printf("Who are you?\n");
|
||||
char *line = NULL;
|
||||
size_t len = 0;
|
||||
// __getline(&line, &len, stdin);
|
||||
{
|
||||
uint64_t test123 = open("/test123", O_CREAT | O_RDWR);
|
||||
const char *teststr = "test str";
|
||||
write(test123, teststr, 9);
|
||||
close(test123);
|
||||
|
||||
|
||||
printf("hi %s\n", line);
|
||||
// sputchar('h');
|
||||
// sputchar('i');
|
||||
// sputchar('\n');
|
||||
uint64_t test123 = open("/test123", O_CREAT | O_RDWR);
|
||||
const char *teststr = "test str";
|
||||
write(test123, teststr, 9);
|
||||
close(test123);
|
||||
|
||||
test123 = open("/test123", O_RDONLY);
|
||||
char buf[123];
|
||||
read(test123, buf, 9);
|
||||
|
||||
printf("\n %s \n", buf);
|
||||
|
||||
usleep(100);
|
||||
|
||||
execve("/hello2", 0, 0);
|
||||
test123 = open("/test123", O_RDONLY);
|
||||
char buf[123];
|
||||
read(test123, buf, 9);
|
||||
close(test123);
|
||||
printf("\n %s \n", buf);
|
||||
}
|
||||
|
||||
while (1) {
|
||||
printf("\n");
|
||||
char c;
|
||||
scanf(" %c", &c);
|
||||
if (c == 'm') print_mem();
|
||||
if (c == 't') print_tasks();
|
||||
if (c == 'h') execve("/hello2", 0, 0);
|
||||
printf("%c", c);
|
||||
printf("\n> ");
|
||||
char line[30];
|
||||
scanf(" %24[^\n]", line);
|
||||
if (strcmp(line, "ls") == 0) {
|
||||
ls();
|
||||
} else if (strcmp(line, "mem") == 0) {
|
||||
print_mem();
|
||||
} else if (strcmp(line, "tasks") == 0) {
|
||||
print_tasks();
|
||||
} else {
|
||||
execve(line, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user