From 479aa8b1bc46190fbef4fbcd2da514fe6a935004 Mon Sep 17 00:00:00 2001 From: Todd Broch Date: Thu, 8 May 2014 16:42:46 -0700 Subject: ec_uartd: bugfix for buffer pointer on partial write to FD. Previously I neglected to increment the buffer pointer which would allow double writing of same data and exclude tail if write didn't complete in one call. Also fixing bug with EAGAIN/EWOULDBLOCK to retry in those cases. Previously we'd just have just failed for those errno values. Signed-off-by: Todd Broch BRANCH=none BUG=chromium:371147 TEST=still compiles Change-Id: I30dbe56b2a4c735c487464349786a9db430130a8 Reviewed-on: https://chromium-review.googlesource.com/199052 Reviewed-by: Vincent Palatin Commit-Queue: Todd Broch Tested-by: Todd Broch --- util/ec_uartd.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/util/ec_uartd.c b/util/ec_uartd.c index fbf4a5e1b0..82823c4b44 100644 --- a/util/ec_uartd.c +++ b/util/ec_uartd.c @@ -18,6 +18,7 @@ #define _GNU_SOURCE #endif +#include #include #pragma GCC diagnostic ignored "-Wstrict-prototypes" #include @@ -128,8 +129,19 @@ int main(int argc, char **argv) bytes = ftdi_read_data(&fcontext, buf, sizeof(buf)); if (bytes > 0) { int bytes_remaining = bytes; - while ((bytes = write(fd, buf, bytes_remaining)) > 0) + char *buf_ptr = buf; + +retry_write: + while (bytes_remaining && + ((bytes = write(fd, buf_ptr, + bytes_remaining)) > 0)) { + buf_ptr += bytes; bytes_remaining -= bytes; + } + + if ((bytes == -1) && + ((errno == EAGAIN) || (errno == EWOULDBLOCK))) + goto retry_write; if (bytes == -1) perror("writing ftdi data to pty"); -- cgit v1.2.1