1N/A/***********************************************************************
1N/A* *
1N/A* This software is part of the ast package *
1N/A* Copyright (c) 1985-2011 AT&T Intellectual Property *
1N/A* and is licensed under the *
1N/A* Common Public License, Version 1.0 *
1N/A* by AT&T Intellectual Property *
1N/A* *
1N/A* A copy of the License is available at *
1N/A* http://www.opensource.org/licenses/cpl1.0.txt *
1N/A* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
1N/A* *
1N/A* Information and Software Systems Research *
1N/A* AT&T Research *
1N/A* Florham Park NJ *
1N/A* *
1N/A* Glenn Fowler <gsf@research.att.com> *
1N/A* David Korn <dgk@research.att.com> *
1N/A* Phong Vo <kpv@research.att.com> *
1N/A* *
1N/A***********************************************************************/
1N/A#pragma prototyped
1N/A
1N/A/*
1N/A * Glenn Fowler
1N/A * AT&T Research
1N/A *
1N/A * return error message string given errno
1N/A */
1N/A
1N/A#include "lclib.h"
1N/A
1N/A#include "FEATURE/errno"
1N/A
1N/A#undef strerror
1N/A
1N/A#if !defined(sys_errlist) && !_def_errno_sys_errlist
1N/A#if _dat_sys_errlist
1N/Aextern char* sys_errlist[];
1N/A#else
1N/A#undef _dat_sys_nerr
1N/Achar* sys_errlist[] = { 0 };
1N/A#endif
1N/A#endif
1N/A
1N/A#if !defined(sys_nerr) && !_def_errno_sys_nerr
1N/A#if _dat_sys_nerr
1N/Aextern int sys_nerr;
1N/A#else
1N/A#undef _dat_sys_nerr
1N/Aint sys_nerr = 0;
1N/A#endif
1N/A#endif
1N/A
1N/A#if _lib_strerror
1N/Aextern char* strerror(int);
1N/A#endif
1N/A
1N/A#if _PACKAGE_astsa
1N/A
1N/A#define fmtbuf(n) ((n),tmp)
1N/A
1N/Astatic char tmp[32];
1N/A
1N/A#endif
1N/A
1N/Achar*
1N/A_ast_strerror(int err)
1N/A{
1N/A char* msg;
1N/A int z;
1N/A
1N/A#if _lib_strerror
1N/A z = errno;
1N/A msg = strerror(err);
1N/A errno = z;
1N/A#else
1N/A if (err > 0 && err <= sys_nerr)
1N/A msg = (char*)sys_errlist[err];
1N/A else
1N/A msg = 0;
1N/A#endif
1N/A if (msg)
1N/A {
1N/A#if !_PACKAGE_astsa
1N/A if (ERROR_translating())
1N/A {
1N/A#if _lib_strerror
1N/A static int sys;
1N/A
1N/A if (!sys)
1N/A {
1N/A char* s;
1N/A char* t;
1N/A char* p;
1N/A
1N/A#if _lib_strerror
1N/A /*
1N/A * stash the pending strerror() msg
1N/A */
1N/A
1N/A msg = strcpy(fmtbuf(strlen(msg) + 1), msg);
1N/A#endif
1N/A
1N/A /*
1N/A * make sure that strerror() translates
1N/A */
1N/A
1N/A if (!(s = strerror(1)))
1N/A sys = -1;
1N/A else
1N/A {
1N/A t = fmtbuf(z = strlen(s) + 1);
1N/A strcpy(t, s);
1N/A ast.locale.set |= AST_LC_internal;
1N/A p = setlocale(LC_MESSAGES, NiL);
1N/A setlocale(LC_MESSAGES, "C");
1N/A sys = (s = strerror(1)) && strcmp(s, t) ? 1 : -1;
1N/A setlocale(LC_MESSAGES, p);
1N/A ast.locale.set &= ~AST_LC_internal;
1N/A }
1N/A }
1N/A if (sys > 0)
1N/A return msg;
1N/A#endif
1N/A return ERROR_translate(NiL, NiL, "errlist", msg);
1N/A }
1N/A#endif
1N/A return msg;
1N/A }
1N/A msg = fmtbuf(z = 32);
1N/A sfsprintf(msg, z, ERROR_translate(NiL, NiL, "errlist", "Error %d"), err);
1N/A return msg;
1N/A}
1N/A
1N/A#if !_lib_strerror
1N/A
1N/A#if defined(__EXPORT__)
1N/A#define extern __EXPORT__
1N/A#endif
1N/A
1N/Aextern char*
1N/Astrerror(int err)
1N/A{
1N/A return _ast_strerror(err);
1N/A}
1N/A
1N/A#endif