1 1.1 skrll /* Extended support for using errno values. 2 1.1 skrll Written by Fred Fish. fnf (at) cygnus.com 3 1.1 skrll This file is in the public domain. --Per Bothner. */ 4 1.1 skrll 5 1.1 skrll #include "config.h" 6 1.1 skrll 7 1.1 skrll #ifdef HAVE_SYS_ERRLIST 8 1.1 skrll /* Note that errno.h (not sure what OS) or stdio.h (BSD 4.4, at least) 9 1.1 skrll might declare sys_errlist in a way that the compiler might consider 10 1.1 skrll incompatible with our later declaration, perhaps by using const 11 1.1 skrll attributes. So we hide the declaration in errno.h (if any) using a 12 1.1 skrll macro. */ 13 1.1 skrll #define sys_nerr sys_nerr__ 14 1.1 skrll #define sys_errlist sys_errlist__ 15 1.1 skrll #endif 16 1.1 skrll 17 1.1 skrll #include "ansidecl.h" 18 1.1 skrll #include "libiberty.h" 19 1.1 skrll 20 1.1 skrll #include <stdio.h> 21 1.1 skrll #include <errno.h> 22 1.1 skrll 23 1.1 skrll #ifdef HAVE_SYS_ERRLIST 24 1.1 skrll #undef sys_nerr 25 1.1 skrll #undef sys_errlist 26 1.1 skrll #endif 27 1.1 skrll 28 1.1 skrll /* Routines imported from standard C runtime libraries. */ 29 1.1 skrll 30 1.1 skrll #ifdef HAVE_STDLIB_H 31 1.1 skrll #include <stdlib.h> 32 1.1 skrll #else 33 1.5 christos extern void *malloc (); 34 1.1 skrll #endif 35 1.1 skrll 36 1.1 skrll #ifdef HAVE_STRING_H 37 1.1 skrll #include <string.h> 38 1.1 skrll #else 39 1.5 christos extern void *memset (); 40 1.1 skrll #endif 41 1.1 skrll 42 1.1 skrll #ifndef MAX 43 1.1 skrll # define MAX(a,b) ((a) > (b) ? (a) : (b)) 44 1.1 skrll #endif 45 1.1 skrll 46 1.1 skrll static void init_error_tables (void); 47 1.1 skrll 48 1.1 skrll /* Translation table for errno values. See intro(2) in most UNIX systems 49 1.1 skrll Programmers Reference Manuals. 50 1.1 skrll 51 1.1 skrll Note that this table is generally only accessed when it is used at runtime 52 1.1 skrll to initialize errno name and message tables that are indexed by errno 53 1.1 skrll value. 54 1.1 skrll 55 1.1 skrll Not all of these errnos will exist on all systems. This table is the only 56 1.1 skrll thing that should have to be updated as new error numbers are introduced. 57 1.1 skrll It's sort of ugly, but at least its portable. */ 58 1.1 skrll 59 1.1 skrll struct error_info 60 1.1 skrll { 61 1.1 skrll const int value; /* The numeric value from <errno.h> */ 62 1.1 skrll const char *const name; /* The equivalent symbolic value */ 63 1.1 skrll #ifndef HAVE_SYS_ERRLIST 64 1.1 skrll const char *const msg; /* Short message about this value */ 65 1.1 skrll #endif 66 1.1 skrll }; 67 1.1 skrll 68 1.1 skrll #ifndef HAVE_SYS_ERRLIST 69 1.1 skrll # define ENTRY(value, name, msg) {value, name, msg} 70 1.1 skrll #else 71 1.1 skrll # define ENTRY(value, name, msg) {value, name} 72 1.1 skrll #endif 73 1.1 skrll 74 1.1 skrll static const struct error_info error_table[] = 75 1.1 skrll { 76 1.1 skrll #if defined (EPERM) 77 1.1 skrll ENTRY(EPERM, "EPERM", "Not owner"), 78 1.1 skrll #endif 79 1.1 skrll #if defined (ENOENT) 80 1.1 skrll ENTRY(ENOENT, "ENOENT", "No such file or directory"), 81 1.1 skrll #endif 82 1.1 skrll #if defined (ESRCH) 83 1.1 skrll ENTRY(ESRCH, "ESRCH", "No such process"), 84 1.1 skrll #endif 85 1.1 skrll #if defined (EINTR) 86 1.1 skrll ENTRY(EINTR, "EINTR", "Interrupted system call"), 87 1.1 skrll #endif 88 1.1 skrll #if defined (EIO) 89 1.1 skrll ENTRY(EIO, "EIO", "I/O error"), 90 1.1 skrll #endif 91 1.1 skrll #if defined (ENXIO) 92 1.1 skrll ENTRY(ENXIO, "ENXIO", "No such device or address"), 93 1.1 skrll #endif 94 1.1 skrll #if defined (E2BIG) 95 1.1 skrll ENTRY(E2BIG, "E2BIG", "Arg list too long"), 96 1.1 skrll #endif 97 1.1 skrll #if defined (ENOEXEC) 98 1.1 skrll ENTRY(ENOEXEC, "ENOEXEC", "Exec format error"), 99 1.1 skrll #endif 100 1.1 skrll #if defined (EBADF) 101 1.1 skrll ENTRY(EBADF, "EBADF", "Bad file number"), 102 1.1 skrll #endif 103 1.1 skrll #if defined (ECHILD) 104 1.1 skrll ENTRY(ECHILD, "ECHILD", "No child processes"), 105 1.1 skrll #endif 106 1.1 skrll #if defined (EWOULDBLOCK) /* Put before EAGAIN, sometimes aliased */ 107 1.1 skrll ENTRY(EWOULDBLOCK, "EWOULDBLOCK", "Operation would block"), 108 1.1 skrll #endif 109 1.1 skrll #if defined (EAGAIN) 110 1.1 skrll ENTRY(EAGAIN, "EAGAIN", "No more processes"), 111 1.1 skrll #endif 112 1.1 skrll #if defined (ENOMEM) 113 1.1 skrll ENTRY(ENOMEM, "ENOMEM", "Not enough space"), 114 1.1 skrll #endif 115 1.1 skrll #if defined (EACCES) 116 1.1 skrll ENTRY(EACCES, "EACCES", "Permission denied"), 117 1.1 skrll #endif 118 1.1 skrll #if defined (EFAULT) 119 1.1 skrll ENTRY(EFAULT, "EFAULT", "Bad address"), 120 1.1 skrll #endif 121 1.1 skrll #if defined (ENOTBLK) 122 1.1 skrll ENTRY(ENOTBLK, "ENOTBLK", "Block device required"), 123 1.1 skrll #endif 124 1.1 skrll #if defined (EBUSY) 125 1.1 skrll ENTRY(EBUSY, "EBUSY", "Device busy"), 126 1.1 skrll #endif 127 1.1 skrll #if defined (EEXIST) 128 1.1 skrll ENTRY(EEXIST, "EEXIST", "File exists"), 129 1.1 skrll #endif 130 1.1 skrll #if defined (EXDEV) 131 1.1 skrll ENTRY(EXDEV, "EXDEV", "Cross-device link"), 132 1.1 skrll #endif 133 1.1 skrll #if defined (ENODEV) 134 1.1 skrll ENTRY(ENODEV, "ENODEV", "No such device"), 135 1.1 skrll #endif 136 1.1 skrll #if defined (ENOTDIR) 137 1.1 skrll ENTRY(ENOTDIR, "ENOTDIR", "Not a directory"), 138 1.1 skrll #endif 139 1.1 skrll #if defined (EISDIR) 140 1.1 skrll ENTRY(EISDIR, "EISDIR", "Is a directory"), 141 1.1 skrll #endif 142 1.1 skrll #if defined (EINVAL) 143 1.1 skrll ENTRY(EINVAL, "EINVAL", "Invalid argument"), 144 1.1 skrll #endif 145 1.1 skrll #if defined (ENFILE) 146 1.1 skrll ENTRY(ENFILE, "ENFILE", "File table overflow"), 147 1.1 skrll #endif 148 1.1 skrll #if defined (EMFILE) 149 1.1 skrll ENTRY(EMFILE, "EMFILE", "Too many open files"), 150 1.1 skrll #endif 151 1.1 skrll #if defined (ENOTTY) 152 1.1 skrll ENTRY(ENOTTY, "ENOTTY", "Not a typewriter"), 153 1.1 skrll #endif 154 1.1 skrll #if defined (ETXTBSY) 155 1.1 skrll ENTRY(ETXTBSY, "ETXTBSY", "Text file busy"), 156 1.1 skrll #endif 157 1.1 skrll #if defined (EFBIG) 158 1.1 skrll ENTRY(EFBIG, "EFBIG", "File too large"), 159 1.1 skrll #endif 160 1.1 skrll #if defined (ENOSPC) 161 1.1 skrll ENTRY(ENOSPC, "ENOSPC", "No space left on device"), 162 1.1 skrll #endif 163 1.1 skrll #if defined (ESPIPE) 164 1.1 skrll ENTRY(ESPIPE, "ESPIPE", "Illegal seek"), 165 1.1 skrll #endif 166 1.1 skrll #if defined (EROFS) 167 1.1 skrll ENTRY(EROFS, "EROFS", "Read-only file system"), 168 1.1 skrll #endif 169 1.1 skrll #if defined (EMLINK) 170 1.1 skrll ENTRY(EMLINK, "EMLINK", "Too many links"), 171 1.1 skrll #endif 172 1.1 skrll #if defined (EPIPE) 173 1.1 skrll ENTRY(EPIPE, "EPIPE", "Broken pipe"), 174 1.1 skrll #endif 175 1.1 skrll #if defined (EDOM) 176 1.1 skrll ENTRY(EDOM, "EDOM", "Math argument out of domain of func"), 177 1.1 skrll #endif 178 1.1 skrll #if defined (ERANGE) 179 1.1 skrll ENTRY(ERANGE, "ERANGE", "Math result not representable"), 180 1.1 skrll #endif 181 1.1 skrll #if defined (ENOMSG) 182 1.1 skrll ENTRY(ENOMSG, "ENOMSG", "No message of desired type"), 183 1.1 skrll #endif 184 1.1 skrll #if defined (EIDRM) 185 1.1 skrll ENTRY(EIDRM, "EIDRM", "Identifier removed"), 186 1.1 skrll #endif 187 1.1 skrll #if defined (ECHRNG) 188 1.1 skrll ENTRY(ECHRNG, "ECHRNG", "Channel number out of range"), 189 1.1 skrll #endif 190 1.1 skrll #if defined (EL2NSYNC) 191 1.1 skrll ENTRY(EL2NSYNC, "EL2NSYNC", "Level 2 not synchronized"), 192 1.1 skrll #endif 193 1.1 skrll #if defined (EL3HLT) 194 1.1 skrll ENTRY(EL3HLT, "EL3HLT", "Level 3 halted"), 195 1.1 skrll #endif 196 1.1 skrll #if defined (EL3RST) 197 1.1 skrll ENTRY(EL3RST, "EL3RST", "Level 3 reset"), 198 1.1 skrll #endif 199 1.1 skrll #if defined (ELNRNG) 200 1.1 skrll ENTRY(ELNRNG, "ELNRNG", "Link number out of range"), 201 1.1 skrll #endif 202 1.1 skrll #if defined (EUNATCH) 203 1.1 skrll ENTRY(EUNATCH, "EUNATCH", "Protocol driver not attached"), 204 1.1 skrll #endif 205 1.1 skrll #if defined (ENOCSI) 206 1.1 skrll ENTRY(ENOCSI, "ENOCSI", "No CSI structure available"), 207 1.1 skrll #endif 208 1.1 skrll #if defined (EL2HLT) 209 1.1 skrll ENTRY(EL2HLT, "EL2HLT", "Level 2 halted"), 210 1.1 skrll #endif 211 1.1 skrll #if defined (EDEADLK) 212 1.1 skrll ENTRY(EDEADLK, "EDEADLK", "Deadlock condition"), 213 1.1 skrll #endif 214 1.1 skrll #if defined (ENOLCK) 215 1.1 skrll ENTRY(ENOLCK, "ENOLCK", "No record locks available"), 216 1.1 skrll #endif 217 1.1 skrll #if defined (EBADE) 218 1.1 skrll ENTRY(EBADE, "EBADE", "Invalid exchange"), 219 1.1 skrll #endif 220 1.1 skrll #if defined (EBADR) 221 1.1 skrll ENTRY(EBADR, "EBADR", "Invalid request descriptor"), 222 1.1 skrll #endif 223 1.1 skrll #if defined (EXFULL) 224 1.1 skrll ENTRY(EXFULL, "EXFULL", "Exchange full"), 225 1.1 skrll #endif 226 1.1 skrll #if defined (ENOANO) 227 1.1 skrll ENTRY(ENOANO, "ENOANO", "No anode"), 228 1.1 skrll #endif 229 1.1 skrll #if defined (EBADRQC) 230 1.1 skrll ENTRY(EBADRQC, "EBADRQC", "Invalid request code"), 231 1.1 skrll #endif 232 1.1 skrll #if defined (EBADSLT) 233 1.1 skrll ENTRY(EBADSLT, "EBADSLT", "Invalid slot"), 234 1.1 skrll #endif 235 1.1 skrll #if defined (EDEADLOCK) 236 1.1 skrll ENTRY(EDEADLOCK, "EDEADLOCK", "File locking deadlock error"), 237 1.1 skrll #endif 238 1.1 skrll #if defined (EBFONT) 239 1.1 skrll ENTRY(EBFONT, "EBFONT", "Bad font file format"), 240 1.1 skrll #endif 241 1.1 skrll #if defined (ENOSTR) 242 1.1 skrll ENTRY(ENOSTR, "ENOSTR", "Device not a stream"), 243 1.1 skrll #endif 244 1.1 skrll #if defined (ENODATA) 245 1.1 skrll ENTRY(ENODATA, "ENODATA", "No data available"), 246 1.1 skrll #endif 247 1.1 skrll #if defined (ETIME) 248 1.1 skrll ENTRY(ETIME, "ETIME", "Timer expired"), 249 1.1 skrll #endif 250 1.1 skrll #if defined (ENOSR) 251 1.1 skrll ENTRY(ENOSR, "ENOSR", "Out of streams resources"), 252 1.1 skrll #endif 253 1.1 skrll #if defined (ENONET) 254 1.1 skrll ENTRY(ENONET, "ENONET", "Machine is not on the network"), 255 1.1 skrll #endif 256 1.1 skrll #if defined (ENOPKG) 257 1.1 skrll ENTRY(ENOPKG, "ENOPKG", "Package not installed"), 258 1.1 skrll #endif 259 1.1 skrll #if defined (EREMOTE) 260 1.1 skrll ENTRY(EREMOTE, "EREMOTE", "Object is remote"), 261 1.1 skrll #endif 262 1.1 skrll #if defined (ENOLINK) 263 1.1 skrll ENTRY(ENOLINK, "ENOLINK", "Link has been severed"), 264 1.1 skrll #endif 265 1.1 skrll #if defined (EADV) 266 1.1 skrll ENTRY(EADV, "EADV", "Advertise error"), 267 1.1 skrll #endif 268 1.1 skrll #if defined (ESRMNT) 269 1.1 skrll ENTRY(ESRMNT, "ESRMNT", "Srmount error"), 270 1.1 skrll #endif 271 1.1 skrll #if defined (ECOMM) 272 1.1 skrll ENTRY(ECOMM, "ECOMM", "Communication error on send"), 273 1.1 skrll #endif 274 1.1 skrll #if defined (EPROTO) 275 1.1 skrll ENTRY(EPROTO, "EPROTO", "Protocol error"), 276 1.1 skrll #endif 277 1.1 skrll #if defined (EMULTIHOP) 278 1.1 skrll ENTRY(EMULTIHOP, "EMULTIHOP", "Multihop attempted"), 279 1.1 skrll #endif 280 1.1 skrll #if defined (EDOTDOT) 281 1.1 skrll ENTRY(EDOTDOT, "EDOTDOT", "RFS specific error"), 282 1.1 skrll #endif 283 1.1 skrll #if defined (EBADMSG) 284 1.1 skrll ENTRY(EBADMSG, "EBADMSG", "Not a data message"), 285 1.1 skrll #endif 286 1.1 skrll #if defined (ENAMETOOLONG) 287 1.1 skrll ENTRY(ENAMETOOLONG, "ENAMETOOLONG", "File name too long"), 288 1.1 skrll #endif 289 1.1 skrll #if defined (EOVERFLOW) 290 1.1 skrll ENTRY(EOVERFLOW, "EOVERFLOW", "Value too large for defined data type"), 291 1.1 skrll #endif 292 1.1 skrll #if defined (ENOTUNIQ) 293 1.1 skrll ENTRY(ENOTUNIQ, "ENOTUNIQ", "Name not unique on network"), 294 1.1 skrll #endif 295 1.1 skrll #if defined (EBADFD) 296 1.1 skrll ENTRY(EBADFD, "EBADFD", "File descriptor in bad state"), 297 1.1 skrll #endif 298 1.1 skrll #if defined (EREMCHG) 299 1.1 skrll ENTRY(EREMCHG, "EREMCHG", "Remote address changed"), 300 1.1 skrll #endif 301 1.1 skrll #if defined (ELIBACC) 302 1.4 christos ENTRY(ELIBACC, "ELIBACC", "Cannot access a needed shared library"), 303 1.1 skrll #endif 304 1.1 skrll #if defined (ELIBBAD) 305 1.1 skrll ENTRY(ELIBBAD, "ELIBBAD", "Accessing a corrupted shared library"), 306 1.1 skrll #endif 307 1.1 skrll #if defined (ELIBSCN) 308 1.1 skrll ENTRY(ELIBSCN, "ELIBSCN", ".lib section in a.out corrupted"), 309 1.1 skrll #endif 310 1.1 skrll #if defined (ELIBMAX) 311 1.1 skrll ENTRY(ELIBMAX, "ELIBMAX", "Attempting to link in too many shared libraries"), 312 1.1 skrll #endif 313 1.1 skrll #if defined (ELIBEXEC) 314 1.1 skrll ENTRY(ELIBEXEC, "ELIBEXEC", "Cannot exec a shared library directly"), 315 1.1 skrll #endif 316 1.1 skrll #if defined (EILSEQ) 317 1.1 skrll ENTRY(EILSEQ, "EILSEQ", "Illegal byte sequence"), 318 1.1 skrll #endif 319 1.1 skrll #if defined (ENOSYS) 320 1.1 skrll ENTRY(ENOSYS, "ENOSYS", "Operation not applicable"), 321 1.1 skrll #endif 322 1.1 skrll #if defined (ELOOP) 323 1.1 skrll ENTRY(ELOOP, "ELOOP", "Too many symbolic links encountered"), 324 1.1 skrll #endif 325 1.1 skrll #if defined (ERESTART) 326 1.1 skrll ENTRY(ERESTART, "ERESTART", "Interrupted system call should be restarted"), 327 1.1 skrll #endif 328 1.1 skrll #if defined (ESTRPIPE) 329 1.1 skrll ENTRY(ESTRPIPE, "ESTRPIPE", "Streams pipe error"), 330 1.1 skrll #endif 331 1.1 skrll #if defined (ENOTEMPTY) 332 1.1 skrll ENTRY(ENOTEMPTY, "ENOTEMPTY", "Directory not empty"), 333 1.1 skrll #endif 334 1.1 skrll #if defined (EUSERS) 335 1.1 skrll ENTRY(EUSERS, "EUSERS", "Too many users"), 336 1.1 skrll #endif 337 1.1 skrll #if defined (ENOTSOCK) 338 1.1 skrll ENTRY(ENOTSOCK, "ENOTSOCK", "Socket operation on non-socket"), 339 1.1 skrll #endif 340 1.1 skrll #if defined (EDESTADDRREQ) 341 1.1 skrll ENTRY(EDESTADDRREQ, "EDESTADDRREQ", "Destination address required"), 342 1.1 skrll #endif 343 1.1 skrll #if defined (EMSGSIZE) 344 1.1 skrll ENTRY(EMSGSIZE, "EMSGSIZE", "Message too long"), 345 1.1 skrll #endif 346 1.1 skrll #if defined (EPROTOTYPE) 347 1.1 skrll ENTRY(EPROTOTYPE, "EPROTOTYPE", "Protocol wrong type for socket"), 348 1.1 skrll #endif 349 1.1 skrll #if defined (ENOPROTOOPT) 350 1.2 skrll ENTRY(ENOPROTOOPT, "ENOPROTOOPT", "Protocol option not available"), 351 1.1 skrll #endif 352 1.1 skrll #if defined (EPROTONOSUPPORT) 353 1.1 skrll ENTRY(EPROTONOSUPPORT, "EPROTONOSUPPORT", "Protocol not supported"), 354 1.1 skrll #endif 355 1.1 skrll #if defined (ESOCKTNOSUPPORT) 356 1.1 skrll ENTRY(ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT", "Socket type not supported"), 357 1.1 skrll #endif 358 1.1 skrll #if defined (EOPNOTSUPP) 359 1.1 skrll ENTRY(EOPNOTSUPP, "EOPNOTSUPP", "Operation not supported on transport endpoint"), 360 1.1 skrll #endif 361 1.1 skrll #if defined (EPFNOSUPPORT) 362 1.1 skrll ENTRY(EPFNOSUPPORT, "EPFNOSUPPORT", "Protocol family not supported"), 363 1.1 skrll #endif 364 1.1 skrll #if defined (EAFNOSUPPORT) 365 1.1 skrll ENTRY(EAFNOSUPPORT, "EAFNOSUPPORT", "Address family not supported by protocol"), 366 1.1 skrll #endif 367 1.1 skrll #if defined (EADDRINUSE) 368 1.1 skrll ENTRY(EADDRINUSE, "EADDRINUSE", "Address already in use"), 369 1.1 skrll #endif 370 1.1 skrll #if defined (EADDRNOTAVAIL) 371 1.1 skrll ENTRY(EADDRNOTAVAIL, "EADDRNOTAVAIL","Cannot assign requested address"), 372 1.1 skrll #endif 373 1.1 skrll #if defined (ENETDOWN) 374 1.1 skrll ENTRY(ENETDOWN, "ENETDOWN", "Network is down"), 375 1.1 skrll #endif 376 1.1 skrll #if defined (ENETUNREACH) 377 1.1 skrll ENTRY(ENETUNREACH, "ENETUNREACH", "Network is unreachable"), 378 1.1 skrll #endif 379 1.1 skrll #if defined (ENETRESET) 380 1.1 skrll ENTRY(ENETRESET, "ENETRESET", "Network dropped connection because of reset"), 381 1.1 skrll #endif 382 1.1 skrll #if defined (ECONNABORTED) 383 1.1 skrll ENTRY(ECONNABORTED, "ECONNABORTED", "Software caused connection abort"), 384 1.1 skrll #endif 385 1.1 skrll #if defined (ECONNRESET) 386 1.1 skrll ENTRY(ECONNRESET, "ECONNRESET", "Connection reset by peer"), 387 1.1 skrll #endif 388 1.1 skrll #if defined (ENOBUFS) 389 1.1 skrll ENTRY(ENOBUFS, "ENOBUFS", "No buffer space available"), 390 1.1 skrll #endif 391 1.1 skrll #if defined (EISCONN) 392 1.1 skrll ENTRY(EISCONN, "EISCONN", "Transport endpoint is already connected"), 393 1.1 skrll #endif 394 1.1 skrll #if defined (ENOTCONN) 395 1.1 skrll ENTRY(ENOTCONN, "ENOTCONN", "Transport endpoint is not connected"), 396 1.1 skrll #endif 397 1.1 skrll #if defined (ESHUTDOWN) 398 1.1 skrll ENTRY(ESHUTDOWN, "ESHUTDOWN", "Cannot send after transport endpoint shutdown"), 399 1.1 skrll #endif 400 1.1 skrll #if defined (ETOOMANYREFS) 401 1.1 skrll ENTRY(ETOOMANYREFS, "ETOOMANYREFS", "Too many references: cannot splice"), 402 1.1 skrll #endif 403 1.1 skrll #if defined (ETIMEDOUT) 404 1.1 skrll ENTRY(ETIMEDOUT, "ETIMEDOUT", "Connection timed out"), 405 1.1 skrll #endif 406 1.1 skrll #if defined (ECONNREFUSED) 407 1.1 skrll ENTRY(ECONNREFUSED, "ECONNREFUSED", "Connection refused"), 408 1.1 skrll #endif 409 1.1 skrll #if defined (EHOSTDOWN) 410 1.1 skrll ENTRY(EHOSTDOWN, "EHOSTDOWN", "Host is down"), 411 1.1 skrll #endif 412 1.1 skrll #if defined (EHOSTUNREACH) 413 1.1 skrll ENTRY(EHOSTUNREACH, "EHOSTUNREACH", "No route to host"), 414 1.1 skrll #endif 415 1.1 skrll #if defined (EALREADY) 416 1.1 skrll ENTRY(EALREADY, "EALREADY", "Operation already in progress"), 417 1.1 skrll #endif 418 1.1 skrll #if defined (EINPROGRESS) 419 1.1 skrll ENTRY(EINPROGRESS, "EINPROGRESS", "Operation now in progress"), 420 1.1 skrll #endif 421 1.1 skrll #if defined (ESTALE) 422 1.1 skrll ENTRY(ESTALE, "ESTALE", "Stale NFS file handle"), 423 1.1 skrll #endif 424 1.1 skrll #if defined (EUCLEAN) 425 1.1 skrll ENTRY(EUCLEAN, "EUCLEAN", "Structure needs cleaning"), 426 1.1 skrll #endif 427 1.1 skrll #if defined (ENOTNAM) 428 1.1 skrll ENTRY(ENOTNAM, "ENOTNAM", "Not a XENIX named type file"), 429 1.1 skrll #endif 430 1.1 skrll #if defined (ENAVAIL) 431 1.1 skrll ENTRY(ENAVAIL, "ENAVAIL", "No XENIX semaphores available"), 432 1.1 skrll #endif 433 1.1 skrll #if defined (EISNAM) 434 1.1 skrll ENTRY(EISNAM, "EISNAM", "Is a named type file"), 435 1.1 skrll #endif 436 1.1 skrll #if defined (EREMOTEIO) 437 1.1 skrll ENTRY(EREMOTEIO, "EREMOTEIO", "Remote I/O error"), 438 1.1 skrll #endif 439 1.1 skrll ENTRY(0, NULL, NULL) 440 1.1 skrll }; 441 1.1 skrll 442 1.1 skrll #ifdef EVMSERR 443 1.1 skrll /* This is not in the table, because the numeric value of EVMSERR (32767) 444 1.1 skrll lies outside the range of sys_errlist[]. */ 445 1.1 skrll static struct { int value; const char *name, *msg; } 446 1.1 skrll evmserr = { EVMSERR, "EVMSERR", "VMS-specific error" }; 447 1.1 skrll #endif 448 1.1 skrll 449 1.1 skrll /* Translation table allocated and initialized at runtime. Indexed by the 450 1.1 skrll errno value to find the equivalent symbolic value. */ 451 1.1 skrll 452 1.1 skrll static const char **error_names; 453 1.1 skrll static int num_error_names = 0; 454 1.1 skrll 455 1.1 skrll /* Translation table allocated and initialized at runtime, if it does not 456 1.1 skrll already exist in the host environment. Indexed by the errno value to find 457 1.1 skrll the descriptive string. 458 1.1 skrll 459 1.1 skrll We don't export it for use in other modules because even though it has the 460 1.1 skrll same name, it differs from other implementations in that it is dynamically 461 1.1 skrll initialized rather than statically initialized. */ 462 1.1 skrll 463 1.1 skrll #ifndef HAVE_SYS_ERRLIST 464 1.1 skrll 465 1.1 skrll #define sys_nerr sys_nerr__ 466 1.1 skrll #define sys_errlist sys_errlist__ 467 1.1 skrll static int sys_nerr; 468 1.1 skrll static const char **sys_errlist; 469 1.1 skrll 470 1.1 skrll #else 471 1.1 skrll 472 1.3 christos 473 1.3 christos #ifndef sys_nerr 474 1.1 skrll extern int sys_nerr; 475 1.3 christos #endif 476 1.3 christos #ifndef sys_errlist 477 1.1 skrll extern char *sys_errlist[]; 478 1.3 christos #endif 479 1.1 skrll 480 1.1 skrll #endif 481 1.1 skrll 482 1.1 skrll /* 483 1.1 skrll 484 1.1 skrll NAME 485 1.1 skrll 486 1.1 skrll init_error_tables -- initialize the name and message tables 487 1.1 skrll 488 1.1 skrll SYNOPSIS 489 1.1 skrll 490 1.1 skrll static void init_error_tables (); 491 1.1 skrll 492 1.1 skrll DESCRIPTION 493 1.1 skrll 494 1.1 skrll Using the error_table, which is initialized at compile time, generate 495 1.1 skrll the error_names and the sys_errlist (if needed) tables, which are 496 1.1 skrll indexed at runtime by a specific errno value. 497 1.1 skrll 498 1.1 skrll BUGS 499 1.1 skrll 500 1.1 skrll The initialization of the tables may fail under low memory conditions, 501 1.1 skrll in which case we don't do anything particularly useful, but we don't 502 1.1 skrll bomb either. Who knows, it might succeed at a later point if we free 503 1.1 skrll some memory in the meantime. In any case, the other routines know 504 1.1 skrll how to deal with lack of a table after trying to initialize it. This 505 1.1 skrll may or may not be considered to be a bug, that we don't specifically 506 1.1 skrll warn about this particular failure mode. 507 1.1 skrll 508 1.1 skrll */ 509 1.1 skrll 510 1.1 skrll static void 511 1.1 skrll init_error_tables (void) 512 1.1 skrll { 513 1.1 skrll const struct error_info *eip; 514 1.1 skrll int nbytes; 515 1.1 skrll 516 1.1 skrll /* If we haven't already scanned the error_table once to find the maximum 517 1.1 skrll errno value, then go find it now. */ 518 1.1 skrll 519 1.1 skrll if (num_error_names == 0) 520 1.1 skrll { 521 1.1 skrll for (eip = error_table; eip -> name != NULL; eip++) 522 1.1 skrll { 523 1.1 skrll if (eip -> value >= num_error_names) 524 1.1 skrll { 525 1.1 skrll num_error_names = eip -> value + 1; 526 1.1 skrll } 527 1.1 skrll } 528 1.1 skrll } 529 1.1 skrll 530 1.1 skrll /* Now attempt to allocate the error_names table, zero it out, and then 531 1.1 skrll initialize it from the statically initialized error_table. */ 532 1.1 skrll 533 1.1 skrll if (error_names == NULL) 534 1.1 skrll { 535 1.1 skrll nbytes = num_error_names * sizeof (char *); 536 1.1 skrll if ((error_names = (const char **) malloc (nbytes)) != NULL) 537 1.1 skrll { 538 1.1 skrll memset (error_names, 0, nbytes); 539 1.1 skrll for (eip = error_table; eip -> name != NULL; eip++) 540 1.1 skrll { 541 1.1 skrll error_names[eip -> value] = eip -> name; 542 1.1 skrll } 543 1.1 skrll } 544 1.1 skrll } 545 1.1 skrll 546 1.1 skrll #ifndef HAVE_SYS_ERRLIST 547 1.1 skrll 548 1.1 skrll /* Now attempt to allocate the sys_errlist table, zero it out, and then 549 1.1 skrll initialize it from the statically initialized error_table. */ 550 1.1 skrll 551 1.1 skrll if (sys_errlist == NULL) 552 1.1 skrll { 553 1.1 skrll nbytes = num_error_names * sizeof (char *); 554 1.1 skrll if ((sys_errlist = (const char **) malloc (nbytes)) != NULL) 555 1.1 skrll { 556 1.1 skrll memset (sys_errlist, 0, nbytes); 557 1.1 skrll sys_nerr = num_error_names; 558 1.1 skrll for (eip = error_table; eip -> name != NULL; eip++) 559 1.1 skrll { 560 1.1 skrll sys_errlist[eip -> value] = eip -> msg; 561 1.1 skrll } 562 1.1 skrll } 563 1.1 skrll } 564 1.1 skrll 565 1.1 skrll #endif 566 1.1 skrll 567 1.1 skrll } 568 1.1 skrll 569 1.1 skrll /* 570 1.1 skrll 571 1.1 skrll 572 1.1 skrll @deftypefn Extension int errno_max (void) 573 1.1 skrll 574 1.1 skrll Returns the maximum @code{errno} value for which a corresponding 575 1.1 skrll symbolic name or message is available. Note that in the case where we 576 1.1 skrll use the @code{sys_errlist} supplied by the system, it is possible for 577 1.1 skrll there to be more symbolic names than messages, or vice versa. In 578 1.1 skrll fact, the manual page for @code{perror(3C)} explicitly warns that one 579 1.1 skrll should check the size of the table (@code{sys_nerr}) before indexing 580 1.1 skrll it, since new error codes may be added to the system before they are 581 1.1 skrll added to the table. Thus @code{sys_nerr} might be smaller than value 582 1.1 skrll implied by the largest @code{errno} value defined in @code{<errno.h>}. 583 1.1 skrll 584 1.1 skrll We return the maximum value that can be used to obtain a meaningful 585 1.1 skrll symbolic name or message. 586 1.1 skrll 587 1.1 skrll @end deftypefn 588 1.1 skrll 589 1.1 skrll */ 590 1.1 skrll 591 1.1 skrll int 592 1.1 skrll errno_max (void) 593 1.1 skrll { 594 1.1 skrll int maxsize; 595 1.1 skrll 596 1.1 skrll if (error_names == NULL) 597 1.1 skrll { 598 1.1 skrll init_error_tables (); 599 1.1 skrll } 600 1.1 skrll maxsize = MAX (sys_nerr, num_error_names); 601 1.1 skrll return (maxsize - 1); 602 1.1 skrll } 603 1.1 skrll 604 1.1 skrll #ifndef HAVE_STRERROR 605 1.1 skrll 606 1.1 skrll /* 607 1.1 skrll 608 1.1 skrll @deftypefn Supplemental char* strerror (int @var{errnoval}) 609 1.1 skrll 610 1.1 skrll Maps an @code{errno} number to an error message string, the contents 611 1.1 skrll of which are implementation defined. On systems which have the 612 1.1 skrll external variables @code{sys_nerr} and @code{sys_errlist}, these 613 1.1 skrll strings will be the same as the ones used by @code{perror}. 614 1.1 skrll 615 1.1 skrll If the supplied error number is within the valid range of indices for 616 1.1 skrll the @code{sys_errlist}, but no message is available for the particular 617 1.1 skrll error number, then returns the string @samp{Error @var{num}}, where 618 1.1 skrll @var{num} is the error number. 619 1.1 skrll 620 1.1 skrll If the supplied error number is not a valid index into 621 1.1 skrll @code{sys_errlist}, returns @code{NULL}. 622 1.1 skrll 623 1.1 skrll The returned string is only guaranteed to be valid only until the 624 1.1 skrll next call to @code{strerror}. 625 1.1 skrll 626 1.1 skrll @end deftypefn 627 1.1 skrll 628 1.1 skrll */ 629 1.1 skrll 630 1.1 skrll char * 631 1.1 skrll strerror (int errnoval) 632 1.1 skrll { 633 1.1 skrll const char *msg; 634 1.1 skrll static char buf[32]; 635 1.1 skrll 636 1.1 skrll #ifndef HAVE_SYS_ERRLIST 637 1.1 skrll 638 1.1 skrll if (error_names == NULL) 639 1.1 skrll { 640 1.1 skrll init_error_tables (); 641 1.1 skrll } 642 1.1 skrll 643 1.1 skrll #endif 644 1.1 skrll 645 1.1 skrll if ((errnoval < 0) || (errnoval >= sys_nerr)) 646 1.1 skrll { 647 1.1 skrll #ifdef EVMSERR 648 1.1 skrll if (errnoval == evmserr.value) 649 1.1 skrll msg = evmserr.msg; 650 1.1 skrll else 651 1.1 skrll #endif 652 1.1 skrll /* Out of range, just return NULL */ 653 1.1 skrll msg = NULL; 654 1.1 skrll } 655 1.1 skrll else if ((sys_errlist == NULL) || (sys_errlist[errnoval] == NULL)) 656 1.1 skrll { 657 1.1 skrll /* In range, but no sys_errlist or no entry at this index. */ 658 1.1 skrll sprintf (buf, "Error %d", errnoval); 659 1.1 skrll msg = buf; 660 1.1 skrll } 661 1.1 skrll else 662 1.1 skrll { 663 1.1 skrll /* In range, and a valid message. Just return the message. */ 664 1.1 skrll msg = (char *) sys_errlist[errnoval]; 665 1.1 skrll } 666 1.1 skrll 667 1.1 skrll return (msg); 668 1.1 skrll } 669 1.1 skrll 670 1.1 skrll #endif /* ! HAVE_STRERROR */ 671 1.1 skrll 672 1.1 skrll 673 1.1 skrll /* 674 1.1 skrll 675 1.1 skrll @deftypefn Replacement {const char*} strerrno (int @var{errnum}) 676 1.1 skrll 677 1.1 skrll Given an error number returned from a system call (typically returned 678 1.1 skrll in @code{errno}), returns a pointer to a string containing the 679 1.1 skrll symbolic name of that error number, as found in @code{<errno.h>}. 680 1.1 skrll 681 1.1 skrll If the supplied error number is within the valid range of indices for 682 1.1 skrll symbolic names, but no name is available for the particular error 683 1.1 skrll number, then returns the string @samp{Error @var{num}}, where @var{num} 684 1.1 skrll is the error number. 685 1.1 skrll 686 1.1 skrll If the supplied error number is not within the range of valid 687 1.1 skrll indices, then returns @code{NULL}. 688 1.1 skrll 689 1.1 skrll The contents of the location pointed to are only guaranteed to be 690 1.1 skrll valid until the next call to @code{strerrno}. 691 1.1 skrll 692 1.1 skrll @end deftypefn 693 1.1 skrll 694 1.1 skrll */ 695 1.1 skrll 696 1.1 skrll const char * 697 1.1 skrll strerrno (int errnoval) 698 1.1 skrll { 699 1.1 skrll const char *name; 700 1.1 skrll static char buf[32]; 701 1.1 skrll 702 1.1 skrll if (error_names == NULL) 703 1.1 skrll { 704 1.1 skrll init_error_tables (); 705 1.1 skrll } 706 1.1 skrll 707 1.1 skrll if ((errnoval < 0) || (errnoval >= num_error_names)) 708 1.1 skrll { 709 1.1 skrll #ifdef EVMSERR 710 1.1 skrll if (errnoval == evmserr.value) 711 1.1 skrll name = evmserr.name; 712 1.1 skrll else 713 1.1 skrll #endif 714 1.1 skrll /* Out of range, just return NULL */ 715 1.1 skrll name = NULL; 716 1.1 skrll } 717 1.1 skrll else if ((error_names == NULL) || (error_names[errnoval] == NULL)) 718 1.1 skrll { 719 1.1 skrll /* In range, but no error_names or no entry at this index. */ 720 1.1 skrll sprintf (buf, "Error %d", errnoval); 721 1.1 skrll name = (const char *) buf; 722 1.1 skrll } 723 1.1 skrll else 724 1.1 skrll { 725 1.1 skrll /* In range, and a valid name. Just return the name. */ 726 1.1 skrll name = error_names[errnoval]; 727 1.1 skrll } 728 1.1 skrll 729 1.1 skrll return (name); 730 1.1 skrll } 731 1.1 skrll 732 1.1 skrll /* 733 1.1 skrll 734 1.1 skrll @deftypefn Extension int strtoerrno (const char *@var{name}) 735 1.1 skrll 736 1.1 skrll Given the symbolic name of a error number (e.g., @code{EACCES}), map it 737 1.1 skrll to an errno value. If no translation is found, returns 0. 738 1.1 skrll 739 1.1 skrll @end deftypefn 740 1.1 skrll 741 1.1 skrll */ 742 1.1 skrll 743 1.1 skrll int 744 1.1 skrll strtoerrno (const char *name) 745 1.1 skrll { 746 1.1 skrll int errnoval = 0; 747 1.1 skrll 748 1.1 skrll if (name != NULL) 749 1.1 skrll { 750 1.1 skrll if (error_names == NULL) 751 1.1 skrll { 752 1.1 skrll init_error_tables (); 753 1.1 skrll } 754 1.1 skrll for (errnoval = 0; errnoval < num_error_names; errnoval++) 755 1.1 skrll { 756 1.1 skrll if ((error_names[errnoval] != NULL) && 757 1.1 skrll (strcmp (name, error_names[errnoval]) == 0)) 758 1.1 skrll { 759 1.1 skrll break; 760 1.1 skrll } 761 1.1 skrll } 762 1.1 skrll if (errnoval == num_error_names) 763 1.1 skrll { 764 1.1 skrll #ifdef EVMSERR 765 1.1 skrll if (strcmp (name, evmserr.name) == 0) 766 1.1 skrll errnoval = evmserr.value; 767 1.1 skrll else 768 1.1 skrll #endif 769 1.1 skrll errnoval = 0; 770 1.1 skrll } 771 1.1 skrll } 772 1.1 skrll return (errnoval); 773 1.1 skrll } 774 1.1 skrll 775 1.1 skrll 776 1.1 skrll /* A simple little main that does nothing but print all the errno translations 777 1.1 skrll if MAIN is defined and this file is compiled and linked. */ 778 1.1 skrll 779 1.1 skrll #ifdef MAIN 780 1.1 skrll 781 1.1 skrll #include <stdio.h> 782 1.1 skrll 783 1.1 skrll int 784 1.1 skrll main (void) 785 1.1 skrll { 786 1.1 skrll int errn; 787 1.1 skrll int errnmax; 788 1.1 skrll const char *name; 789 1.1 skrll const char *msg; 790 1.1 skrll char *strerror (); 791 1.1 skrll 792 1.1 skrll errnmax = errno_max (); 793 1.1 skrll printf ("%d entries in names table.\n", num_error_names); 794 1.1 skrll printf ("%d entries in messages table.\n", sys_nerr); 795 1.1 skrll printf ("%d is max useful index.\n", errnmax); 796 1.1 skrll 797 1.1 skrll /* Keep printing values until we get to the end of *both* tables, not 798 1.1 skrll *either* table. Note that knowing the maximum useful index does *not* 799 1.1 skrll relieve us of the responsibility of testing the return pointer for 800 1.1 skrll NULL. */ 801 1.1 skrll 802 1.1 skrll for (errn = 0; errn <= errnmax; errn++) 803 1.1 skrll { 804 1.1 skrll name = strerrno (errn); 805 1.1 skrll name = (name == NULL) ? "<NULL>" : name; 806 1.1 skrll msg = strerror (errn); 807 1.1 skrll msg = (msg == NULL) ? "<NULL>" : msg; 808 1.1 skrll printf ("%-4d%-18s%s\n", errn, name, msg); 809 1.1 skrll } 810 1.1 skrll 811 1.1 skrll return 0; 812 1.1 skrll } 813 1.1 skrll 814 1.1 skrll #endif 815