1 /*
2  * Original: tclPosixStr.c --
3  *
4  *	This file contains procedures that generate strings
5  *	corresponding to various POSIX-related codes, such
6  *	as errno and signals.
7  *
8  * Copyright (c) 1991-1994 The Regents of the University of California.
9  * Copyright (c) 1994-1996 Sun Microsystems, Inc.
10  *
11  * See the file "license.terms" for information on usage and redistribution
12  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
13  *
14  * SCCS: @(#) tclPosixStr.c 1.32 96/10/10 10:09:42
15  */
16 
17 /* %ExternalCopyright% */
18 #ifdef HAVE_CONFIG_H
19 #  include "config.h"
20 #endif
21 
22 #ifdef __WIN32__
23 #ifndef WINDOWS_H_INCLUDES_WINSOCK2_H
24 #include <winsock2.h>
25 #endif
26 #include <windows.h>
27 #endif
28 
29 #include "erl_errno.h"
30 #include "sys.h"
31 #include "erl_driver.h"
32 
33 /*
34  *----------------------------------------------------------------------
35  *
36  * erl_errno_id --
37  *
38  *	Return a textual identifier for the given errno value.
39  *
40  * Results:
41  *	This procedure returns a machine-readable textual identifier
42  *	that corresponds to the current errno value (e.g. "eperm").
43  *	The identifier is the same as the #define name in errno.h,
44  *	except that it is in lowercase.
45  *
46  *----------------------------------------------------------------------
47  */
48 
49 char *
erl_errno_id(error)50 erl_errno_id(error)
51     int error;			/* Posix error number (as from errno). */
52 {
53     switch (error) {
54 #ifdef E2BIG
55     case E2BIG: return "e2big";
56 #endif
57 #ifdef EACCES
58     case EACCES: return "eacces";
59 #endif
60 #ifdef EADDRINUSE
61     case EADDRINUSE: return "eaddrinuse";
62 #endif
63 #ifdef EADDRNOTAVAIL
64     case EADDRNOTAVAIL: return "eaddrnotavail";
65 #endif
66 #ifdef EADV
67     case EADV: return "eadv";
68 #endif
69 #ifdef EAFNOSUPPORT
70     case EAFNOSUPPORT: return "eafnosupport";
71 #endif
72 #ifdef EAGAIN
73     case EAGAIN: return "eagain";
74 #endif
75 #ifdef EALIGN
76     case EALIGN: return "ealign";
77 #endif
78 #if defined(EALREADY) && (!defined(EBUSY) || (EALREADY != EBUSY ))
79     case EALREADY: return "ealready";
80 #endif
81 #ifdef EBADE
82     case EBADE: return "ebade";
83 #endif
84 #ifdef EBADF
85     case EBADF: return "ebadf";
86 #endif
87 #ifdef EBADFD
88     case EBADFD: return "ebadfd";
89 #endif
90 #ifdef EBADMSG
91     case EBADMSG: return "ebadmsg";
92 #endif
93 #ifdef EBADR
94     case EBADR: return "ebadr";
95 #endif
96 #ifdef EBADRPC
97     case EBADRPC: return "ebadrpc";
98 #endif
99 #ifdef EBADRQC
100     case EBADRQC: return "ebadrqc";
101 #endif
102 #ifdef EBADSLT
103     case EBADSLT: return "ebadslt";
104 #endif
105 #ifdef EBFONT
106     case EBFONT: return "ebfont";
107 #endif
108 #ifdef EBUSY
109     case EBUSY: return "ebusy";
110 #endif
111 #ifdef ECHILD
112     case ECHILD: return "echild";
113 #endif
114 #ifdef ECHRNG
115     case ECHRNG: return "echrng";
116 #endif
117 #ifdef ECOMM
118     case ECOMM: return "ecomm";
119 #endif
120 #ifdef ECONNABORTED
121     case ECONNABORTED: return "econnaborted";
122 #endif
123 #ifdef ECONNREFUSED
124     case ECONNREFUSED: return "econnrefused";
125 #endif
126 #ifdef ECONNRESET
127     case ECONNRESET: return "econnreset";
128 #endif
129 #if defined(EDEADLK) && (!defined(EWOULDBLOCK) || (EDEADLK != EWOULDBLOCK))
130     case EDEADLK: return "edeadlk";
131 #endif
132 #if defined(EDEADLOCK) && (!defined(EDEADLK) || (EDEADLOCK != EDEADLK))
133     case EDEADLOCK: return "edeadlock";
134 #endif
135 #ifdef EDESTADDRREQ
136     case EDESTADDRREQ: return "edestaddrreq";
137 #endif
138 #ifdef EDIRTY
139     case EDIRTY: return "edirty";
140 #endif
141 #ifdef EDOM
142     case EDOM: return "edom";
143 #endif
144 #ifdef EDOTDOT
145     case EDOTDOT: return "edotdot";
146 #endif
147 #ifdef EDQUOT
148     case EDQUOT: return "edquot";
149 #endif
150 #ifdef EDUPPKG
151     case EDUPPKG: return "eduppkg";
152 #endif
153 #ifdef EEXIST
154     case EEXIST: return "eexist";
155 #endif
156 #ifdef EFAULT
157     case EFAULT: return "efault";
158 #endif
159 #ifdef EFTYPE
160     case EFTYPE: return "eftype";
161 #endif
162 #ifdef EFBIG
163     case EFBIG: return "efbig";
164 #endif
165 #ifdef EHOSTDOWN
166     case EHOSTDOWN: return "ehostdown";
167 #endif
168 #ifdef EHOSTUNREACH
169     case EHOSTUNREACH: return "ehostunreach";
170 #endif
171 #if defined(EIDRM) && (!defined(EINPROGRESS) || (EIDRM != EINPROGRESS))
172     case EIDRM: return "eidrm";
173 #endif
174 #ifdef EILSEQ
175     case EILSEQ: return "eilseq";
176 #endif
177 #ifdef EINIT
178     case EINIT: return "einit";
179 #endif
180 #ifdef EINPROGRESS
181     case EINPROGRESS: return "einprogress";
182 #endif
183 #ifdef EINTR
184     case EINTR: return "eintr";
185 #endif
186 #ifdef EINVAL
187     case EINVAL: return "einval";
188 #endif
189 #ifdef EIO
190     case EIO: return "eio";
191 #endif
192 #ifdef EISCONN
193     case EISCONN: return "eisconn";
194 #endif
195 #ifdef EISDIR
196     case EISDIR: return "eisdir";
197 #endif
198 #ifdef EISNAME
199     case EISNAM: return "eisnam";
200 #endif
201 #ifdef ELBIN
202     case ELBIN: return "elbin";
203 #endif
204 #ifdef EL2HLT
205     case EL2HLT: return "el2hlt";
206 #endif
207 #ifdef EL2NSYNC
208     case EL2NSYNC: return "el2nsync";
209 #endif
210 #ifdef EL3HLT
211     case EL3HLT: return "el3hlt";
212 #endif
213 #ifdef EL3RST
214     case EL3RST: return "el3rst";
215 #endif
216 #ifdef ELIBACC
217     case ELIBACC: return "elibacc";
218 #endif
219 #ifdef ELIBBAD
220     case ELIBBAD: return "elibbad";
221 #endif
222 #ifdef ELIBEXEC
223     case ELIBEXEC: return "elibexec";
224 #endif
225 #ifdef ELIBMAX
226     case ELIBMAX: return "elibmax";
227 #endif
228 #ifdef ELIBSCN
229     case ELIBSCN: return "elibscn";
230 #endif
231 #ifdef ELNRNG
232     case ELNRNG: return "elnrng";
233 #endif
234 #if defined(ELOOP) && (!defined(ENOENT) || (ELOOP != ENOENT))
235     case ELOOP: return "eloop";
236 #endif
237 #ifdef EMFILE
238     case EMFILE: return "emfile";
239 #endif
240 #ifdef EMLINK
241     case EMLINK: return "emlink";
242 #endif
243 #ifdef EMSGSIZE
244     case EMSGSIZE: return "emsgsize";
245 #endif
246 #ifdef EMULTIHOP
247     case EMULTIHOP: return "emultihop";
248 #endif
249 #ifdef ENAMETOOLONG
250     case ENAMETOOLONG: return "enametoolong";
251 #endif
252 #ifdef ENAVAIL
253     case ENAVAIL: return "enavail";
254 #endif
255 #ifdef ENET
256     case ENET: return "enet";
257 #endif
258 #ifdef ENETDOWN
259     case ENETDOWN: return "enetdown";
260 #endif
261 #ifdef ENETRESET
262     case ENETRESET: return "enetreset";
263 #endif
264 #ifdef ENETUNREACH
265     case ENETUNREACH: return "enetunreach";
266 #endif
267 #ifdef ENFILE
268     case ENFILE: return "enfile";
269 #endif
270 #ifdef ENOANO
271     case ENOANO: return "enoano";
272 #endif
273 #if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR))
274     case ENOBUFS: return "enobufs";
275 #endif
276 #ifdef ENOCSI
277     case ENOCSI: return "enocsi";
278 #endif
279 #if defined(ENODATA) && (!defined(ECONNREFUSED) || (ENODATA != ECONNREFUSED))
280     case ENODATA: return "enodata";
281 #endif
282 #ifdef ENODEV
283     case ENODEV: return "enodev";
284 #endif
285 #ifdef ENOENT
286     case ENOENT: return "enoent";
287 #endif
288 #ifdef ENOEXEC
289     case ENOEXEC: return "enoexec";
290 #endif
291 #ifdef ENOLCK
292     case ENOLCK: return "enolck";
293 #endif
294 #ifdef ENOLINK
295     case ENOLINK: return "enolink";
296 #endif
297 #ifdef ENOMEM
298     case ENOMEM: return "enomem";
299 #endif
300 #ifdef ENOMSG
301     case ENOMSG: return "enomsg";
302 #endif
303 #ifdef ENONET
304     case ENONET: return "enonet";
305 #endif
306 #ifdef ENOPKG
307     case ENOPKG: return "enopkg";
308 #endif
309 #ifdef ENOPROTOOPT
310     case ENOPROTOOPT: return "enoprotoopt";
311 #endif
312 #ifdef ENOSPC
313     case ENOSPC: return "enospc";
314 #endif
315 #if defined(ENOSR) && (!defined(ENAMETOOLONG) || (ENAMETOOLONG != ENOSR))
316     case ENOSR: return "enosr";
317 #endif
318 #if defined(ENOSTR) && (!defined(ENOTTY) || (ENOTTY != ENOSTR))
319     case ENOSTR: return "enostr";
320 #endif
321 #ifdef ENOSYM
322     case ENOSYM: return "enosym";
323 #endif
324 #ifdef ENOSYS
325     case ENOSYS: return "enosys";
326 #endif
327 #ifdef ENOTBLK
328     case ENOTBLK: return "enotblk";
329 #endif
330 #ifdef ENOTCONN
331     case ENOTCONN: return "enotconn";
332 #endif
333 #ifdef ENOTDIR
334     case ENOTDIR: return "enotdir";
335 #endif
336 #if defined(ENOTEMPTY) && (!defined(EEXIST) || (ENOTEMPTY != EEXIST))
337     case ENOTEMPTY: return "enotempty";
338 #endif
339 #ifdef ENOTNAM
340     case ENOTNAM: return "enotnam";
341 #endif
342 #ifdef ENOTSOCK
343     case ENOTSOCK: return "enotsock";
344 #endif
345 #ifdef ENOTSUP
346     case ENOTSUP: return "enotsup";
347 #endif
348 #ifdef ENOTTY
349     case ENOTTY: return "enotty";
350 #endif
351 #ifdef ENOTUNIQ
352     case ENOTUNIQ: return "enotuniq";
353 #endif
354 #ifdef ENXIO
355     case ENXIO: return "enxio";
356 #endif
357 #if defined(EOPNOTSUPP) && (!defined(ENOTSUP) || (EOPNOTSUPP != ENOTSUP))
358     case EOPNOTSUPP: return "eopnotsupp";
359 #endif
360 #ifdef EOVERFLOW
361     case EOVERFLOW: return "eoverflow";
362 #endif
363 #ifdef EPERM
364     case EPERM: return "eperm";
365 #endif
366 #if defined(EPFNOSUPPORT) && (!defined(ENOLCK) || (ENOLCK != EPFNOSUPPORT))
367     case EPFNOSUPPORT: return "epfnosupport";
368 #endif
369 #ifdef EPIPE
370     case EPIPE: return "epipe";
371 #endif
372 #ifdef EPROCLIM
373     case EPROCLIM: return "eproclim";
374 #endif
375 #ifdef EPROCUNAVAIL
376     case EPROCUNAVAIL: return "eprocunavail";
377 #endif
378 #ifdef EPROGMISMATCH
379     case EPROGMISMATCH: return "eprogmismatch";
380 #endif
381 #ifdef EPROGUNAVAIL
382     case EPROGUNAVAIL: return "eprogunavail";
383 #endif
384 #ifdef EPROTO
385     case EPROTO: return "eproto";
386 #endif
387 #ifdef EPROTONOSUPPORT
388     case EPROTONOSUPPORT: return "eprotonosupport";
389 #endif
390 #ifdef EPROTOTYPE
391     case EPROTOTYPE: return "eprototype";
392 #endif
393 #ifdef ERANGE
394     case ERANGE: return "erange";
395 #endif
396 #if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED))
397     case EREFUSED: return "erefused";
398 #endif
399 #ifdef EREMCHG
400     case EREMCHG: return "eremchg";
401 #endif
402 #ifdef EREMDEV
403     case EREMDEV: return "eremdev";
404 #endif
405 #ifdef EREMOTE
406     case EREMOTE: return "eremote";
407 #endif
408 #ifdef EREMOTEIO
409     case EREMOTEIO: return "eremoteio";
410 #endif
411 #ifdef EREMOTERELEASE
412     case EREMOTERELEASE: return "eremoterelease";
413 #endif
414 #ifdef EROFS
415     case EROFS: return "erofs";
416 #endif
417 #ifdef ERPCMISMATCH
418     case ERPCMISMATCH: return "erpcmismatch";
419 #endif
420 #ifdef ERREMOTE
421     case ERREMOTE: return "erremote";
422 #endif
423 #ifdef ESHUTDOWN
424     case ESHUTDOWN: return "eshutdown";
425 #endif
426 #ifdef ESOCKTNOSUPPORT
427     case ESOCKTNOSUPPORT: return "esocktnosupport";
428 #endif
429 #ifdef ESPIPE
430     case ESPIPE: return "espipe";
431 #endif
432 #ifdef ESRCH
433     case ESRCH: return "esrch";
434 #endif
435 #ifdef ESRMNT
436     case ESRMNT: return "esrmnt";
437 #endif
438 #ifdef ESTALE
439     case ESTALE: return "estale";
440 #endif
441 #ifdef ESUCCESS
442     case ESUCCESS: return "esuccess";
443 #endif
444 #if defined(ETIME) && (!defined(ELOOP) || (ETIME != ELOOP))
445     case ETIME: return "etime";
446 #endif
447 #if defined(ETIMEDOUT) && (!defined(ENOSTR) || (ETIMEDOUT != ENOSTR)) && (!defined(EAGAIN) || (ETIMEDOUT != EAGAIN)) && (!defined(WSAETIMEDOUT) || (ETIMEDOUT != WSAETIMEDOUT))
448     case ETIMEDOUT: return "etimedout";
449 #endif
450 #ifdef ETOOMANYREFS
451     case ETOOMANYREFS: return "etoomanyrefs";
452 #endif
453 #ifdef ETXTBSY
454     case ETXTBSY: return "etxtbsy";
455 #endif
456 #ifdef EUCLEAN
457     case EUCLEAN: return "euclean";
458 #endif
459 #ifdef EUNATCH
460     case EUNATCH: return "eunatch";
461 #endif
462 #ifdef EUSERS
463     case EUSERS: return "eusers";
464 #endif
465 #ifdef EVERSION
466     case EVERSION: return "eversion";
467 #endif
468 #if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN)) && (!defined(WSAEWOULDBLOCK) || (EWOULDBLOCK != WSAEWOULDBLOCK))
469     case EWOULDBLOCK: return "ewouldblock";
470 #endif
471 #ifdef EXDEV
472     case EXDEV: return "exdev";
473 #endif
474 #ifdef EXFULL
475     case EXFULL: return "exfull";
476 #endif
477 #ifdef WSAEINTR
478     case WSAEINTR: return "eintr";
479 #endif
480 #ifdef WSAEBADF
481     case WSAEBADF: return "ebadf";
482 #endif
483 #ifdef WSAEACCES
484     case WSAEACCES: return "eacces";
485 #endif
486 #ifdef WSAEFAULT
487     case WSAEFAULT: return "efault";
488 #endif
489 #ifdef WSAEINVAL
490     case WSAEINVAL: return "einval";
491 #endif
492 #ifdef WSAEMFILE
493     case WSAEMFILE: return "emfile";
494 #endif
495 #ifdef WSAEWOULDBLOCK
496     case WSAEWOULDBLOCK: return "ewouldblock";
497 #endif
498 #ifdef WSAEINPROGRESS
499     case WSAEINPROGRESS: return "einprogress";
500 #endif
501 #ifdef WSAEALREADY
502     case WSAEALREADY: return "ealready";
503 #endif
504 #ifdef WSAENOTSOCK
505     case WSAENOTSOCK: return "enotsock";
506 #endif
507 #ifdef WSAEDESTADDRREQ
508     case WSAEDESTADDRREQ: return "edestaddrreq";
509 #endif
510 #ifdef WSAEMSGSIZE
511     case WSAEMSGSIZE: return "emsgsize";
512 #endif
513 #ifdef WSAEPROTOTYPE
514     case WSAEPROTOTYPE: return "eprototype";
515 #endif
516 #ifdef WSAENOPROTOOPT
517     case WSAENOPROTOOPT: return "enoprotoopt";
518 #endif
519 #ifdef WSAEPROTONOSUPPORT
520     case WSAEPROTONOSUPPORT: return "eprotonosupport";
521 #endif
522 #ifdef WSAESOCKTNOSUPPORT
523     case WSAESOCKTNOSUPPORT: return "esocktnosupport";
524 #endif
525 #ifdef WSAEOPNOTSUPP
526     case WSAEOPNOTSUPP: return "eopnotsupp";
527 #endif
528 #ifdef WSAEPFNOSUPPORT
529     case WSAEPFNOSUPPORT: return "epfnosupport";
530 #endif
531 #ifdef WSAEAFNOSUPPORT
532     case WSAEAFNOSUPPORT: return "eafnosupport";
533 #endif
534 #ifdef WSAEADDRINUSE
535     case WSAEADDRINUSE: return "eaddrinuse";
536 #endif
537 #ifdef WSAEADDRNOTAVAIL
538     case WSAEADDRNOTAVAIL: return "eaddrnotavail";
539 #endif
540 #ifdef WSAENETDOWN
541     case WSAENETDOWN: return "enetdown";
542 #endif
543 #ifdef WSAENETUNREACH
544     case WSAENETUNREACH: return "enetunreach";
545 #endif
546 #ifdef WSAENETRESET
547     case WSAENETRESET: return "enetreset";
548 #endif
549 #ifdef WSAECONNABORTED
550     case WSAECONNABORTED: return "econnaborted";
551 #endif
552 #ifdef WSAECONNRESET
553     case WSAECONNRESET: return "econnreset";
554 #endif
555 #ifdef WSAENOBUFS
556     case WSAENOBUFS: return "enobufs";
557 #endif
558 #ifdef WSAEISCONN
559     case WSAEISCONN: return "eisconn";
560 #endif
561 #ifdef WSAENOTCONN
562     case WSAENOTCONN: return "enotconn";
563 #endif
564 #ifdef WSAESHUTDOWN
565     case WSAESHUTDOWN: return "eshutdown";
566 #endif
567 #ifdef WSAETOOMANYREFS
568     case WSAETOOMANYREFS: return "etoomanyrefs";
569 #endif
570 #ifdef WSAETIMEDOUT
571     case WSAETIMEDOUT: return "etimedout";
572 #endif
573 #ifdef WSAECONNREFUSED
574     case WSAECONNREFUSED: return "econnrefused";
575 #endif
576 #ifdef WSAELOOP
577     case WSAELOOP: return "eloop";
578 #endif
579 #ifdef WSAENAMETOOLONG
580     case WSAENAMETOOLONG: return "enametoolong";
581 #endif
582 #ifdef WSAEHOSTDOWN
583     case WSAEHOSTDOWN: return "ehostdown";
584 #endif
585 #ifdef WSAEHOSTUNREACH
586     case WSAEHOSTUNREACH: return "ehostunreach";
587 #endif
588 #ifdef WSAENOTEMPTY
589     case WSAENOTEMPTY: return "enotempty";
590 #endif
591 #ifdef WSAEPROCLIM
592     case WSAEPROCLIM: return "eproclim";
593 #endif
594 #ifdef WSAEUSERS
595     case WSAEUSERS: return "eusers";
596 #endif
597 #ifdef WSAEDQUOT
598     case WSAEDQUOT: return "edquot";
599 #endif
600 #ifdef WSAESTALE
601     case WSAESTALE: return "estale";
602 #endif
603 #ifdef WSAEREMOTE
604     case WSAEREMOTE: return "eremote";
605 #endif
606 #ifdef WSASYSNOTREADY
607     case WSASYSNOTREADY: return "sysnotready";
608 #endif
609 #ifdef WSAVERNOTSUPPORTED
610     case WSAVERNOTSUPPORTED: return "vernotsupported";
611 #endif
612 #ifdef WSANOTINITIALISED
613     case WSANOTINITIALISED: return "notinitialised";
614 #endif
615 #ifdef WSAEDISCON
616     case WSAEDISCON: return "ediscon";
617 #endif
618 #ifdef WSAENOMORE
619     case WSAENOMORE: return "enomore";
620 #endif
621 #ifdef WSAECANCELLED
622     case WSAECANCELLED: return "ecancelled";
623 #endif
624 #ifdef WSAEINVALIDPROCTABLE
625     case WSAEINVALIDPROCTABLE: return "einvalidproctable";
626 #endif
627 #ifdef WSAEINVALIDPROVIDER
628     case WSAEINVALIDPROVIDER: return "einvalidprovider";
629 #endif
630 #ifdef WSAEPROVIDERFAILEDINIT
631       /* You could get this if SYSTEMROOT env variable is set incorrectly */
632     case WSAEPROVIDERFAILEDINIT: return "eproviderfailedinit";
633 #endif
634 #ifdef WSASYSCALLFAILURE
635     case WSASYSCALLFAILURE: return "syscallfailure";
636 #endif
637 #ifdef WSASERVICE_NOT_FOUND
638     case WSASERVICE_NOT_FOUND: return "service_not_found";
639 #endif
640 #ifdef WSATYPE_NOT_FOUND
641     case WSATYPE_NOT_FOUND: return "type_not_found";
642 #endif
643 #ifdef WSA_E_NO_MORE
644     case WSA_E_NO_MORE: return "e_no_more";
645 #endif
646 #ifdef WSA_E_CANCELLED
647     case WSA_E_CANCELLED: return "e_cancelled";
648 #endif
649     }
650     return "unknown";
651 }
652