From fb3430c56a95306ab15ea0dc911f45559b1aee4f Mon Sep 17 00:00:00 2001 From: apio Date: Thu, 13 Apr 2023 18:33:43 +0200 Subject: [PATCH] apps: Use os::FileSystem --- apps/rm.cpp | 8 ++---- apps/sh.cpp | 72 ++++++++++++++++++++++++++++++++--------------------- 2 files changed, 45 insertions(+), 35 deletions(-) diff --git a/apps/rm.cpp b/apps/rm.cpp index c122cbbe..546572db 100644 --- a/apps/rm.cpp +++ b/apps/rm.cpp @@ -1,5 +1,5 @@ #include -#include +#include Result luna_main(int argc, char** argv) { @@ -9,11 +9,7 @@ Result luna_main(int argc, char** argv) parser.add_positional_argument(path, "path"_sv, true); parser.parse(argc, argv); - if (remove(path.chars()) < 0) - { - perror("rm"); - return 1; - } + TRY(os::FileSystem::remove(path)); return 0; } diff --git a/apps/sh.cpp b/apps/sh.cpp index f3043d98..0d6e4f6b 100644 --- a/apps/sh.cpp +++ b/apps/sh.cpp @@ -1,5 +1,8 @@ +#include #include #include +#include +#include #include #include @@ -9,9 +12,11 @@ #include #include -static Result> split_command_into_argv(const char* cmd) +using os::File; + +static Result> split_command_into_argv(StringView cmd) { - char* str = strdup(cmd); + char* str = strdup(cmd.chars()); Vector result; @@ -31,7 +36,7 @@ static Result> split_command_into_argv(const char* cmd) return result; } -[[noreturn]] static void execute_command(const char* command) +[[noreturn]] static void execute_command(StringView command) { Vector argv; bool ok = split_command_into_argv(command).try_move_value_or_error(argv, errno); @@ -49,48 +54,55 @@ static Result> split_command_into_argv(const char* cmd) Result luna_main(int argc, char** argv) { - StringView file; + StringView path; StringView command; + bool interactive { false }; - FILE* f; + SharedPtr input_file; os::ArgumentParser parser; - parser.add_positional_argument(file, "file"_sv, "-"_sv); + parser.add_positional_argument(path, "path"_sv, "-"_sv); parser.add_value_argument(command, 'c', "command"_sv, true); parser.parse(argc, argv); - if (!command.is_empty()) { execute_command(command.chars()); } + if (!command.is_empty()) execute_command(command); - if (file == "-") f = stdin; - else + if (path == "-") { - f = fopen(file.chars(), "r"); - if (!f) - { - perror("fopen"); - return 1; - } + input_file = File::standard_input(); + interactive = true; } + else + input_file = TRY(File::open(path, File::ReadOnly)); while (1) { - if (file == "-") + if (interactive) { - char* cwd = getcwd(NULL, 0); - if (!cwd) - { - perror("getcwd"); - return 1; - } - printf("sh %s%c ", cwd, getuid() == 0 ? '#' : '$'); - free(cwd); + auto cwd = TRY(os::FileSystem::working_directory()); + printf("sh %s%c ", cwd.chars(), getuid() == 0 ? '#' : '$'); } - char cmd[4096]; - char* rc = fgets(cmd, sizeof(cmd), f); - if (!rc) return 0; + auto cmd = TRY(input_file->read_line()); + if (cmd.is_empty()) break; - if (strspn(cmd, " \n") == strlen(cmd)) continue; + if (strspn(cmd.chars(), " \n") == cmd.length()) continue; + + if (!strncmp(cmd.chars(), "cd", 2)) + { + auto args = TRY(split_command_into_argv(cmd.view())); + check("cd"_sv == args[0]); + + if (args.size() == 2) + { + auto home = TRY(os::FileSystem::home_directory()); + if (chdir(home.chars()) < 0) perror("cd"); + continue; + } + + if (chdir(args[1]) < 0) perror("cd"); + continue; + } pid_t child = fork(); if (child < 0) @@ -99,7 +111,7 @@ Result luna_main(int argc, char** argv) return 1; } - if (child == 0) { execute_command(cmd); } + if (child == 0) { execute_command(cmd.view()); } if (waitpid(child, NULL, 0) < 0) { @@ -107,4 +119,6 @@ Result luna_main(int argc, char** argv) return 1; } } + + return 0; }