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
}