diff options
author | ridiculousfish <corydoras@ridiculousfish.com> | 2013-01-11 15:09:33 -0800 |
---|---|---|
committer | ridiculousfish <corydoras@ridiculousfish.com> | 2013-01-11 15:09:53 -0800 |
commit | 9d6c4fa6780585d0a9a2a2a6709dbf9c0ac376ff (patch) | |
tree | e080d3b182d8ec3a9bfc5e8ca6a656f380289e71 /postfork.cpp | |
parent | b66233de786ec1b136c84fb2ec0afcce0e107e00 (diff) |
Make do_builtin_io multi-fork safe, moved it to postfork.cpp
Diffstat (limited to 'postfork.cpp')
-rw-r--r-- | postfork.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/postfork.cpp b/postfork.cpp index 5afb72bb..87a06a35 100644 --- a/postfork.cpp +++ b/postfork.cpp @@ -599,3 +599,28 @@ void safe_report_exec_error(int err, const char *actual_cmd, char **argv, char * } } } + +/** Perform output from builtins. May be called from a forked child, so don't do anything that may allocate memory, etc.. */ +bool do_builtin_io(const char *out, size_t outlen, const char *err, size_t errlen) +{ + bool success = true; + if (out && outlen) + { + + if (write_loop(STDOUT_FILENO, out, outlen) < 0) + { + debug(0, L"Error while writing to stdout"); + safe_perror("write_loop"); + success = false; + } + } + + if (err && errlen) + { + if (write_loop(STDERR_FILENO, err, errlen) < 0) + { + success = false; + } + } + return success; +} |