diff options
author | Takashi Yano <takashi.yano@nifty.ne.jp> | 2018-07-03 18:04:31 +0900 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2018-07-04 14:17:28 +0200 |
commit | d4f4e7ae1be1bcf8c021f2b0865aafc16b338aa3 (patch) | |
tree | 9b1a336ed5bc812abf9f1d882d4d8f75317c1fc7 | |
parent | 1c1cec9cdff8e71deabb896081215b58ca8b16b6 (diff) | |
download | newlib-d4f4e7ae1be1bcf8c021f2b0865aafc16b338aa3.zip newlib-d4f4e7ae1be1bcf8c021f2b0865aafc16b338aa3.tar.gz newlib-d4f4e7ae1be1bcf8c021f2b0865aafc16b338aa3.tar.bz2 |
Fix a bug of perror()/psignal() that changes the orientation of stderr.
* perror.c: Fix the problem that perror() changes the orientation
of stderr to byte-oriented mode if stderr is not oriented yet.
* psignal.c: Ditto.
-rw-r--r-- | newlib/libc/signal/psignal.c | 30 | ||||
-rw-r--r-- | newlib/libc/stdio/perror.c | 32 |
2 files changed, 54 insertions, 8 deletions
diff --git a/newlib/libc/signal/psignal.c b/newlib/libc/signal/psignal.c index 602714f..9a58486 100644 --- a/newlib/libc/signal/psignal.c +++ b/newlib/libc/signal/psignal.c @@ -32,13 +32,37 @@ Supporting OS subroutines required: <<close>>, <<fstat>>, <<isatty>>, #include <_ansi.h> #include <stdio.h> #include <string.h> +#include <sys/uio.h> + +#define ADD(str) \ +{ \ + v->iov_base = (void *)(str); \ + v->iov_len = strlen (v->iov_base); \ + v ++; \ + iov_cnt ++; \ +} void psignal (int sig, const char *s) { + struct iovec iov[4]; + struct iovec *v = iov; + int iov_cnt = 0; + if (s != NULL && *s != '\0') - fprintf (stderr, "%s: %s\n", s, strsignal (sig)); - else - fprintf (stderr, "%s\n", strsignal (sig)); + { + ADD (s); + ADD (": "); + } + ADD (strsignal (sig)); + +#ifdef __SCLE + ADD ((stderr->_flags & __SCLE) ? "\r\n" : "\n"); +#else + ADD ("\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 d98e17e..831c67e 100644 --- a/newlib/libc/stdio/perror.c +++ b/newlib/libc/stdio/perror.c @@ -56,26 +56,48 @@ 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) \ +{ \ + v->iov_base = (void *)(str); \ + v->iov_len = strlen (v->iov_base); \ + v ++; \ + iov_cnt ++; \ +} + void _perror_r (struct _reent *ptr, const char *s) { char *error; int dummy; + struct iovec iov[4]; + struct iovec *v = iov; + int iov_cnt = 0; + FILE *fp = _stderr_r (ptr); - _REENT_SMALL_CHECK_INIT (ptr); + CHECK_INIT (ptr, fp); if (s != NULL && *s != '\0') { - fputs (s, _stderr_r (ptr)); - fputs (": ", _stderr_r (ptr)); + ADD (s); + ADD (": "); } if ((error = _strerror_r (ptr, ptr->_errno, 1, &dummy)) != NULL) - fputs (error, _stderr_r (ptr)); + ADD (error); + +#ifdef __SCLE + ADD ((fp->_flags & __SCLE) ? "\r\n" : "\n"); +#else + ADD ("\n"); +#endif - fputc ('\n', _stderr_r (ptr)); + _newlib_flockfile_start (fp); + fflush (fp); + writev (fileno (fp), iov, iov_cnt); + _newlib_flockfile_end (fp); } #ifndef _REENT_ONLY |