summaryrefslogtreecommitdiff
path: root/libc/stdio/perror.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/stdio/perror.c')
-rw-r--r--libc/stdio/perror.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/libc/stdio/perror.c b/libc/stdio/perror.c
index d6274c056..04cd688d8 100644
--- a/libc/stdio/perror.c
+++ b/libc/stdio/perror.c
@@ -1,19 +1,26 @@
-#include <unistd.h>
-#include <string.h>
+#include <stdio.h>
#include <errno.h>
-void perror(str)
-__const char *str;
-{
- register char *ptr;
+/*
+ * Manuel Novoa III Feb 2001
+ *
+ * Replaced old version that did write(2,...)'s with a version using
+ * stream functions. If the program is calling perror, it's a safe
+ * bet that printf and friends are used as well. It is also possible
+ * that the calling program could buffer stderr, or reassign it.
+ * Also, the old version did not conform the standards when the
+ * passed char * was either NULL or pointed to an empty string.
+ */
- if (str) {
- write(2, str, strlen(str));
- write(2, ": ", 2);
- } else
- write(2, "perror: ", 8);
+void perror(__const char *str)
+{
+ static const char perror_str[] = ": ";
+ const char *sep;
- ptr = strerror(errno);
- write(2, ptr, strlen(ptr));
- write(2, "\n", 1);
+ sep = perror_str;
+ if (!(str && *str)) { /* Caller did not supply a prefix message */
+ sep += 2; /* or passed an empty string. */
+ str = sep;
+ }
+ fprintf(stderr, "%s%s%s\n", str, sep, strerror(errno));
}