1 /* 2 * Copyright (c) 2001 Sendmail, Inc. and its suppliers. 3 * All rights reserved. 4 * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. 5 * Copyright (c) 1988, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * By using this file, you agree to the terms and conditions set 9 * forth in the LICENSE file which can be found at the top level of 10 * the sendmail distribution. 11 */ 12 13 #include <sm/gen.h> 14 SM_RCSID("@(#)$Id: errstring.c,v 1.12 2001/10/03 16:09:32 ca Exp $") 15 16 #include <errno.h> 17 #include <stdio.h> /* sys_errlist, on some platforms */ 18 19 #include <sm/io.h> /* sm_snprintf */ 20 #include <sm/string.h> 21 #include <sm/errstring.h> 22 23 #if NAMED_BIND 24 # include <netdb.h> 25 #endif 26 27 #if LDAPMAP 28 # include <lber.h> 29 # include <ldap.h> /* for LDAP error codes */ 30 #endif /* LDAPMAP */ 31 32 /* 33 ** Notice: this file is used by libmilter. Please try to avoid 34 ** using libsm specific functions. 35 */ 36 37 /* 38 ** SM_ERRSTRING -- return string description of error code 39 ** 40 ** Parameters: 41 ** errnum -- the error number to translate 42 ** 43 ** Returns: 44 ** A string description of errnum. 45 */ 46 47 const char * 48 sm_errstring(errnum) 49 int errnum; 50 { 51 char *ret; 52 53 switch (errnum) 54 { 55 case EPERM: 56 /* SunOS gives "Not owner" -- this is the POSIX message */ 57 return "Operation not permitted"; 58 59 /* 60 ** Error messages used internally in sendmail. 61 */ 62 63 case E_SM_OPENTIMEOUT: 64 return "Timeout on file open"; 65 66 case E_SM_NOSLINK: 67 return "Symbolic links not allowed"; 68 69 case E_SM_NOHLINK: 70 return "Hard links not allowed"; 71 72 case E_SM_REGONLY: 73 return "Regular files only"; 74 75 case E_SM_ISEXEC: 76 return "Executable files not allowed"; 77 78 case E_SM_WWDIR: 79 return "World writable directory"; 80 81 case E_SM_GWDIR: 82 return "Group writable directory"; 83 84 case E_SM_FILECHANGE: 85 return "File changed after open"; 86 87 case E_SM_WWFILE: 88 return "World writable file"; 89 90 case E_SM_GWFILE: 91 return "Group writable file"; 92 93 case E_SM_GRFILE: 94 return "Group readable file"; 95 96 case E_SM_WRFILE: 97 return "World readable file"; 98 99 /* 100 ** DNS error messages. 101 */ 102 103 #if NAMED_BIND 104 case HOST_NOT_FOUND + E_DNSBASE: 105 return "Name server: host not found"; 106 107 case TRY_AGAIN + E_DNSBASE: 108 return "Name server: host name lookup failure"; 109 110 case NO_RECOVERY + E_DNSBASE: 111 return "Name server: non-recoverable error"; 112 113 case NO_DATA + E_DNSBASE: 114 return "Name server: no data known"; 115 #endif /* NAMED_BIND */ 116 117 /* 118 ** libsmdb error messages. 119 */ 120 121 case SMDBE_MALLOC: 122 return "Memory allocation failed"; 123 124 case SMDBE_GDBM_IS_BAD: 125 return "GDBM is not supported"; 126 127 case SMDBE_UNSUPPORTED: 128 return "Unsupported action"; 129 130 case SMDBE_DUPLICATE: 131 return "Key already exists"; 132 133 case SMDBE_BAD_OPEN: 134 return "Database open failed"; 135 136 case SMDBE_NOT_FOUND: 137 return "Key not found"; 138 139 case SMDBE_UNKNOWN_DB_TYPE: 140 return "Unknown database type"; 141 142 case SMDBE_UNSUPPORTED_DB_TYPE: 143 return "Support for database type not compiled into this program"; 144 145 case SMDBE_INCOMPLETE: 146 return "DB sync did not finish"; 147 148 case SMDBE_KEY_EMPTY: 149 return "Key is empty"; 150 151 case SMDBE_KEY_EXIST: 152 return "Key already exists"; 153 154 case SMDBE_LOCK_DEADLOCK: 155 return "Locker killed to resolve deadlock"; 156 157 case SMDBE_LOCK_NOT_GRANTED: 158 return "Lock unavailable"; 159 160 case SMDBE_LOCK_NOT_HELD: 161 return "Lock not held by locker"; 162 163 case SMDBE_RUN_RECOVERY: 164 return "Database panic, run recovery"; 165 166 case SMDBE_IO_ERROR: 167 return "I/O error"; 168 169 case SMDBE_READ_ONLY: 170 return "Database opened read-only"; 171 172 case SMDBE_DB_NAME_TOO_LONG: 173 return "Name too long"; 174 175 case SMDBE_INVALID_PARAMETER: 176 return "Invalid parameter"; 177 178 case SMDBE_ONLY_SUPPORTS_ONE_CURSOR: 179 return "Only one cursor allowed"; 180 181 case SMDBE_NOT_A_VALID_CURSOR: 182 return "Invalid cursor"; 183 184 case SMDBE_OLD_VERSION: 185 return "Berkeley DB file is an old version, recreate it"; 186 } 187 188 /* 189 ** LDAP error messages. 190 */ 191 192 #if LDAPMAP 193 if (errnum >= E_LDAPBASE) 194 return ldap_err2string(errnum - E_LDAPBASE); 195 #endif /* LDAPMAP */ 196 197 ret = strerror(errnum); 198 if (ret == NULL) 199 { 200 static char buf[30]; 201 202 (void) sm_snprintf(buf, sizeof buf, "Error %d", errnum); 203 return buf; 204 } 205 return ret; 206 } 207