diff options
author | Takashi Yano <takashi.yano@nifty.ne.jp> | 2018-07-05 17:01:26 +0300 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2018-07-05 22:33:49 +0300 |
commit | 6a3e08a53ec996b37639a18dc98123e23531409c (patch) | |
tree | 789b9eeeb1cd56348628e115e3368deae7e8a7a2 /newlib | |
parent | 0ce27ecd08355620e73c89f8cf6b71f597b75f9c (diff) |
Fix newlib functions perror()/psignal() not to use writev().
This fix is for some platforms which do not have writev().
*perror.c: Use _write_r() instead of writev().
*psignal.c: Use write() insetad of writev().
Revise commit: d4f4e7ae1be1bcf8c021f2b0865aafc16b338aa3
Diffstat (limited to 'newlib')
-rw-r--r-- | newlib/libc/signal/psignal.c | 36 | ||||
-rw-r--r-- | newlib/libc/stdio/perror.c | 40 |
2 files changed, 39 insertions, 37 deletions
diff --git a/newlib/libc/signal/psignal.c b/newlib/libc/signal/psignal.c index 9a584869d..f847ab2c8 100644 --- a/newlib/libc/signal/psignal.c +++ b/newlib/libc/signal/psignal.c @@ -32,37 +32,37 @@ Supporting OS subroutines required: <<close>>, <<fstat>>, <<isatty>>, #include <_ansi.h> #include <stdio.h> #include <string.h> -#include <sys/uio.h> +#include <unistd.h> -#define ADD(str) \ +#define WRITE_STR(str) \ { \ - v->iov_base = (void *)(str); \ - v->iov_len = strlen (v->iov_base); \ - v ++; \ - iov_cnt ++; \ + const char *p = (str); \ + size_t len = strlen (p); \ + while (len) \ + { \ + ssize_t len1 = write (fileno (stderr), p, len); \ + if (len1 < 0) \ + break; \ + len -= len1; \ + p += len1; \ + } \ } void psignal (int sig, const char *s) { - struct iovec iov[4]; - struct iovec *v = iov; - int iov_cnt = 0; - + fflush (stderr); if (s != NULL && *s != '\0') { - ADD (s); - ADD (": "); + WRITE_STR (s); + WRITE_STR (": "); } - ADD (strsignal (sig)); + WRITE_STR (strsignal (sig)); #ifdef __SCLE - ADD ((stderr->_flags & __SCLE) ? "\r\n" : "\n"); + WRITE_STR ((stderr->_flags & __SCLE) ? "\r\n" : "\n"); #else - ADD ("\n"); + WRITE_STR ("\n"); #endif - - fflush (stderr); - writev (fileno (stderr), iov, iov_cnt); } diff --git a/newlib/libc/stdio/perror.c b/newlib/libc/stdio/perror.c index 831c67eef..68d78c227 100644 --- a/newlib/libc/stdio/perror.c +++ b/newlib/libc/stdio/perror.c @@ -56,15 +56,20 @@ Supporting OS subroutines required: <<close>>, <<fstat>>, <<isatty>>, #include <reent.h> #include <stdio.h> #include <string.h> -#include <sys/uio.h> #include "local.h" -#define ADD(str) \ +#define WRITE_STR(str) \ { \ - v->iov_base = (void *)(str); \ - v->iov_len = strlen (v->iov_base); \ - v ++; \ - iov_cnt ++; \ + const char *p = (str); \ + size_t len = strlen (p); \ + while (len) \ + { \ + ssize_t len1 = _write_r (ptr, fileno (fp), p, len); \ + if (len1 < 0) \ + break; \ + len -= len1; \ + p += len1; \ + } \ } void @@ -73,31 +78,28 @@ _perror_r (struct _reent *ptr, { char *error; int dummy; - struct iovec iov[4]; - struct iovec *v = iov; - int iov_cnt = 0; FILE *fp = _stderr_r (ptr); CHECK_INIT (ptr, fp); + + _newlib_flockfile_start(fp); + _fflush_r (ptr, fp); if (s != NULL && *s != '\0') { - ADD (s); - ADD (": "); + WRITE_STR (s); + WRITE_STR (": "); } if ((error = _strerror_r (ptr, ptr->_errno, 1, &dummy)) != NULL) - ADD (error); + WRITE_STR (error); #ifdef __SCLE - ADD ((fp->_flags & __SCLE) ? "\r\n" : "\n"); + WRITE_STR ((fp->_flags & __SCLE) ? "\r\n" : "\n"); #else - ADD ("\n"); + WRITE_STR ("\n"); #endif - - _newlib_flockfile_start (fp); - fflush (fp); - writev (fileno (fp), iov, iov_cnt); - _newlib_flockfile_end (fp); + fp->_flags &= ~__SOFF; + _newlib_flockfile_end(fp); } #ifndef _REENT_ONLY |