Skip to content

Commit 68b3300

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

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>
@@ -748,17 +749,34 @@ os_writev(os_file_handle handle, const struct __wasi_ciovec_t *iov, int iovcnt,
748749
if (handle->raw_fd >= 0) {
749750
/* Use the real OS file descriptor */
750751
for (int i = 0; i < iovcnt; i++) {
751-
ssize_t bytes_written =
752-
write(handle->raw_fd, iov[i].buf, iov[i].buf_len);
752+
ssize_t bytes_written = 0;
753+
if (handle->raw_fd == STDOUT_FILENO
754+
|| handle->raw_fd == STDERR_FILENO) {
755+
/* Zephyr still does not support write to stdout with
756+
* picolibc. fprintf works. so we use it here. */
757+
fprintf(stdout, "%*s", (int)iov[i].buf_len,
758+
(char *)iov[i].buf);
759+
760+
/* fprintf will also sometimes return more bytes than we
761+
* request, so we just bypass here */
762+
bytes_written = iov[i].buf_len;
763+
}
764+
else {
765+
bytes_written =
766+
write(handle->raw_fd, iov[i].buf, iov[i].buf_len);
767+
}
768+
753769
if (bytes_written < 0)
754770
return convert_errno(errno);
771+
755772
total_written += bytes_written;
756773
}
757774
}
758775
else {
759776
/* No real fd: fall back to fwrite on stdout/stderr */
760777
FILE *f = (handle->fd == STDERR_FILENO) ? stderr : stdout;
761778
for (int i = 0; i < iovcnt; i++) {
779+
printf("2222\n");
762780
ssize_t bytes_written =
763781
fwrite(iov[i].buf, 1, iov[i].buf_len, f);
764782
if (bytes_written < 0)

0 commit comments

Comments
 (0)