1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-28 05:05:08 +00:00

Shell: Separate fd rewirings from redirections.

This was unnecessarily confusing. When we build up a chain of commands
connected by pipes, we now store the file descriptors of each end of
these pipes as rewirings in a vector. The rewirings are then put into
effect by calls to dup2().
This commit is contained in:
Andreas Kling 2019-06-04 20:36:08 +02:00
parent 59dae9a766
commit 848044b74c
3 changed files with 19 additions and 18 deletions

View file

@ -19,7 +19,7 @@ void Parser::commit_subcommand()
{
if (m_tokens.is_empty())
return;
m_subcommands.append({ move(m_tokens), move(m_redirections) });
m_subcommands.append({ move(m_tokens), move(m_redirections), {} });
}
void Parser::do_pipe()

View file

@ -10,7 +10,6 @@ struct Redirection {
FileWrite,
FileWriteAppend,
FileRead,
Rewire
};
Type type;
int fd { -1 };
@ -18,9 +17,15 @@ struct Redirection {
String path {};
};
struct Rewiring {
int fd { -1 };
int rewire_fd { -1 };
};
struct Subcommand {
Vector<String> args;
Vector<Redirection> redirections;
Vector<Rewiring> rewirings;
};
class Parser {

View file

@ -315,9 +315,9 @@ static int run_command(const String& cmd)
perror("pipe");
return 1;
}
subcommand.redirections.append({ Redirection::Rewire, STDOUT_FILENO, pipefd[1] });
subcommand.rewirings.append({ STDOUT_FILENO, pipefd[1] });
auto& next_command = subcommands[i + 1];
next_command.redirections.append({ Redirection::Rewire, STDIN_FILENO, pipefd[0] });
next_command.rewirings.append({ STDIN_FILENO, pipefd[0] });
fds.add(pipefd[0]);
fds.add(pipefd[1]);
break;
@ -328,7 +328,7 @@ static int run_command(const String& cmd)
perror("open");
return 1;
}
subcommand.redirections.append({ Redirection::Rewire, redirection.fd, fd });
subcommand.rewirings.append({ redirection.fd, fd });
fds.add(fd);
break;
}
@ -338,7 +338,7 @@ static int run_command(const String& cmd)
perror("open");
return 1;
}
subcommand.redirections.append({ Redirection::Rewire, redirection.fd, fd });
subcommand.rewirings.append({ redirection.fd, fd });
fds.add(fd);
break;
}
@ -348,12 +348,10 @@ static int run_command(const String& cmd)
perror("open");
return 1;
}
subcommand.redirections.append({ Redirection::Rewire, redirection.fd, fd });
subcommand.rewirings.append({ redirection.fd, fd });
fds.add(fd);
break;
}
case Redirection::Rewire:
break; // ignore
}
}
}
@ -390,18 +388,16 @@ static int run_command(const String& cmd)
if (!child) {
setpgid(0, 0);
tcsetpgrp(0, getpid());
for (auto& redirection : subcommand.redirections) {
if (redirection.type == Redirection::Rewire) {
#ifdef SH_DEBUGsh
for (auto& rewiring : subcommand.rewirings) {
#ifdef SH_DEBUG
dbgprintf("in %s<%d>, dup2(%d, %d)\n", argv[0], getpid(), redirection.rewire_fd, redirection.fd);
#endif
int rc = dup2(redirection.rewire_fd, redirection.fd);
int rc = dup2(rewiring.rewire_fd, rewiring.fd);
if (rc < 0) {
perror("dup2");
return 1;
}
}
}
fds.collect();