2 * Copyright (C) 2002 Manuel Novoa III
3 * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
5 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
8 /* Make sure we get proper strerror_r() prototype */
9 #define strerror_r _hidestrerror_r
14 #include "_syserrmsg.h"
19 #ifdef __UCLIBC_HAS_ERRNO_MESSAGES__
21 extern const char _string_syserrmsgs[] attribute_hidden;
23 #if defined(__alpha__) || defined(__mips__) || defined(__sparc__)
25 static const unsigned char estridx[] = {
26 0, /* success is always 0 */
148 #if EDQUOT > 200 /* mips has an outrageous value for this... */
155 #if EDEADLOCK != EDEADLK
162 int __xpg_strerror_r(int errnum, char *strerrbuf, size_t buflen)
166 char buf[_STRERROR_BUFSIZE];
167 static const char unknown[] = {
168 'U', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 'e', 'r', 'r', 'o', 'r', ' '
174 #ifdef __UCLIBC_HAS_ERRNO_MESSAGES__
176 #if defined(__alpha__) || defined(__mips__) || defined(__sparc__)
177 /* Need to translate errno to string index. */
178 for (i = 0 ; i < sizeof(estridx)/sizeof(estridx[0]) ; i++) {
179 if (estridx[i] == errnum) {
183 i = INT_MAX; /* Failed, but may need to check mips special case. */
184 #if EDQUOT > 200 /* Deal with large EDQUOT value on mips */
185 if (errnum == EDQUOT)
190 /* No errno to string index translation needed. */
194 if (((unsigned int) i) < _SYS_NERR) {
195 /* Trade time for space. This function should rarely be called
196 * so rather than keeping an array of pointers for the different
197 * messages, just run through the buffer until we find the
199 for (s = (char *) _string_syserrmsgs ; i ; ++s) {
204 if (*s) { /* Make sure we have an actual message. */
210 #endif /* __UCLIBC_HAS_ERRNO_MESSAGES__ */
212 s = _int10tostr(buf+sizeof(buf)-1, errnum) - sizeof(unknown);
213 memcpy(s, unknown, sizeof(unknown));
216 if (!strerrbuf) { /* SUSv3 */
226 memcpy(strerrbuf, s, i);
227 strerrbuf[i-1] = 0; /* In case buf was too small. */
237 #else /* __UCLIBC_HAS_ERRNO_MESSAGES__ */
239 int __xpg_strerror_r(int errnum, char *strerrbuf, size_t buflen)
243 char buf[_STRERROR_BUFSIZE];
244 static const char unknown[] = {
245 'U', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 'e', 'r', 'r', 'o', 'r', ' '
248 s = _int10tostr(buf+sizeof(buf)-1, errnum) - sizeof(unknown);
249 memcpy(s, unknown, sizeof(unknown));
251 if (!strerrbuf) { /* SUSv3 */
257 i = buf + sizeof(buf) - s;
265 memcpy(strerrbuf, s, i);
266 strerrbuf[i-1] = 0; /* In case buf was too small. */
274 #endif /* __UCLIBC_HAS_ERRNO_MESSAGES__ */
275 libc_hidden_def(__xpg_strerror_r)
276 weak_alias(__xpg_strerror_r, strerror_r)