From 53b4f58c78e21cbc442891c2ce2a2b99a32e47bc Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 14 Dec 2017 14:24:38 +0200 Subject: Add process::pipe struct, extend process API --- libbutl/process-run.txx | 104 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 89 insertions(+), 15 deletions(-) (limited to 'libbutl/process-run.txx') diff --git a/libbutl/process-run.txx b/libbutl/process-run.txx index d8d4cb7..9e4ccfc 100644 --- a/libbutl/process-run.txx +++ b/libbutl/process-run.txx @@ -20,27 +20,101 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. } } - inline int process_stdin (int v) {assert (v >= 0); return v;} - inline int process_stdout (int v) {assert (v >= 0); return v;} - inline int process_stderr (int v) {assert (v >= 0); return v;} + inline process::pipe + process_stdin (int v) + { + assert (v >= 0); + return process::pipe (v, -1); + } + + inline process::pipe + process_stdout (int v) + { + assert (v >= 0); + return process::pipe (-1, v); + } + + inline process::pipe + process_stderr (int v) + { + assert (v >= 0); + return process::pipe (-1, v); + } + + inline process::pipe + process_stdin (const auto_fd& v) + { + assert (v.get () >= 0); + return process::pipe (v.get (), -1); + } + + inline process::pipe + process_stdout (const auto_fd& v) + { + assert (v.get () >= 0); + return process::pipe (-1, v.get ()); + } + + inline process::pipe + process_stderr (const auto_fd& v) + { + assert (v.get () >= 0); + return process::pipe (-1, v.get ()); + } + + inline process::pipe + process_stdin (const fdpipe& v) + { + assert (v.in.get () >= 0 && v.out.get () >= 0); + return process::pipe (v); + } + + inline process::pipe + process_stdout (const fdpipe& v) + { + assert (v.in.get () >= 0 && v.out.get () >= 0); + return process::pipe (v); + } + + inline process::pipe + process_stderr (const fdpipe& v) + { + assert (v.in.get () >= 0 && v.out.get () >= 0); + return process::pipe (v); + } - inline int - process_stdin (const auto_fd& v) {assert (v.get () >= 0); return v.get ();} + // Not necessarily a real pipe, so only a single end is constrained to be a + // valid file descriptor. + // + inline process::pipe + process_stdin (const process::pipe& v) + { + assert (v.in >= 0); + return v; + } - inline int - process_stdout (const auto_fd& v) {assert (v.get () >= 0); return v.get ();} + inline process::pipe + process_stdout (const process::pipe& v) + { + assert (v.out >= 0); + return v; + } - inline int - process_stderr (const auto_fd& v) {assert (v.get () >= 0); return v.get ();} + inline process::pipe + process_stderr (const process::pipe& v) + { + assert (v.out >= 0); + return v; + } LIBBUTL_SYMEXPORT process process_start (const dir_path* cwd, const process_path& pp, const char* cmd[], const char* const* envvars, - int in, - int out, - int err); + process::pipe in, + process::pipe out, + process::pipe err); template inline const char* @@ -68,9 +142,9 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. // Map stdin/stdout/stderr arguments to their integer values, as expected // by the process constructor. // - int in_i (process_stdin (std::forward (in))); - int out_i (process_stdout (std::forward (out))); - int err_i (process_stderr (std::forward (err))); + process::pipe in_i (process_stdin (std::forward (in))); + process::pipe out_i (process_stdout (std::forward (out))); + process::pipe err_i (process_stderr (std::forward (err))); // Construct the command line array. // -- cgit v1.1