summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libc/string/__strerror.c74
1 files changed, 52 insertions, 22 deletions
diff --git a/src/lib/libc/string/__strerror.c b/src/lib/libc/string/__strerror.c
index 15436eaab2..ccb430247e 100644
--- a/src/lib/libc/string/__strerror.c
+++ b/src/lib/libc/string/__strerror.c
@@ -28,7 +28,7 @@
28 */ 28 */
29 29
30#if defined(LIBC_SCCS) && !defined(lint) 30#if defined(LIBC_SCCS) && !defined(lint)
31static char *rcsid = "$OpenBSD: __strerror.c,v 1.10 2003/06/02 20:18:38 millert Exp $"; 31static char *rcsid = "$OpenBSD: __strerror.c,v 1.11 2004/04/30 17:13:02 espie Exp $";
32#endif /* LIBC_SCCS and not lint */ 32#endif /* LIBC_SCCS and not lint */
33 33
34#ifdef NLS 34#ifdef NLS
@@ -46,20 +46,52 @@ static char *rcsid = "$OpenBSD: __strerror.c,v 1.10 2003/06/02 20:18:38 millert
46#include <stdio.h> 46#include <stdio.h>
47#include <string.h> 47#include <string.h>
48 48
49static size_t
50__digits10(unsigned int num)
51{
52 size_t i = 0;
53
54 do {
55 num /= 10;
56 i++;
57 } while (num != 0);
58
59 return i;
60}
61
49static char * 62static char *
50itoa(num) 63__itoa(int num, char *buffer, size_t maxlen)
51 int num;
52{ 64{
53 static char buffer[11];
54 char *p; 65 char *p;
66 size_t len;
67 unsigned int a;
68 int neg;
55 69
56 p = buffer + 4; 70 if (num < 0) {
57 while (num >= 10) { 71 a = -num;
58 *--p = (num % 10) + '0'; 72 neg = 1;
59 num /= 10; 73 }
74 else {
75 a = num;
76 neg = 0;
60 } 77 }
61 *p = (num % 10) + '0'; 78
62 return p; 79 len = __digits10(a);
80 if (neg)
81 len++;
82
83 if (len >= maxlen)
84 return NULL;
85
86 buffer[len--] = '\0';
87 do {
88 buffer[len--] = (a % 10) + '0';
89 a /= 10;
90 } while (a != 0);
91 if (neg)
92 *buffer = '-';
93
94 return buffer;
63} 95}
64 96
65/* 97/*
@@ -69,12 +101,10 @@ itoa(num)
69 */ 101 */
70 102
71char * 103char *
72__strerror(num, buf) 104__strerror(int num, char *buf)
73 int num;
74 char *buf;
75{ 105{
76#define UPREFIX "Unknown error: " 106#define UPREFIX "Unknown error: "
77 register unsigned int errnum; 107 int len;
78#ifdef NLS 108#ifdef NLS
79 int save_errno; 109 int save_errno;
80 nl_catd catd; 110 nl_catd catd;
@@ -82,21 +112,21 @@ __strerror(num, buf)
82 catd = catopen("libc", 0); 112 catd = catopen("libc", 0);
83#endif 113#endif
84 114
85 errnum = num; /* convert to unsigned */ 115 if (num >= 0 && num < sys_nerr) {
86 if (errnum < sys_nerr) {
87#ifdef NLS 116#ifdef NLS
88 strlcpy(buf, catgets(catd, 1, errnum, 117 strlcpy(buf, catgets(catd, 1, num,
89 (char *)sys_errlist[errnum]), NL_TEXTMAX); 118 (char *)sys_errlist[num]), NL_TEXTMAX);
90#else 119#else
91 return(sys_errlist[errnum]); 120 return(sys_errlist[num]);
92#endif 121#endif
93 } else { 122 } else {
94#ifdef NLS 123#ifdef NLS
95 strlcpy(buf, catgets(catd, 1, 0xffff, UPREFIX), NL_TEXTMAX); 124 len = strlcpy(buf, catgets(catd, 1, 0xffff, UPREFIX), NL_TEXTMAX);
96#else 125#else
97 strlcpy(buf, UPREFIX, NL_TEXTMAX); 126 len = strlcpy(buf, UPREFIX, NL_TEXTMAX);
98#endif 127#endif
99 strlcat(buf, itoa(errnum), NL_TEXTMAX); 128 if (len < NL_TEXTMAX)
129 __itoa(num, buf + len, NL_TEXTMAX - len);
100 errno = EINVAL; 130 errno = EINVAL;
101 } 131 }
102 132