Blame src/lib/libast/string/strerror.c

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