Skip to content

Commit 70ef259

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

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>
@@ -742,17 +743,34 @@ os_writev(os_file_handle handle, const struct __wasi_ciovec_t *iov, int iovcnt,
742743
if (handle->raw_fd >= 0) {
743744
/* Use the real OS file descriptor */
744745
for (int i = 0; i < iovcnt; i++) {
745-
ssize_t bytes_written =
746-
write(handle->raw_fd, iov[i].buf, iov[i].buf_len);
746+
ssize_t bytes_written = 0;
747+
if (handle->raw_fd == STDOUT_FILENO
748+
|| handle->raw_fd == STDERR_FILENO) {
749+
/* Zephyr still does not support write to stdout with
750+
* picolibc. fprintf works. so we use it here. */
751+
fprintf(stdout, "%*s", (int)iov[i].buf_len,
752+
(char *)iov[i].buf);
753+
754+
/* fprintf will also sometimes return more bytes than we
755+
* request, so we just bypass here */
756+
bytes_written = iov[i].buf_len;
757+
}
758+
else {
759+
bytes_written =
760+
write(handle->raw_fd, iov[i].buf, iov[i].buf_len);
761+
}
762+
747763
if (bytes_written < 0)
748764
return convert_errno(errno);
765+
749766
total_written += bytes_written;
750767
}
751768
}
752769
else {
753770
/* No real fd: fall back to fwrite on stdout/stderr */
754771
FILE *f = (handle->fd == STDERR_FILENO) ? stderr : stdout;
755772
for (int i = 0; i < iovcnt; i++) {
773+
printf("2222\n");
756774
ssize_t bytes_written =
757775
fwrite(iov[i].buf, 1, iov[i].buf_len, f);
758776
if (bytes_written < 0)

0 commit comments

Comments
 (0)