aboutsummaryrefslogtreecommitdiffhomepage
path: root/exec.cpp
diff options
context:
space:
mode:
authorGravatar ridiculousfish <corydoras@ridiculousfish.com>2013-08-18 16:55:01 -0700
committerGravatar ridiculousfish <corydoras@ridiculousfish.com>2013-08-19 18:06:24 -0700
commite849beabbab31c83ac57693cb0a7ac1e58f8cfd5 (patch)
treefa8872516ac378bd32ef3be5844100bc64cf4c1b /exec.cpp
parent2979d3bf169f51fb2ba218897994745754f830f9 (diff)
Initial work towards various IO cleanups with an eye to fixing https://github.com/fish-shell/fish-shell/issues/110
Diffstat (limited to 'exec.cpp')
-rw-r--r--exec.cpp30
1 files changed, 18 insertions, 12 deletions
diff --git a/exec.cpp b/exec.cpp
index d5c7d4bf..c8c58c9c 100644
--- a/exec.cpp
+++ b/exec.cpp
@@ -49,7 +49,6 @@
#include "expand.h"
#include "signal.h"
-
#include "parse_util.h"
/**
@@ -490,7 +489,7 @@ static bool io_transmogrify(const io_chain_t &in_chain, io_chain_t &out_chain, s
static void internal_exec_helper(parser_t &parser,
const wchar_t *def,
enum block_type_t block_type,
- io_chain_t &ios)
+ const io_chain_t &ios)
{
io_chain_t morphed_chain;
std::vector<int> opened_fds;
@@ -540,9 +539,10 @@ static bool can_use_posix_spawn_for_job(const job_t *job, const process_t *proce
/* Now see if we have a redirection involving a file. The only one we allow is /dev/null, which we assume will not fail. */
bool result = true;
- for (size_t idx = 0; idx < job->io.size(); idx++)
+ const io_chain_t &ios = job->io_chain();
+ for (size_t idx = 0; idx < ios.size(); idx++)
{
- const shared_ptr<const io_data_t> &io = job->io.at(idx);
+ const shared_ptr<const io_data_t> &io = ios.at(idx);
if (redirection_is_to_real_file(io.get()))
{
result = false;
@@ -621,9 +621,10 @@ void exec(parser_t &parser, job_t *j)
}
const io_buffer_t *input_redirect = NULL;
- for (size_t idx = 0; idx < j->io.size(); idx++)
+ const io_chain_t &ios = j->io_chain();
+ for (size_t idx = 0; idx < ios.size(); idx++)
{
- const shared_ptr<io_data_t> &io = j->io.at(idx);
+ const shared_ptr<io_data_t> &io = ios.at(idx);
if ((io->io_mode == IO_BUFFER))
{
@@ -770,13 +771,14 @@ void exec(parser_t &parser, job_t *j)
pipe_read.reset(new io_pipe_t(p->pipe_read_fd, true));
/* Record the current read in pipe_read */
pipe_read->pipe_fd[0] = pipe_current_read;
- j->io.push_back(pipe_read);
+ j->append_io(pipe_read);
}
if (p->next)
{
pipe_write.reset(new io_pipe_t(p->pipe_write_fd, false));
- j->io.push_back(pipe_write);
+ j->append_io(pipe_write);
+
}
/*
@@ -821,6 +823,10 @@ void exec(parser_t &parser, job_t *j)
pipe_next_read = local_pipe[0];
}
+ //fprintf(stderr, "before IO: ");
+ //io_print(j->io);
+
+
switch (p->type)
{
case INTERNAL_FUNCTION:
@@ -873,13 +879,13 @@ void exec(parser_t &parser, job_t *j)
}
else
{
- j->io.push_back(io_buffer);
+ j->append_io(io_buffer);
}
}
if (! exec_error)
{
- internal_exec_helper(parser, def.c_str(), TOP, j->io);
+ internal_exec_helper(parser, def.c_str(), TOP, j->io_chain());
}
parser.allow_function();
@@ -915,7 +921,7 @@ void exec(parser_t &parser, job_t *j)
case INTERNAL_BUILTIN:
{
int builtin_stdin=0;
- int close_stdin=0;
+ bool close_stdin = false;
/*
If this is the first process, check the io
@@ -959,7 +965,7 @@ void exec(parser_t &parser, job_t *j)
}
else
{
- close_stdin = 1;
+ close_stdin = true;
}
break;