1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2010 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Common Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.opensource.org/licenses/cpl1.0.txt *
11 * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
12 * *
13 * Information and Software Systems Research *
14 * AT&T Research *
15 * Florham Park NJ *
16 * *
17 * Glenn Fowler <gsf@research.att.com> *
18 * David Korn <dgk@research.att.com> *
19 * Phong Vo <kpv@research.att.com> *
20 * *
21 ***********************************************************************/
22 #pragma prototyped
23
24 /*
25 * Glenn Fowler
26 * AT&T Research
27 *
28 * return error message string given errno
29 */
30
31 #include "lclib.h"
32
33 #include "FEATURE/errno"
34
35 #undef strerror
36
37 #if !defined(sys_errlist) && !_def_errno_sys_errlist
38 #if _dat_sys_errlist
39 extern char* sys_errlist[];
40 #else
41 #undef _dat_sys_nerr
42 char* sys_errlist[] = { 0 };
43 #endif
44 #endif
45
46 #if !defined(sys_nerr) && !_def_errno_sys_nerr
47 #if _dat_sys_nerr
48 extern int sys_nerr;
49 #else
50 #undef _dat_sys_nerr
51 int sys_nerr = 0;
52 #endif
53 #endif
54
55 #if _lib_strerror
56 extern char* strerror(int);
57 #endif
58
59 #if _PACKAGE_astsa
60
61 #define fmtbuf(n) ((n),tmp)
62
63 static char tmp[32];
64
65 #endif
66
67 char*
_ast_strerror(int err)68 _ast_strerror(int err)
69 {
70 char* msg;
71 int z;
72
73 #if _lib_strerror
74 z = errno;
75 msg = strerror(err);
76 errno = z;
77 #else
78 if (err > 0 && err <= sys_nerr)
79 msg = (char*)sys_errlist[err];
80 else
81 msg = 0;
82 #endif
83 if (msg)
84 {
85 #if !_PACKAGE_astsa
86 if (ERROR_translating())
87 {
88 #if _lib_strerror
89 static int sys;
90
91 if (!sys)
92 {
93 char* s;
94 char* t;
95 char* p;
96
97 #if _lib_strerror
98 /*
99 * stash the pending strerror() msg
100 */
101
102 msg = strcpy(fmtbuf(strlen(msg) + 1), msg);
103 #endif
104
105 /*
106 * make sure that strerror() translates
107 */
108
109 if (!(s = strerror(1)))
110 sys = -1;
111 else
112 {
113 t = fmtbuf(z = strlen(s) + 1);
114 strcpy(t, s);
115 ast.locale.set |= AST_LC_internal;
116 p = setlocale(LC_MESSAGES, NiL);
117 setlocale(LC_MESSAGES, "C");
118 sys = (s = strerror(1)) && strcmp(s, t) ? 1 : -1;
119 setlocale(LC_MESSAGES, p);
120 ast.locale.set &= ~AST_LC_internal;
121 }
122 }
123 if (sys > 0)
124 return msg;
125 #endif
126 return ERROR_translate(NiL, NiL, "errlist", msg);
127 }
128 #endif
129 return msg;
130 }
131 msg = fmtbuf(z = 32);
132 sfsprintf(msg, z, ERROR_translate(NiL, NiL, "errlist", "Error %d"), err);
133 return msg;
134 }
135
136 #if !_lib_strerror
137
138 #if defined(__EXPORT__)
139 #define extern __EXPORT__
140 #endif
141
142 extern char*
strerror(int err)143 strerror(int err)
144 {
145 return _ast_strerror(err);
146 }
147
148 #endif
149