CeDOS - Commit 00f142fe

Opening files exposed to user processes, added new shell tools
Celina Kalus
Mon, 27 Mar 2023 15:07:32 +0200
9 files changed, 114 insertions(+), 6 deletions(-)
M run.shrun.sh

@@ -1,1 +1,1 @@

-qemu-system-i386 -drive index=0,if=floppy,format=raw,file=./build/release/cedos.img -m 64 -monitor stdio -no-reboot -d int,cpu_reset,exec,in_asm 2> log/run_err.log+qemu-system-i386 -drive index=0,if=floppy,format=raw,file=./build/release/cedos.img -m 64 -monitor stdio -no-reboot -d int,cpu_reset,exec,in_asm -vnc :0 2> log/run_err.log
A src/apps/cat.c

@@ -0,0 +1,25 @@

+#include "common/cedos.h" +#include "common/stdio.h" + +#include <stdint.h> + +void main(char *args) { + int fd = sc_file_open(args, 0); + + if (fd < 0) { + printf("Could not find file: %s\n", args); + return; + } + + char *buffer = (void*)(0x2000000); + + int size = sc_file_read(fd, buffer, -1); + + while (size > 0) { + int chunk = 256; + if (size < chunk) { chunk = size; } + sc_file_write(0, buffer, chunk); + size -= chunk; + buffer += chunk; + } +}
M src/apps/common/cedos.csrc/apps/common/cedos.c

@@ -20,6 +20,12 @@ interrupt(0x30, res, 3, 0, 0, 0);

return res; } +int file_openat(int fd, const char *fname, int flags) { + volatile uint32_t res = 0; + interrupt(0x30, res, 6, fd, fname, flags); + return res; +} + int sc_file_read(int fd, char *buffer, uint32_t size) { volatile uint32_t res = 0; interrupt(0x30, res, 0, fd, buffer, size);

@@ -41,4 +47,10 @@

void process_wait(int pid) { volatile uint32_t res = 0; interrupt(0x30, res, 5, pid, 0, 0); +} + +int sc_file_open(char *pathname, int flags) { + volatile uint32_t res = 0; + interrupt(0x30, res, 6, pathname, flags, 0); + return res; }
M src/apps/common/cedos.hsrc/apps/common/cedos.h

@@ -13,5 +13,7 @@ void process_wait(int pid);

int sc_file_read(int fd, char *buffer, uint32_t size); int sc_file_write(int fd, char *buffer, uint32_t size); +int sc_file_openat(int fd, char *buffer, uint32_t size); + #endif
M src/apps/common/stdio.csrc/apps/common/stdio.c

@@ -97,6 +97,12 @@ while (str[length]) { length++; }

print(str, length); } +int print_hex_char(uint8_t c) { + char buffer[2]; + int size = sprint_hex_char(c, buffer); + print(buffer, size); +} + void print_char(char c) { print(&c, 1); }

@@ -117,6 +123,8 @@ if (*fmt == 'X') {

print_uint32(va_arg(args, uint32_t)); } else if (*fmt == 'i') { print_int(va_arg(args, int)); + } else if (*fmt == 'x') { + print_int(va_arg(args, char)); } else if (*fmt == 'u') { print_uint(va_arg(args, unsigned int)); } else if (*fmt == 'p') {
M src/apps/echo.csrc/apps/echo.c

@@ -4,5 +4,5 @@

#include <stdint.h> void main(char *args) { - printf(args); + printf("%s\n", args); }
A src/apps/hexdump.c

@@ -0,0 +1,42 @@

+#include "common/cedos.h" +#include "common/stdio.h" + +#include <stdint.h> + +int hexdump(char *address, int length) { + unsigned char *first_line = (char *)((long)address & (long)0xFFFFFFF0); + unsigned char *last_line = (char *)((long)(address + length) & (long)0xFFFFFFF0); + + while (1) { + if (first_line >= last_line) { break; } + printf("%p ", first_line); + for (int i = 0; i < 16; i++) { + printf("%X ", (unsigned int)(first_line[i])); + } + printf(" |"); + for (int i = 0; i < 16; i++) { + uint8_t c = *(uint8_t*)(&first_line[i]); + if (c < 0x20 || c > 0x7F) { c = '.'; } + printf("%c", c); + } + printf("\n"); + + + first_line += 0x10; + } +} + +void main(char *args) { + int fd = sc_file_open(args, 0); + + if (fd < 0) { + printf("Could not find file: %s\n", args); + return; + } + + char *buffer = (void*)(0x2000000); + + int size = sc_file_read(fd, buffer, -1); + + hexdump(buffer, size); +}
M src/apps/shell.csrc/apps/shell.c

@@ -3,7 +3,7 @@ #include "common/stdio.h"

#include <stdint.h> -void read_line(char *buffer) { +int read_line(char *buffer) { int i = 0; char c; buffer[0] = 0;

@@ -25,6 +25,8 @@ }

buffer[i] = 0; sc_file_write(0, &c, 1); + + return i; } void main(char *args) {

@@ -36,11 +38,27 @@ while (1) {

printf("/> "); char buffer[256]; - read_line(buffer); + int length = read_line(buffer); + + if (length == 0) { continue; } + + char *file = buffer; + char *args = (char *)(0); + + int i = 0; + while (1) { + if (buffer[i] == ' ') { + buffer[i] = 0; + args = &(buffer[i+1]); + break; + } + + i++; + } //printf("Executing %s...\n", buffer); - int pid = process_spawn(buffer, "Hello, world!\n"); + int pid = process_spawn(file, args); //printf("Child process %i spawned, waiting for termination...\n", pid);
M src/kernel/syscall.csrc/kernel/syscall.c

@@ -17,7 +17,8 @@ file_write,

sched_yield, get_current_process, sched_spawn, - sched_wait + sched_wait, + file_open }; extern void syscall_interrupt(void);