diff options
author | Tiago Cunha <tcunha@gmx.com> | 2012-06-18 15:25:23 +0000 |
---|---|---|
committer | Tiago Cunha <tcunha@gmx.com> | 2012-06-18 15:25:23 +0000 |
commit | bc475963131130d6edd617b7dec6e955c0964548 (patch) | |
tree | 45d025ae7a5260971dbb86e1820e8b8adcfc272d /client.c | |
parent | dfc845e7f92d7b5bda4e184699dd9eb5492d8b09 (diff) | |
download | rtmux-bc475963131130d6edd617b7dec6e955c0964548.tar.gz rtmux-bc475963131130d6edd617b7dec6e955c0964548.tar.bz2 rtmux-bc475963131130d6edd617b7dec6e955c0964548.zip |
Sync OpenBSD patchset 1139:
Actually write all the data to stdout/stderr.
Diffstat (limited to 'client.c')
-rw-r--r-- | client.c | 23 |
1 files changed, 21 insertions, 2 deletions
@@ -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 *); @@ -460,6 +461,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) @@ -504,14 +523,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) |