Sync OpenBSD patchset 1139:

Actually write all the data to stdout/stderr.
This commit is contained in:
Tiago Cunha 2012-06-18 15:25:23 +00:00
parent dfc845e7f9
commit bc47596313

View File

@ -58,6 +58,7 @@ void client_write_server(enum msgtype, void *, size_t);
void client_update_event(void); void client_update_event(void);
void client_signal(int, short, void *); void client_signal(int, short, void *);
void client_stdin_callback(int, short, void *); void client_stdin_callback(int, short, void *);
void client_write(int, const char *, size_t);
void client_callback(int, short, void *); void client_callback(int, short, void *);
int client_dispatch_attached(void); int client_dispatch_attached(void);
int client_dispatch_wait(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(); 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). */ /* Dispatch imsgs when in wait state (before MSG_READY). */
int int
client_dispatch_wait(void *data) client_dispatch_wait(void *data)
@ -504,14 +523,14 @@ client_dispatch_wait(void *data)
fatalx("bad MSG_STDOUT"); fatalx("bad MSG_STDOUT");
memcpy(&stdoutdata, imsg.data, sizeof stdoutdata); memcpy(&stdoutdata, imsg.data, sizeof stdoutdata);
fwrite(stdoutdata.data, stdoutdata.size, 1, stdout); client_write(STDOUT_FILENO, stdoutdata.data, stdoutdata.size);
break; break;
case MSG_STDERR: case MSG_STDERR:
if (datalen != sizeof stderrdata) if (datalen != sizeof stderrdata)
fatalx("bad MSG_STDERR"); fatalx("bad MSG_STDERR");
memcpy(&stderrdata, imsg.data, sizeof stderrdata); memcpy(&stderrdata, imsg.data, sizeof stderrdata);
fwrite(stderrdata.data, stderrdata.size, 1, stderr); client_write(STDERR_FILENO, stderrdata.data, stderrdata.size);
break; break;
case MSG_VERSION: case MSG_VERSION:
if (datalen != 0) if (datalen != 0)