Basic shell

This commit is contained in:
2024-04-07 22:59:01 +02:00
parent 8ae69b4bc5
commit b56a314bdd
8 changed files with 67 additions and 65 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -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) {}

View 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);

View File

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

View File

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