From 0ab3332ad3a8102e5aeb29aee58c4ccd58854ff2 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 16 May 2023 19:22:46 +0300 Subject: [PATCH] Userspace: Start work on shell --- kernel/kernel/kernel.cpp | 2 +- userspace/CMakeLists.txt | 1 + userspace/Shell/CMakeLists.txt | 18 ++++++++++++++++++ userspace/Shell/main.cpp | 27 +++++++++++++++++++++++++++ userspace/cat/main.cpp | 4 ---- 5 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 userspace/Shell/CMakeLists.txt create mode 100644 userspace/Shell/main.cpp diff --git a/kernel/kernel/kernel.cpp b/kernel/kernel/kernel.cpp index 71b8eab69c..b1df11d8af 100644 --- a/kernel/kernel/kernel.cpp +++ b/kernel/kernel/kernel.cpp @@ -180,7 +180,7 @@ static void init2(void* tty1) ((TTY*)tty1)->initialize_device(); - MUST(Process::create_userspace("/usr/bin/cat"sv)); + MUST(Process::create_userspace("/usr/bin/Shell"sv)); return; Process::create_kernel( diff --git a/userspace/CMakeLists.txt b/userspace/CMakeLists.txt index add6c6be0b..0138f20e0b 100644 --- a/userspace/CMakeLists.txt +++ b/userspace/CMakeLists.txt @@ -3,6 +3,7 @@ cmake_minimum_required(VERSION 3.26) project(userspace CXX) set(USERSPACE_PROJECTS + Shell cat test yes diff --git a/userspace/Shell/CMakeLists.txt b/userspace/Shell/CMakeLists.txt new file mode 100644 index 0000000000..0d742bf91a --- /dev/null +++ b/userspace/Shell/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.26) + +project(Shell CXX) + +set(SOURCES + main.cpp +) + +add_executable(Shell ${SOURCES}) +target_compile_options(Shell PUBLIC -O2 -g) +add_dependencies(Shell libc-install) +target_link_options(Shell PUBLIC -nodefaultlibs) +target_link_libraries(Shell PUBLIC ${BANAN_LIB}/libc.a) + +add_custom_target(Shell-install + COMMAND cp ${CMAKE_CURRENT_BINARY_DIR}/Shell ${BANAN_BIN}/ + DEPENDS Shell +) diff --git a/userspace/Shell/main.cpp b/userspace/Shell/main.cpp new file mode 100644 index 0000000000..a0eaf2ee1c --- /dev/null +++ b/userspace/Shell/main.cpp @@ -0,0 +1,27 @@ +#include +#include + +struct termios old_termios, new_termios; + +int main(int argc, char** argv) +{ + for (int i = 0; i < argc; i++) + printf("%s\n", argv[i]); + + tcgetattr(0, &old_termios); + + new_termios = old_termios; + new_termios.c_lflag &= ~(ECHO | ICANON); + tcsetattr(0, TCSANOW, &new_termios); + + while (true) + { + char c; + fread(&c, 1, sizeof(char), stdin); + fputc(c, stdout); + fflush(stdout); + } + + tcsetattr(0, TCSANOW, &old_termios); + return 0; +} diff --git a/userspace/cat/main.cpp b/userspace/cat/main.cpp index ce1d3da91d..31473283c9 100644 --- a/userspace/cat/main.cpp +++ b/userspace/cat/main.cpp @@ -21,10 +21,6 @@ int main(int argc, char** argv) { int ret = 0; - printf("argc %d, argv %p\n", argc, argv); - for (int i = 0; i < argc; i++) - printf("%s\n", argv[i]); - if (argc > 1) { for (int i = 1; i < argc; i++)