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