summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Broch <tbroch@chromium.org>2014-05-08 16:42:46 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-05-09 22:04:12 +0000
commit479aa8b1bc46190fbef4fbcd2da514fe6a935004 (patch)
tree44619c0672fc39bab2d58cd5bd6037983eddd48c
parentb5f3455a98ac2efad01228c01d25b05e9bddf52a (diff)
downloadchrome-ec-stabilize-5841.76.B.tar.gz
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.c14
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");