2011-06-01 Eric Blake <eblake@redhat.com>
+ perror: call strerror_r directly
+ * modules/perror (Files): Drop strerror-impl.h.
+ * lib/perror.c (perror): Use our own stack buffer, rather than
+ calling a wrapper that uses static storage.
+ * doc/posix-functions/perror.texi (perror): Document a limitation
+ of our replacement.
+
strerror_r: fix includes for FreeBSD
* lib/strerror_r.c (includes): Use <stdlib.h> unconditionally,
since we use abort on some platforms.
POSIX requires that this function set the stream error bit (detected
by @code{ferror}) on write failure, but not all platforms do this:
glibc 2.13.
+@item
+POSIX requires that this function not alter stream orientation, but
+the gnulib replacement locks in byte orientation and fails on wide
+character streams.
@end itemize
void
perror (const char *string)
{
- const char *errno_description = my_strerror (errno);
+ char stackbuf[256];
+ int ret;
+
+ /* Our implementation guarantees that this will be a non-empty
+ string, even if it returns EINVAL; and stackbuf should be sized
+ large enough to avoid ERANGE. */
+ ret = strerror_r (errno, stackbuf, sizeof stackbuf);
+ if (ret == ERANGE)
+ abort ();
if (string != NULL && *string != '\0')
- fprintf (stderr, "%s: %s\n", string, errno_description);
+ fprintf (stderr, "%s: %s\n", string, stackbuf);
else
- fprintf (stderr, "%s\n", errno_description);
+ fprintf (stderr, "%s\n", stackbuf);
}