trace-cmd recorder: Make sure to write as much as was read in read_data()
It is possible that the write() call in read_data() may not write as much as
what was read. In that case, loop to make sure all the data that was read is
written to the output.
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
diff --git a/trace-recorder.c b/trace-recorder.c
index 16a3cfa..eb6413e 100644
--- a/trace-recorder.c
+++ b/trace-recorder.c
@@ -388,22 +388,31 @@
static long read_data(struct tracecmd_recorder *recorder)
{
char buf[recorder->page_size];
- long ret;
+ long left;
+ long r, w;
- ret = read(recorder->trace_fd, buf, recorder->page_size);
- if (ret < 0) {
+ r = read(recorder->trace_fd, buf, recorder->page_size);
+ if (r < 0) {
if (errno != EAGAIN && errno != EINTR) {
warning("recorder error in read output");
return -1;
}
- ret = 0;
- }
- if (ret > 0) {
- write(recorder->fd, buf, ret);
- update_fd(recorder, ret);
+ return 0;
}
- return ret;
+ left = r;
+ do {
+ w = write(recorder->fd, buf + (r - left), left);
+ if (w > 0) {
+ left -= w;
+ update_fd(recorder, w);
+ }
+ } while (w >= 0 && left);
+
+ if (w < 0)
+ r = w;
+
+ return r;
}
static void set_nonblock(struct tracecmd_recorder *recorder)