summaryrefslogtreecommitdiffstats
path: root/client.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2012-06-18 13:34:56 +0000
committerNicholas Marriott <nicm@openbsd.org>2012-06-18 13:34:56 +0000
commit0f00c3b47a700834f8cfab2537a37292cd8e5796 (patch)
treea0ff0595d3ce3ea22ebbf38718c723b5c8741688 /client.c
parent2942eca8953561cef0764c1775666697ee032c34 (diff)
Actually write all the data to stdout/stderr.
Diffstat (limited to 'client.c')
-rw-r--r--client.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/client.c b/client.c
index 911a639f..16498577 100644
--- a/client.c
+++ b/client.c
@@ -58,6 +58,7 @@ void client_write_server(enum msgtype, void *, size_t);
void client_update_event(void);
void client_signal(int, short, void *);
void client_stdin_callback(int, short, void *);
+void client_write(int, const char *, size_t);
void client_callback(int, short, void *);
int client_dispatch_attached(void);
int client_dispatch_wait(void *);
@@ -458,6 +459,24 @@ client_stdin_callback(unused int fd, unused short events, unused void *data1)
client_update_event();
}
+/* Force write to file descriptor. */
+void
+client_write(int fd, const char *data, size_t size)
+{
+ ssize_t used;
+
+ while (size != 0) {
+ used = write(fd, data, size);
+ if (used == -1) {
+ if (errno == EINTR || errno == EAGAIN)
+ continue;
+ break;
+ }
+ data += used;
+ size -= used;
+ }
+}
+
/* Dispatch imsgs when in wait state (before MSG_READY). */
int
client_dispatch_wait(void *data)
@@ -502,14 +521,14 @@ client_dispatch_wait(void *data)
fatalx("bad MSG_STDOUT");
memcpy(&stdoutdata, imsg.data, sizeof stdoutdata);
- fwrite(stdoutdata.data, stdoutdata.size, 1, stdout);
+ client_write(STDOUT_FILENO, stdoutdata.data, stdoutdata.size);
break;
case MSG_STDERR:
if (datalen != sizeof stderrdata)
fatalx("bad MSG_STDERR");
memcpy(&stderrdata, imsg.data, sizeof stderrdata);
- fwrite(stderrdata.data, stderrdata.size, 1, stderr);
+ client_write(STDERR_FILENO, stderrdata.data, stderrdata.size);
break;
case MSG_VERSION:
if (datalen != 0)