aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Yano <takashi.yano@nifty.ne.jp>2018-07-03 18:04:31 +0900
committerCorinna Vinschen <corinna@vinschen.de>2018-07-04 14:17:28 +0200
commitd4f4e7ae1be1bcf8c021f2b0865aafc16b338aa3 (patch)
tree9b1a336ed5bc812abf9f1d882d4d8f75317c1fc7
parent1c1cec9cdff8e71deabb896081215b58ca8b16b6 (diff)
downloadnewlib-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.c30
-rw-r--r--newlib/libc/stdio/perror.c32
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