Skip to content

Commit c374a50

Browse files
committed
workaround for zephyr stdio with picolibc
Signed-off-by: Marco Casaroli <marco.casaroli@gmail.com>
1 parent 70b45b2 commit c374a50

1 file changed

Lines changed: 20 additions & 2 deletions

File tree

core/shared/platform/zephyr/zephyr_file.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "platform_api_extension.h"
88
#include "libc_errno.h"
99

10+
#include <stdio.h>
1011
#include <string.h>
1112
#include <stdlib.h>
1213
#include <unistd.h>
@@ -720,17 +721,34 @@ os_writev(os_file_handle handle, const struct __wasi_ciovec_t *iov, int iovcnt,
720721
if (handle->raw_fd >= 0) {
721722
/* Use the real OS file descriptor */
722723
for (int i = 0; i < iovcnt; i++) {
723-
ssize_t bytes_written =
724-
write(handle->raw_fd, iov[i].buf, iov[i].buf_len);
724+
ssize_t bytes_written = 0;
725+
if (handle->raw_fd == STDOUT_FILENO
726+
|| handle->raw_fd == STDERR_FILENO) {
727+
/* Zephyr still does not support write to stdout with
728+
* picolibc. fprintf works. so we use it here. */
729+
fprintf(stdout, "%*s", (int)iov[i].buf_len,
730+
(char *)iov[i].buf);
731+
732+
/* fprintf will also sometimes return more bytes than we
733+
* request, so we just bypass here */
734+
bytes_written = iov[i].buf_len;
735+
}
736+
else {
737+
bytes_written =
738+
write(handle->raw_fd, iov[i].buf, iov[i].buf_len);
739+
}
740+
725741
if (bytes_written < 0)
726742
return convert_errno(errno);
743+
727744
total_written += bytes_written;
728745
}
729746
}
730747
else {
731748
/* No real fd: fall back to fwrite on stdout/stderr */
732749
FILE *f = (handle->fd == STDERR_FILENO) ? stderr : stdout;
733750
for (int i = 0; i < iovcnt; i++) {
751+
printf("2222\n");
734752
ssize_t bytes_written =
735753
fwrite(iov[i].buf, 1, iov[i].buf_len, f);
736754
if (bytes_written < 0)

0 commit comments

Comments
 (0)