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