forked from Bananymous/banan-os
Userspace: Shell argument parse now results in BAN::String
This commit is contained in:
parent
e7a98ac6cc
commit
f7060970e6
|
@ -10,17 +10,12 @@
|
||||||
|
|
||||||
struct termios old_termios, new_termios;
|
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(' '));
|
auto args = MUST(command.split(' '));
|
||||||
BAN::Vector<char*> result;
|
BAN::Vector<BAN::String> result;
|
||||||
for (auto arg : args)
|
for (auto arg : args)
|
||||||
{
|
MUST(result.push_back(arg));
|
||||||
char* carg = new char[arg.size() + 1];
|
|
||||||
memcpy(carg, arg.data(), arg.size());
|
|
||||||
carg[arg.size()] = '\0';
|
|
||||||
MUST(result.push_back(carg));
|
|
||||||
}
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,11 +25,6 @@ int execute_command(BAN::StringView command)
|
||||||
if (args.empty())
|
if (args.empty())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
BAN::ScopeGuard deleter([&args] {
|
|
||||||
for (char* arg : args)
|
|
||||||
delete[] arg;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (args.front() == "clear"sv)
|
if (args.front() == "clear"sv)
|
||||||
{
|
{
|
||||||
fprintf(stdout, "\e[H\e[J");
|
fprintf(stdout, "\e[H\e[J");
|
||||||
|
@ -48,7 +38,7 @@ int execute_command(BAN::StringView command)
|
||||||
else if (args.front() == "export"sv)
|
else if (args.front() == "export"sv)
|
||||||
{
|
{
|
||||||
bool first = false;
|
bool first = false;
|
||||||
for (const char* arg : args)
|
for (const auto& arg : args)
|
||||||
{
|
{
|
||||||
if (first)
|
if (first)
|
||||||
{
|
{
|
||||||
|
@ -56,20 +46,15 @@ int execute_command(BAN::StringView command)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* eq_sign = strchr(arg, '=');
|
auto split = MUST(arg.sv().split('=', true));
|
||||||
if (eq_sign == nullptr)
|
if (split.size() != 2)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
char name[128];
|
if (setenv(BAN::String(split[0]).data(), BAN::String(split[1]).data(), true) == -1)
|
||||||
if (eq_sign - arg >= sizeof(name))
|
{
|
||||||
continue;
|
perror("setenv");
|
||||||
memcpy(name, arg, eq_sign - arg);
|
return 1;
|
||||||
name[eq_sign - arg] = '\0';
|
}
|
||||||
|
|
||||||
char value[128];
|
|
||||||
strncpy(value, eq_sign + 1, sizeof(value));
|
|
||||||
|
|
||||||
setenv(name, value, true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (args.front() == "cd"sv)
|
else if (args.front() == "cd"sv)
|
||||||
|
@ -80,18 +65,19 @@ int execute_command(BAN::StringView command)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* path = nullptr;
|
BAN::StringView path;
|
||||||
|
|
||||||
if (args.size() == 1)
|
if (args.size() == 1)
|
||||||
{
|
{
|
||||||
path = getenv("HOME");
|
if (const char* path_env = getenv("HOME"))
|
||||||
if (path == nullptr)
|
path = path_env;
|
||||||
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
path = args[1];
|
path = args[1];
|
||||||
|
|
||||||
if (chdir(args.size() == 2 ? args[1] : getenv("HOME")) == -1)
|
if (chdir(path.data()) == -1)
|
||||||
{
|
{
|
||||||
perror("chdir");
|
perror("chdir");
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -102,8 +88,12 @@ int execute_command(BAN::StringView command)
|
||||||
pid_t pid = fork();
|
pid_t pid = fork();
|
||||||
if (pid == 0)
|
if (pid == 0)
|
||||||
{
|
{
|
||||||
MUST(args.push_back(nullptr));
|
BAN::Vector<char*> cmd_args;
|
||||||
execv(args.front(), args.data());
|
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");
|
perror("execv");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue