mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 06:58:11 +00:00
parent
0dac7af6c5
commit
c589625418
6 changed files with 81 additions and 13 deletions
|
@ -757,23 +757,41 @@ int Shell::builtin_unset(int argc, const char** argv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool Shell::run_builtin(int argc, const char** argv, int& retval)
|
||||
bool Shell::run_builtin(const AST::Command& command, const NonnullRefPtrVector<AST::Rewiring>& rewirings, int& retval)
|
||||
{
|
||||
if (argc == 0)
|
||||
if (command.argv.is_empty())
|
||||
return false;
|
||||
|
||||
StringView name { argv[0] };
|
||||
if (!has_builtin(command.argv.first()))
|
||||
return false;
|
||||
|
||||
#define __ENUMERATE_SHELL_BUILTIN(builtin) \
|
||||
if (name == #builtin) { \
|
||||
retval = builtin_##builtin(argc, argv); \
|
||||
return true; \
|
||||
Vector<const char*> argv;
|
||||
for (auto& arg : command.argv)
|
||||
argv.append(arg.characters());
|
||||
|
||||
argv.append(nullptr);
|
||||
|
||||
StringView name = command.argv.first();
|
||||
|
||||
SavedFileDescriptors fds { rewirings };
|
||||
|
||||
for (auto& rewiring : rewirings) {
|
||||
int rc = dup2(rewiring.dest_fd, rewiring.source_fd);
|
||||
if (rc < 0) {
|
||||
perror("dup2(run)");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
#define __ENUMERATE_SHELL_BUILTIN(builtin) \
|
||||
if (name == #builtin) { \
|
||||
retval = builtin_##builtin(argv.size() - 1, argv.data()); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
ENUMERATE_SHELL_BUILTINS();
|
||||
|
||||
#undef __ENUMERATE_SHELL_BUILTIN
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue