Deleted Added
full compact
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}