added some useless shell commands
This commit is contained in:
@@ -79,13 +79,15 @@ void vga_putchar(char c) {
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t vga_write(vfs_node_t* node, uint32_t offset, uint32_t size, uint8_t* buf) {
|
||||
uint32_t vga_seek(vfs_node_t* node, uint32_t offset, int whence) {
|
||||
terminal_row = offset / VGA_WIDTH;
|
||||
terminal_column = offset % VGA_WIDTH;
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t vga_write(vfs_node_t* node, uint32_t offset, uint32_t size, uint8_t* buf) {
|
||||
for (uint32_t i = 0; i < size; i++) {
|
||||
vga_putchar((char)buf[i]);
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
@@ -7,5 +7,6 @@ void vga_init();
|
||||
void vga_putchar(char c);
|
||||
|
||||
uint32_t vga_write(vfs_node_t* node, uint32_t offset, uint32_t size, uint8_t* buf);
|
||||
uint32_t vga_seek(vfs_node_t* node, uint32_t offset, int whence);
|
||||
|
||||
#endif
|
||||
@@ -79,6 +79,8 @@ void kbd_wait() {
|
||||
}
|
||||
}
|
||||
|
||||
char kbd_read() {
|
||||
return kbd_pop();
|
||||
uint32_t kbd_read(struct vfs_node* node, uint32_t offset, uint32_t size, uint8_t* buffer) {
|
||||
if (!kbd_ready()) return -1;
|
||||
buffer[0] = kbd_pop();
|
||||
return 1;
|
||||
}
|
||||
@@ -1,6 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
char kbd_read();
|
||||
#include <stdint.h>
|
||||
#include <vfs.h>
|
||||
|
||||
uint32_t kbd_read(struct vfs_node* node, uint32_t offset, uint32_t size, uint8_t* buffer);
|
||||
void kbd_push(char c);
|
||||
int kbd_ready();
|
||||
void kbd_wait();
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "vfs.h"
|
||||
#include "elf.h"
|
||||
#include "gdt.h"
|
||||
#include "kbd.h"
|
||||
|
||||
#include <lib/print.h>
|
||||
#include <lib/stream.h>
|
||||
@@ -135,6 +136,10 @@ void kmain(uint32_t magic, multiboot_info* mbi) {
|
||||
|
||||
vfs_node_t* vga_dev = devfs->create(devfs, "tvga");
|
||||
vga_dev->write = vga_write;
|
||||
vga_dev->seek = vga_seek;
|
||||
|
||||
vfs_node_t* kbd_dev = devfs->create(devfs, "kbd");
|
||||
kbd_dev->read = kbd_read;
|
||||
|
||||
vfs_node_t* dev = vfs_find("/dev");
|
||||
if (dev) {
|
||||
|
||||
@@ -196,6 +196,15 @@ static int32_t sys_dup2(int src, int dst) {
|
||||
return dst;
|
||||
}
|
||||
|
||||
static int32_t sys_lseek(int fd, size_t offset, int whence) {
|
||||
if (fd < 0) return 0;
|
||||
process_t* task = current_task();
|
||||
file_t* file = task->fd_table[fd];
|
||||
if (!file) return 0;
|
||||
file->node->seek(file->node, offset, whence);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void syscall(registers_t* regs) {
|
||||
int32_t ret;
|
||||
switch(regs->eax) {
|
||||
@@ -209,6 +218,7 @@ void syscall(registers_t* regs) {
|
||||
case 21: ret = sys_fork(regs); break;
|
||||
case 22: ret = sys_exec(regs, (const char*)regs->ebx); break;
|
||||
case 23: ret = sys_dup2(regs->ebx, regs->ecx); break;
|
||||
case 24: ret = sys_lseek(regs->ebx, regs->ecx, regs->edx); break;
|
||||
default: ret = -1;
|
||||
}
|
||||
regs->eax = ret;
|
||||
|
||||
@@ -14,6 +14,7 @@ struct vfs_node;
|
||||
|
||||
typedef uint32_t (*read_type_t)(struct vfs_node* node, uint32_t offset, uint32_t size, uint8_t* buffer);
|
||||
typedef uint32_t (*write_type_t)(struct vfs_node* node, uint32_t offset, uint32_t size, uint8_t* buffer);
|
||||
typedef uint32_t (*seek_type_t)(struct vfs_node* node, uint32_t offset, int whence);
|
||||
typedef struct vfs_node* (*finddir_type_t)(struct vfs_node* node, const char* name);
|
||||
typedef struct vfs_node* (*mkdir_type_t)(struct vfs_node* node, const char* name);
|
||||
typedef struct vfs_node* (*create_type_t)(struct vfs_node* node, const char* name);
|
||||
@@ -31,6 +32,7 @@ typedef struct vfs_node {
|
||||
finddir_type_t find;
|
||||
mkdir_type_t mkdir;
|
||||
create_type_t create;
|
||||
seek_type_t seek;
|
||||
|
||||
struct vfs_node* mnt;
|
||||
void* data;
|
||||
|
||||
Reference in New Issue
Block a user