From b94fe0f28d68747a2e9b78101f91b86b37c8f83b Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Mon, 15 Dec 2014 17:26:01 +0100 Subject: erts: Fix big-endian issue with printf_putc On little-endian machines, doing &int will give the smallest byte which is what we want to give to write. But on big-endian it will give the highest byte, which will always be \000 here which results in write never doing any writes. So we have to cast c to an unsigned char before passing it to write. --- erts/lib_src/common/erl_printf.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'erts/lib_src/common/erl_printf.c') diff --git a/erts/lib_src/common/erl_printf.c b/erts/lib_src/common/erl_printf.c index 0a0346ac2d..a38017b62f 100644 --- a/erts/lib_src/common/erl_printf.c +++ b/erts/lib_src/common/erl_printf.c @@ -93,10 +93,12 @@ void (*erts_printf_unblock_fpe)(int) = NULL; static int printf_putc(int c, FILE *stream) { if ((FILE*)stream == stdout || (FILE*)stream == stderr) { - int fd = stream == stdout ? fileno(stdout) : fileno(stdin); + int fd = stream == stdout ? fileno(stdout) : fileno(stderr); + /* cast to a char here, because write expects bytes. */ + unsigned char buf[1] = { c }; int res; do { - res = write(fd,&c,1); + res = write(fd, buf, 1); } while (res == -1 && (errno == EAGAIN || errno == EINTR)); if (res == -1) return EOF; return res; @@ -109,7 +111,7 @@ static size_t printf_fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream) { if ((FILE*)stream == stdout || (FILE*)stream == stderr) { - int fd = stream == stdout ? fileno(stdout) : fileno(stdin); + int fd = stream == stdout ? fileno(stdout) : fileno(stderr); int res; do { res = write(fd, ptr, size*nitems); -- cgit v1.2.3