diff options
author | Todd Broch <tbroch@chromium.org> | 2014-05-08 16:42:46 -0700 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-05-09 22:04:12 +0000 |
commit | 479aa8b1bc46190fbef4fbcd2da514fe6a935004 (patch) | |
tree | 44619c0672fc39bab2d58cd5bd6037983eddd48c | |
parent | b5f3455a98ac2efad01228c01d25b05e9bddf52a (diff) | |
download | chrome-ec-release-R36-5841.B.tar.gz |
ec_uartd: bugfix for buffer pointer on partial write to FD.stabilize-swanky-5841.55.Bstabilize-gnawty-5841.84.Bstabilize-5841.83.Bstabilize-5841.76.Brelease-R36-5841.B
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 <tbroch@chromium.org>
BRANCH=none
BUG=chromium:371147
TEST=still compiles
Change-Id: I30dbe56b2a4c735c487464349786a9db430130a8
Reviewed-on: https://chromium-review.googlesource.com/199052
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Commit-Queue: Todd Broch <tbroch@chromium.org>
Tested-by: Todd Broch <tbroch@chromium.org>
-rw-r--r-- | util/ec_uartd.c | 14 |
1 files changed, 13 insertions, 1 deletions
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 <errno.h> #include <fcntl.h> #pragma GCC diagnostic ignored "-Wstrict-prototypes" #include <ftdi.h> @@ -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"); |