summaryrefslogtreecommitdiff
path: root/src/lib/libc/string/strerror_r.c
diff options
context:
space:
mode:
authorotto <>2005-05-26 12:56:01 +0000
committerotto <>2005-05-26 12:56:01 +0000
commitce5070801d547add0fa94980900e08880052ce3f (patch)
tree99309aafcf8396b5a58d7c64f7e2a59237b7d057 /src/lib/libc/string/strerror_r.c
parent14e016757417d2457255bba31893dc273c0f3fb3 (diff)
downloadopenbsd-ce5070801d547add0fa94980900e08880052ce3f.tar.gz
openbsd-ce5070801d547add0fa94980900e08880052ce3f.tar.bz2
openbsd-ce5070801d547add0fa94980900e08880052ce3f.zip
Merge common functionality of __strsignal and strerror_r.
ok jaredy@ miod@
Diffstat (limited to 'src/lib/libc/string/strerror_r.c')
-rw-r--r--src/lib/libc/string/strerror_r.c76
1 files changed, 48 insertions, 28 deletions
diff --git a/src/lib/libc/string/strerror_r.c b/src/lib/libc/string/strerror_r.c
index 28bfd00a47..958a88df3e 100644
--- a/src/lib/libc/string/strerror_r.c
+++ b/src/lib/libc/string/strerror_r.c
@@ -1,8 +1,8 @@
1/* $OpenBSD: strerror_r.c,v 1.4 2005/05/08 06:25:44 otto Exp $ */ 1/* $OpenBSD: strerror_r.c,v 1.5 2005/05/26 12:56:01 otto Exp $ */
2/* Public Domain <marc@snafu.org> */ 2/* Public Domain <marc@snafu.org> */
3 3
4#if defined(LIBC_SCCS) && !defined(lint) 4#if defined(LIBC_SCCS) && !defined(lint)
5static char *rcsid = "$OpenBSD: strerror_r.c,v 1.4 2005/05/08 06:25:44 otto Exp $"; 5static char *rcsid = "$OpenBSD: strerror_r.c,v 1.5 2005/05/26 12:56:01 otto Exp $";
6#endif /* LIBC_SCCS and not lint */ 6#endif /* LIBC_SCCS and not lint */
7 7
8#ifdef NLS 8#ifdef NLS
@@ -14,9 +14,11 @@ static char *rcsid = "$OpenBSD: strerror_r.c,v 1.4 2005/05/08 06:25:44 otto Exp
14 14
15#define sys_errlist _sys_errlist 15#define sys_errlist _sys_errlist
16#define sys_nerr _sys_nerr 16#define sys_nerr _sys_nerr
17#define sys_siglist _sys_siglist
17 18
18#include <errno.h> 19#include <errno.h>
19#include <limits.h> 20#include <limits.h>
21#include <signal.h>
20#include <string.h> 22#include <string.h>
21 23
22static size_t 24static size_t
@@ -33,13 +35,13 @@ __digits10(unsigned int num)
33} 35}
34 36
35static int 37static int
36__itoa(int num, char *buffer, size_t start, size_t end) 38__itoa(int num, int sign, char *buffer, size_t start, size_t end)
37{ 39{
38 size_t pos; 40 size_t pos;
39 unsigned int a; 41 unsigned int a;
40 int neg; 42 int neg;
41 43
42 if (num < 0) { 44 if (sign && num < 0) {
43 a = -num; 45 a = -num;
44 neg = 1; 46 neg = 1;
45 } 47 }
@@ -68,47 +70,39 @@ __itoa(int num, char *buffer, size_t start, size_t end)
68} 70}
69 71
70 72
71#define UPREFIX "Unknown error: " 73static int
72 74__num2string(int num, int sign, int setid, char *buf, size_t buflen,
73int 75 char * list[], size_t max, const char *def)
74strerror_r(int errnum, char *strerrbuf, size_t buflen)
75{ 76{
76 int save_errno; 77 int ret = 0;
77 int ret_errno;
78 size_t len; 78 size_t len;
79#ifdef NLS
80 nl_catd catd;
81#endif
82
83 save_errno = errno;
84 ret_errno = 0;
85 79
86#ifdef NLS 80#ifdef NLS
81 nl_catd catd;
87 catd = catopen("libc", 0); 82 catd = catopen("libc", 0);
88#endif 83#endif
89 84
90 if (errnum >= 0 && errnum < sys_nerr) { 85 if (0 <= num && num < max) {
91#ifdef NLS 86#ifdef NLS
92 len = strlcpy(strerrbuf, catgets(catd, 1, errnum, 87 len = strlcpy(buf, catgets(catd, setid, num, list[num]),
93 (char *)sys_errlist[errnum]), buflen); 88 buflen);
94#else 89#else
95 len = strlcpy(strerrbuf, sys_errlist[errnum], buflen); 90 len = strlcpy(buf, def, buflen);
96#endif 91#endif
97 if (len >= buflen) 92 if (len >= buflen)
98 ret_errno = ERANGE; 93 ret = ERANGE;
99 } else { 94 } else {
100#ifdef NLS 95#ifdef NLS
101 len = strlcpy(strerrbuf, catgets(catd, 1, 0xffff, UPREFIX), 96 len = strlcpy(buf, catgets(catd, setid, 0xffff, def), buflen);
102 buflen);
103#else 97#else
104 len = strlcpy(strerrbuf, UPREFIX, buflen); 98 len = strlcpy(buf, def, buflen);
105#endif 99#endif
106 if (len >= buflen) 100 if (len >= buflen)
107 ret_errno = ERANGE; 101 ret = ERANGE;
108 else { 102 else {
109 ret_errno = __itoa(errnum, strerrbuf, len, buflen); 103 ret = __itoa(num, sign, buf, len, buflen);
110 if (ret_errno == 0) 104 if (ret == 0)
111 ret_errno = EINVAL; 105 ret = EINVAL;
112 } 106 }
113 } 107 }
114 108
@@ -116,6 +110,32 @@ strerror_r(int errnum, char *strerrbuf, size_t buflen)
116 catclose(catd); 110 catclose(catd);
117#endif 111#endif
118 112
113 return ret;
114}
115
116#define UPREFIX "Unknown error: "
117
118int
119strerror_r(int errnum, char *strerrbuf, size_t buflen)
120{
121 int save_errno;
122 int ret_errno;
123
124 save_errno = errno;
125
126 ret_errno = __num2string(errnum, 1, 1, strerrbuf, buflen,
127 sys_errlist, sys_nerr, UPREFIX);
128
119 errno = ret_errno ? ret_errno : save_errno; 129 errno = ret_errno ? ret_errno : save_errno;
120 return (ret_errno); 130 return (ret_errno);
121} 131}
132
133#define USIGPREFIX "Unknown signal: "
134
135char *
136__strsignal(int num, char *buf)
137{
138 __num2string(num, 0, 2, buf, NL_TEXTMAX, (char **)sys_siglist, NSIG,
139 USIGPREFIX);
140 return buf;
141}