in printf, use ferror macro rather than directly inspecting flags bit
[musl] / src / stdio / perror.c
index e4637c8..d0943f2 100644 (file)
@@ -5,23 +5,26 @@
 
 void perror(const char *msg)
 {
-#if 1
-       if (msg) fprintf(stderr, "%s: %m\n", msg, strerror(errno));
-       else fprintf(stderr, "%m\n");
-#else
        FILE *f = stderr;
        char *errstr = strerror(errno);
 
        FLOCK(f);
+
+       /* Save stderr's orientation and encoding rule, since perror is not
+        * permitted to change them. */
+       void *old_locale = f->locale;
+       int old_mode = f->mode;
        
-       if (msg) {
-               __fwritex(msg, strlen(msg), f);
-               __putc_unlocked(':', f);
-               __putc_unlocked(' ', f);
+       if (msg && *msg) {
+               fwrite(msg, strlen(msg), 1, f);
+               fputc(':', f);
+               fputc(' ', f);
        }
-       __fwritex(errstr, strlen(errstr), f);
-       __putc_unlocked('\n', f);
+       fwrite(errstr, strlen(errstr), 1, f);
+       fputc('\n', f);
+
+       f->mode = old_mode;
+       f->locale = old_locale;
 
        FUNLOCK(f);
-#endif
 }