1 /*********************************************************************** 2 * * 3 * This software is part of the ast package * 4 * Copyright (c) 1985-2011 AT&T Intellectual Property * 5 * and is licensed under the * 6 * Eclipse Public License, Version 1.0 * 7 * by AT&T Intellectual Property * 8 * * 9 * A copy of the License is available at * 10 * http://www.eclipse.org/org/documents/epl-v10.html * 11 * (with md5 checksum b35adb5213ca9657e911e9befb180842) * 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* 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* 143 strerror(int err) 144 { 145 return _ast_strerror(err); 146 } 147 148 #endif 149