strerror.c (114443) | strerror.c (142667) |
---|---|
1/*- 2 * Copyright (c) 1988, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 21 unchanged lines hidden (view full) --- 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#if defined(LIBC_SCCS) && !defined(lint) 35static char sccsid[] = "@(#)strerror.c 8.1 (Berkeley) 6/4/93"; 36#endif /* LIBC_SCCS and not lint */ 37#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1988, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 21 unchanged lines hidden (view full) --- 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#if defined(LIBC_SCCS) && !defined(lint) 35static char sccsid[] = "@(#)strerror.c 8.1 (Berkeley) 6/4/93"; 36#endif /* LIBC_SCCS and not lint */ 37#include <sys/cdefs.h> |
38__FBSDID("$FreeBSD: head/lib/libc/string/strerror.c 114443 2003-05-01 19:03:14Z nectar $"); | 38__FBSDID("$FreeBSD: head/lib/libc/string/strerror.c 142667 2005-02-27 16:58:28Z phantom $"); |
39 | 39 |
40#if defined(NLS) 41#include <limits.h> 42#include <nl_types.h> 43#endif 44 |
|
40#include <errno.h> | 45#include <errno.h> |
41#include <stdio.h> | |
42#include <string.h> | 46#include <string.h> |
47#include <stdio.h> |
|
43 | 48 |
44#define UPREFIX "Unknown error: " | 49#define UPREFIX "Unknown error" |
45 46/* 47 * Define a buffer size big enough to describe a 64-bit signed integer 48 * converted to ASCII decimal (19 bytes), with an optional leading sign | 50 51/* 52 * Define a buffer size big enough to describe a 64-bit signed integer 53 * converted to ASCII decimal (19 bytes), with an optional leading sign |
49 * (1 byte); finally, we get the prefix and a trailing NUL from UPREFIX. | 54 * (1 byte); finally, we get the prefix, delimiter (": ") and a trailing 55 * NUL from UPREFIX. |
50 */ | 56 */ |
51#define EBUFSIZE (20 + sizeof(UPREFIX)) | 57#define EBUFSIZE (20 + 2 + sizeof(UPREFIX)) |
52 53/* 54 * Doing this by hand instead of linking with stdio(3) avoids bloat for 55 * statically linked binaries. 56 */ 57static void | 58 59/* 60 * Doing this by hand instead of linking with stdio(3) avoids bloat for 61 * statically linked binaries. 62 */ 63static void |
58errstr(int num, char *buf, size_t len) | 64errstr(int num, char *uprefix, char *buf, size_t len) |
59{ 60 char *t; 61 unsigned int uerr; 62 char tmp[EBUFSIZE]; 63 64 t = tmp + sizeof(tmp); 65 *--t = '\0'; 66 uerr = (num >= 0) ? num : -num; 67 do { 68 *--t = "0123456789"[uerr % 10]; 69 } while (uerr /= 10); 70 if (num < 0) 71 *--t = '-'; | 65{ 66 char *t; 67 unsigned int uerr; 68 char tmp[EBUFSIZE]; 69 70 t = tmp + sizeof(tmp); 71 *--t = '\0'; 72 uerr = (num >= 0) ? num : -num; 73 do { 74 *--t = "0123456789"[uerr % 10]; 75 } while (uerr /= 10); 76 if (num < 0) 77 *--t = '-'; |
72 strlcpy(buf, UPREFIX, len); | 78 *--t = ' '; 79 *--t = ':'; 80 strlcpy(buf, uprefix, len); |
73 strlcat(buf, t, len); 74} 75 76int 77strerror_r(int errnum, char *strerrbuf, size_t buflen) 78{ | 81 strlcat(buf, t, len); 82} 83 84int 85strerror_r(int errnum, char *strerrbuf, size_t buflen) 86{ |
87 int retval = 0; 88#if defined(NLS) 89 int saved_errno = errno; 90 nl_catd catd; 91 catd = catopen("libc", NL_CAT_LOCALE); 92#endif |
|
79 80 if (errnum < 1 || errnum >= sys_nerr) { | 93 94 if (errnum < 1 || errnum >= sys_nerr) { |
81 errstr(errnum, strerrbuf, buflen); 82 return (EINVAL); | 95 errstr(errnum, 96#if defined(NLS) 97 catgets(catd, 1, 0xffff, UPREFIX), 98#else 99 UPREFIX, 100#endif 101 strerrbuf, buflen); 102 retval = EINVAL; 103 } else { 104 if (strlcpy(strerrbuf, 105#if defined(NLS) 106 catgets(catd, 1, errnum, sys_errlist[errnum]), 107#else 108 sys_errlist[errnum], 109#endif 110 buflen) >= buflen) 111 retval = ERANGE; |
83 } | 112 } |
84 if (strlcpy(strerrbuf, sys_errlist[errnum], buflen) >= buflen) 85 return (ERANGE); 86 return (0); | 113 114#if defined(NLS) 115 catclose(catd); 116 errno = saved_errno; 117#endif 118 119 return (retval); |
87} 88 89char * 90strerror(int num) 91{ | 120} 121 122char * 123strerror(int num) 124{ |
92 static char ebuf[EBUFSIZE]; | 125 static char ebuf[NL_TEXTMAX]; |
93 | 126 |
94 if (num > 0 && num < sys_nerr) 95 return ((char *)sys_errlist[num]); | 127 if (strerror_r(num, ebuf, sizeof(ebuf)) != 0) |
96 errno = EINVAL; | 128 errno = EINVAL; |
97 errstr(num, ebuf, sizeof(ebuf)); | |
98 return (ebuf); 99} | 129 return (ebuf); 130} |