aboutsummaryrefslogtreecommitdiffhomepage
path: root/postfork.cpp
diff options
context:
space:
mode:
authorGravatar ridiculousfish <corydoras@ridiculousfish.com>2013-01-11 15:09:33 -0800
committerGravatar ridiculousfish <corydoras@ridiculousfish.com>2013-01-11 15:09:53 -0800
commit9d6c4fa6780585d0a9a2a2a6709dbf9c0ac376ff (patch)
treee080d3b182d8ec3a9bfc5e8ca6a656f380289e71 /postfork.cpp
parentb66233de786ec1b136c84fb2ec0afcce0e107e00 (diff)
Make do_builtin_io multi-fork safe, moved it to postfork.cpp
Diffstat (limited to 'postfork.cpp')
-rw-r--r--postfork.cpp25
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;
+}