aboutsummaryrefslogtreecommitdiff
path: root/src/common/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/util.c')
-rw-r--r--src/common/util.c56
1 files changed, 34 insertions, 22 deletions
diff --git a/src/common/util.c b/src/common/util.c
index 3d39f594f1..e9b790990c 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -3195,6 +3195,7 @@ tor_spawn_background(const char *const filename, const char **argv)
/* Write the error message. GCC requires that we check the return
value, but there is nothing we can do if it fails */
+ // TODO: Don't use STDOUT, use a pipe set up just for this purpose
nbytes = write(STDOUT_FILENO, error_message, error_message_length);
nbytes = write(STDOUT_FILENO, hex_errno, sizeof(hex_errno));
@@ -3217,6 +3218,8 @@ tor_spawn_background(const char *const filename, const char **argv)
return process_handle;
}
+ // TODO: If the child process forked but failed to exec, waitpid it
+
/* Return read end of the pipes to caller, and close write end */
process_handle.stdout_pipe = stdout_pipe[0];
retval = close(stdout_pipe[1]);
@@ -3281,22 +3284,41 @@ tor_get_exit_code(const process_handle_t process_handle)
#endif // MS_WINDOWS
}
-ssize_t
-tor_read_all_from_process_stdout(const process_handle_t process_handle,
- char *buf, size_t count)
-{
#ifdef MS_WINDOWS
+/* Windows equivalent of read_all */
+static ssize_t
+read_all_handle(HANDLE h, char *buf, size_t count)
+{
+ size_t numread = 0;
BOOL retval;
DWORD bytes_read;
- retval = ReadFile(process_handle.stdout_pipe, buf, count, &bytes_read, NULL);
- if (!retval) {
- log_warn(LD_GENERAL,
- "Failed to read from stdin pipe: %s",
- format_win32_error(GetLastError()));
+
+ if (count > SIZE_T_CEILING || count > SSIZE_T_MAX)
return -1;
- } else {
- return bytes_read;
+
+ while (numread != count) {
+ retval = ReadFile(h, buf+numread, count-numread, &bytes_read, NULL);
+ if (!retval) {
+ log_warn(LD_GENERAL,
+ "Failed to read from stdin pipe: %s",
+ format_win32_error(GetLastError()));
+ return -1;
+ } else if (0 == bytes_read) {
+ /* End of file */
+ return bytes_read;
+ }
+ numread += bytes_read;
}
+ return (ssize_t)numread;
+}
+#endif
+
+ssize_t
+tor_read_all_from_process_stdout(const process_handle_t process_handle,
+ char *buf, size_t count)
+{
+#ifdef MS_WINDOWS
+ return read_all_handle(process_handle.stdout_pipe, buf, count);
#else
return read_all(process_handle.stdout_pipe, buf, count, 0);
#endif
@@ -3307,17 +3329,7 @@ tor_read_all_from_process_stderr(const process_handle_t process_handle,
char *buf, size_t count)
{
#ifdef MS_WINDOWS
- BOOL retval;
- DWORD bytes_read;
- retval = ReadFile(process_handle.stderr_pipe, buf, count, &bytes_read, NULL);
- if (!retval) {
- log_warn(LD_GENERAL,
- "Failed to read from stderr pipe: %s",
- format_win32_error(GetLastError()));
- return -1;
- } else {
- return bytes_read;
- }
+ return read_all_handle(process_handle.stderr_pipe, buf, count);
#else
return read_all(process_handle.stderr_pipe, buf, count, 0);
#endif