From aae3e84829a58db9ac464d2794bc4ded8e58309a Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Thu, 6 Oct 2016 09:51:51 +1100 Subject: [PATCH] syscall write: Should return number of bytes written Fixes bug where sometimes output truncates after a newline, or large chunks of large output buffers are lost. --- components/esp32/syscalls.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/components/esp32/syscalls.c b/components/esp32/syscalls.c index 350f5f410..537efed1d 100644 --- a/components/esp32/syscalls.c +++ b/components/esp32/syscalls.c @@ -143,7 +143,7 @@ int _open_r(struct _reent *r, const char * path, int flags, int mode) { } ssize_t _write_r(struct _reent *r, int fd, const void * data, size_t size) { - const char* p = (const char*) data; + const char *data_c = (const char *)data; if (fd == STDOUT_FILENO) { static _lock_t stdout_lock; /* lazily initialised */ /* Even though newlib does stream locking on stdout, we need @@ -160,14 +160,13 @@ ssize_t _write_r(struct _reent *r, int fd, const void * data, size_t size) { which aren't fully valid.) */ _lock_acquire_recursive(&stdout_lock); - while(size--) { + for (size_t i = 0; i < size; i++) { #if CONFIG_NEWLIB_STDOUT_ADDCR - if (*p=='\n') { + if (data_c[i]=='\n') { uart_tx_one_char('\r'); } #endif - uart_tx_one_char(*p); - ++p; + uart_tx_one_char(data_c[i]); } _lock_release_recursive(&stdout_lock); }