Userspace: Shell argument parse now results in BAN::String

This commit is contained in:
Bananymous 2023-06-19 00:34:44 +03:00
parent e7a98ac6cc
commit f7060970e6
1 changed files with 22 additions and 32 deletions

View File

@ -10,17 +10,12 @@
struct termios old_termios, new_termios;
BAN::Vector<char*> parse_command(BAN::StringView command)
BAN::Vector<BAN::String> parse_command(BAN::StringView command)
{
auto args = MUST(command.split(' '));
BAN::Vector<char*> result;
BAN::Vector<BAN::String> result;
for (auto arg : args)
{
char* carg = new char[arg.size() + 1];
memcpy(carg, arg.data(), arg.size());
carg[arg.size()] = '\0';
MUST(result.push_back(carg));
}
MUST(result.push_back(arg));
return result;
}
@ -29,11 +24,6 @@ int execute_command(BAN::StringView command)
auto args = parse_command(command);
if (args.empty())
return 0;
BAN::ScopeGuard deleter([&args] {
for (char* arg : args)
delete[] arg;
});
if (args.front() == "clear"sv)
{
@ -48,7 +38,7 @@ int execute_command(BAN::StringView command)
else if (args.front() == "export"sv)
{
bool first = false;
for (const char* arg : args)
for (const auto& arg : args)
{
if (first)
{
@ -56,20 +46,15 @@ int execute_command(BAN::StringView command)
continue;
}
const char* eq_sign = strchr(arg, '=');
if (eq_sign == nullptr)
auto split = MUST(arg.sv().split('=', true));
if (split.size() != 2)
continue;
char name[128];
if (eq_sign - arg >= sizeof(name))
continue;
memcpy(name, arg, eq_sign - arg);
name[eq_sign - arg] = '\0';
char value[128];
strncpy(value, eq_sign + 1, sizeof(value));
setenv(name, value, true);
if (setenv(BAN::String(split[0]).data(), BAN::String(split[1]).data(), true) == -1)
{
perror("setenv");
return 1;
}
}
}
else if (args.front() == "cd"sv)
@ -80,18 +65,19 @@ int execute_command(BAN::StringView command)
return 1;
}
const char* path = nullptr;
BAN::StringView path;
if (args.size() == 1)
{
path = getenv("HOME");
if (path == nullptr)
if (const char* path_env = getenv("HOME"))
path = path_env;
else
return 0;
}
else
path = args[1];
if (chdir(args.size() == 2 ? args[1] : getenv("HOME")) == -1)
if (chdir(path.data()) == -1)
{
perror("chdir");
return 1;
@ -102,8 +88,12 @@ int execute_command(BAN::StringView command)
pid_t pid = fork();
if (pid == 0)
{
MUST(args.push_back(nullptr));
execv(args.front(), args.data());
BAN::Vector<char*> cmd_args;
MUST(cmd_args.reserve(args.size() + 1));
for (const auto& arg : args)
MUST(cmd_args.push_back((char*)arg.data()));
MUST(cmd_args.push_back(nullptr));
execv(cmd_args.front(), cmd_args.data());
perror("execv");
exit(1);
}