• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Errno module */
2 
3 // Need limited C API version 3.13 for Py_mod_gil
4 #include "pyconfig.h"   // Py_GIL_DISABLED
5 #ifndef Py_GIL_DISABLED
6 #  define Py_LIMITED_API 0x030d0000
7 #endif
8 
9 #include "Python.h"
10 #include <errno.h>                // EPIPE
11 
12 /* Windows socket errors (WSA*)  */
13 #ifdef MS_WINDOWS
14 #  ifndef WIN32_LEAN_AND_MEAN
15 #    define WIN32_LEAN_AND_MEAN
16 #  endif
17 #  include <windows.h>
18 
19    // The following constants were added to errno.h in VS2010 but have
20    // preferred WSA equivalents.
21 #  undef EADDRINUSE
22 #  undef EADDRNOTAVAIL
23 #  undef EAFNOSUPPORT
24 #  undef EALREADY
25 #  undef ECONNABORTED
26 #  undef ECONNREFUSED
27 #  undef ECONNRESET
28 #  undef EDESTADDRREQ
29 #  undef EHOSTUNREACH
30 #  undef EINPROGRESS
31 #  undef EISCONN
32 #  undef ELOOP
33 #  undef EMSGSIZE
34 #  undef ENETDOWN
35 #  undef ENETRESET
36 #  undef ENETUNREACH
37 #  undef ENOBUFS
38 #  undef ENOPROTOOPT
39 #  undef ENOTCONN
40 #  undef ENOTSOCK
41 #  undef EOPNOTSUPP
42 #  undef EPROTONOSUPPORT
43 #  undef EPROTOTYPE
44 #  undef ETIMEDOUT
45 #  undef EWOULDBLOCK
46 #endif
47 
48 /*
49  * Pull in the system error definitions
50  */
51 
52 static PyMethodDef errno_methods[] = {
53     {NULL,              NULL}
54 };
55 
56 /* Helper function doing the dictionary inserting */
57 
58 static int
_add_errcode(PyObject * module_dict,PyObject * error_dict,const char * name_str,int code_int)59 _add_errcode(PyObject *module_dict, PyObject *error_dict, const char *name_str, int code_int)
60 {
61     PyObject *name = PyUnicode_FromString(name_str);
62     if (!name) {
63         return -1;
64     }
65 
66     PyObject *code = PyLong_FromLong(code_int);
67     if (!code) {
68         Py_DECREF(name);
69         return -1;
70     }
71 
72     int ret = -1;
73     /* insert in modules dict */
74     if (PyDict_SetItem(module_dict, name, code) < 0) {
75         goto end;
76     }
77     /* insert in errorcode dict */
78     if (PyDict_SetItem(error_dict, code, name) < 0) {
79         goto end;
80     }
81     ret = 0;
82 end:
83     Py_DECREF(name);
84     Py_DECREF(code);
85     return ret;
86 }
87 
88 static int
errno_exec(PyObject * module)89 errno_exec(PyObject *module)
90 {
91     PyObject *module_dict = PyModule_GetDict(module);  // Borrowed ref.
92     if (module_dict == NULL) {
93         return -1;
94     }
95     PyObject *error_dict = PyDict_New();
96     if (error_dict == NULL) {
97         return -1;
98     }
99     if (PyDict_SetItemString(module_dict, "errorcode", error_dict) < 0) {
100         Py_DECREF(error_dict);
101         return -1;
102     }
103 
104 /* Macro so I don't have to edit each and every line below... */
105 #define add_errcode(name, code, comment)                               \
106     do {                                                               \
107         if (_add_errcode(module_dict, error_dict, name, code) < 0) {   \
108             Py_DECREF(error_dict);                                     \
109             return -1;                                                 \
110         }                                                              \
111     } while (0);
112 
113     /*
114      * The names and comments are borrowed from linux/include/errno.h,
115      * which should be pretty all-inclusive.  However, the Solaris specific
116      * names and comments are borrowed from sys/errno.h in Solaris.
117      * MacOSX specific names and comments are borrowed from sys/errno.h in
118      * MacOSX.
119      */
120 
121 #ifdef ENODEV
122     add_errcode("ENODEV", ENODEV, "No such device");
123 #endif
124 #ifdef ENOCSI
125     add_errcode("ENOCSI", ENOCSI, "No CSI structure available");
126 #endif
127 #ifdef EHOSTUNREACH
128     add_errcode("EHOSTUNREACH", EHOSTUNREACH, "No route to host");
129 #else
130 #ifdef WSAEHOSTUNREACH
131     add_errcode("EHOSTUNREACH", WSAEHOSTUNREACH, "No route to host");
132 #endif
133 #endif
134 #ifdef ENOMSG
135     add_errcode("ENOMSG", ENOMSG, "No message of desired type");
136 #endif
137 #ifdef EUCLEAN
138     add_errcode("EUCLEAN", EUCLEAN, "Structure needs cleaning");
139 #endif
140 #ifdef EL2NSYNC
141     add_errcode("EL2NSYNC", EL2NSYNC, "Level 2 not synchronized");
142 #endif
143 #ifdef EL2HLT
144     add_errcode("EL2HLT", EL2HLT, "Level 2 halted");
145 #endif
146 #ifdef ENODATA
147     add_errcode("ENODATA", ENODATA, "No data available");
148 #endif
149 #ifdef ENOTBLK
150     add_errcode("ENOTBLK", ENOTBLK, "Block device required");
151 #endif
152 #ifdef ENOSYS
153     add_errcode("ENOSYS", ENOSYS, "Function not implemented");
154 #endif
155 #ifdef EPIPE
156     add_errcode("EPIPE", EPIPE, "Broken pipe");
157 #endif
158 #ifdef EINVAL
159     add_errcode("EINVAL", EINVAL, "Invalid argument");
160 #else
161 #ifdef WSAEINVAL
162     add_errcode("EINVAL", WSAEINVAL, "Invalid argument");
163 #endif
164 #endif
165 #ifdef EOVERFLOW
166     add_errcode("EOVERFLOW", EOVERFLOW, "Value too large for defined data type");
167 #endif
168 #ifdef EADV
169     add_errcode("EADV", EADV, "Advertise error");
170 #endif
171 #ifdef EINTR
172     add_errcode("EINTR", EINTR, "Interrupted system call");
173 #else
174 #ifdef WSAEINTR
175     add_errcode("EINTR", WSAEINTR, "Interrupted system call");
176 #endif
177 #endif
178 #ifdef EUSERS
179     add_errcode("EUSERS", EUSERS, "Too many users");
180 #else
181 #ifdef WSAEUSERS
182     add_errcode("EUSERS", WSAEUSERS, "Too many users");
183 #endif
184 #endif
185 #ifdef ENOTEMPTY
186     add_errcode("ENOTEMPTY", ENOTEMPTY, "Directory not empty");
187 #else
188 #ifdef WSAENOTEMPTY
189     add_errcode("ENOTEMPTY", WSAENOTEMPTY, "Directory not empty");
190 #endif
191 #endif
192 #ifdef ENOBUFS
193     add_errcode("ENOBUFS", ENOBUFS, "No buffer space available");
194 #else
195 #ifdef WSAENOBUFS
196     add_errcode("ENOBUFS", WSAENOBUFS, "No buffer space available");
197 #endif
198 #endif
199 #ifdef EPROTO
200     add_errcode("EPROTO", EPROTO, "Protocol error");
201 #endif
202 #ifdef EREMOTE
203     add_errcode("EREMOTE", EREMOTE, "Object is remote");
204 #else
205 #ifdef WSAEREMOTE
206     add_errcode("EREMOTE", WSAEREMOTE, "Object is remote");
207 #endif
208 #endif
209 #ifdef ENAVAIL
210     add_errcode("ENAVAIL", ENAVAIL, "No XENIX semaphores available");
211 #endif
212 #ifdef ECHILD
213     add_errcode("ECHILD", ECHILD, "No child processes");
214 #endif
215 #ifdef ELOOP
216     add_errcode("ELOOP", ELOOP, "Too many symbolic links encountered");
217 #else
218 #ifdef WSAELOOP
219     add_errcode("ELOOP", WSAELOOP, "Too many symbolic links encountered");
220 #endif
221 #endif
222 #ifdef EXDEV
223     add_errcode("EXDEV", EXDEV, "Cross-device link");
224 #endif
225 #ifdef E2BIG
226     add_errcode("E2BIG", E2BIG, "Arg list too long");
227 #endif
228 #ifdef ESRCH
229     add_errcode("ESRCH", ESRCH, "No such process");
230 #endif
231 #ifdef EMSGSIZE
232     add_errcode("EMSGSIZE", EMSGSIZE, "Message too long");
233 #else
234 #ifdef WSAEMSGSIZE
235     add_errcode("EMSGSIZE", WSAEMSGSIZE, "Message too long");
236 #endif
237 #endif
238 #ifdef EAFNOSUPPORT
239     add_errcode("EAFNOSUPPORT", EAFNOSUPPORT, "Address family not supported by protocol");
240 #else
241 #ifdef WSAEAFNOSUPPORT
242     add_errcode("EAFNOSUPPORT", WSAEAFNOSUPPORT, "Address family not supported by protocol");
243 #endif
244 #endif
245 #ifdef EBADR
246     add_errcode("EBADR", EBADR, "Invalid request descriptor");
247 #endif
248 #ifdef EHOSTDOWN
249     add_errcode("EHOSTDOWN", EHOSTDOWN, "Host is down");
250 #else
251 #ifdef WSAEHOSTDOWN
252     add_errcode("EHOSTDOWN", WSAEHOSTDOWN, "Host is down");
253 #endif
254 #endif
255 #ifdef EPFNOSUPPORT
256     add_errcode("EPFNOSUPPORT", EPFNOSUPPORT, "Protocol family not supported");
257 #else
258 #ifdef WSAEPFNOSUPPORT
259     add_errcode("EPFNOSUPPORT", WSAEPFNOSUPPORT, "Protocol family not supported");
260 #endif
261 #endif
262 #ifdef ENOPROTOOPT
263     add_errcode("ENOPROTOOPT", ENOPROTOOPT, "Protocol not available");
264 #else
265 #ifdef WSAENOPROTOOPT
266     add_errcode("ENOPROTOOPT", WSAENOPROTOOPT, "Protocol not available");
267 #endif
268 #endif
269 #ifdef EBUSY
270     add_errcode("EBUSY", EBUSY, "Device or resource busy");
271 #endif
272 #ifdef EWOULDBLOCK
273     add_errcode("EWOULDBLOCK", EWOULDBLOCK, "Operation would block");
274 #else
275 #ifdef WSAEWOULDBLOCK
276     add_errcode("EWOULDBLOCK", WSAEWOULDBLOCK, "Operation would block");
277 #endif
278 #endif
279 #ifdef EBADFD
280     add_errcode("EBADFD", EBADFD, "File descriptor in bad state");
281 #endif
282 #ifdef EDOTDOT
283     add_errcode("EDOTDOT", EDOTDOT, "RFS specific error");
284 #endif
285 #ifdef EISCONN
286     add_errcode("EISCONN", EISCONN, "Transport endpoint is already connected");
287 #else
288 #ifdef WSAEISCONN
289     add_errcode("EISCONN", WSAEISCONN, "Transport endpoint is already connected");
290 #endif
291 #endif
292 #ifdef ENOANO
293     add_errcode("ENOANO", ENOANO, "No anode");
294 #endif
295 #if defined(__wasi__) && !defined(ESHUTDOWN)
296     // WASI SDK 16 does not have ESHUTDOWN, shutdown results in EPIPE.
297     #define ESHUTDOWN EPIPE
298 #endif
299 #ifdef ESHUTDOWN
300     add_errcode("ESHUTDOWN", ESHUTDOWN, "Cannot send after transport endpoint shutdown");
301 #else
302 #ifdef WSAESHUTDOWN
303     add_errcode("ESHUTDOWN", WSAESHUTDOWN, "Cannot send after transport endpoint shutdown");
304 #endif
305 #endif
306 #ifdef ECHRNG
307     add_errcode("ECHRNG", ECHRNG, "Channel number out of range");
308 #endif
309 #ifdef ELIBBAD
310     add_errcode("ELIBBAD", ELIBBAD, "Accessing a corrupted shared library");
311 #endif
312 #ifdef ENONET
313     add_errcode("ENONET", ENONET, "Machine is not on the network");
314 #endif
315 #ifdef EBADE
316     add_errcode("EBADE", EBADE, "Invalid exchange");
317 #endif
318 #ifdef EBADF
319     add_errcode("EBADF", EBADF, "Bad file number");
320 #else
321 #ifdef WSAEBADF
322     add_errcode("EBADF", WSAEBADF, "Bad file number");
323 #endif
324 #endif
325 #ifdef EMULTIHOP
326     add_errcode("EMULTIHOP", EMULTIHOP, "Multihop attempted");
327 #endif
328 #ifdef EIO
329     add_errcode("EIO", EIO, "I/O error");
330 #endif
331 #ifdef EUNATCH
332     add_errcode("EUNATCH", EUNATCH, "Protocol driver not attached");
333 #endif
334 #ifdef EPROTOTYPE
335     add_errcode("EPROTOTYPE", EPROTOTYPE, "Protocol wrong type for socket");
336 #else
337 #ifdef WSAEPROTOTYPE
338     add_errcode("EPROTOTYPE", WSAEPROTOTYPE, "Protocol wrong type for socket");
339 #endif
340 #endif
341 #ifdef ENOSPC
342     add_errcode("ENOSPC", ENOSPC, "No space left on device");
343 #endif
344 #ifdef ENOEXEC
345     add_errcode("ENOEXEC", ENOEXEC, "Exec format error");
346 #endif
347 #ifdef EALREADY
348     add_errcode("EALREADY", EALREADY, "Operation already in progress");
349 #else
350 #ifdef WSAEALREADY
351     add_errcode("EALREADY", WSAEALREADY, "Operation already in progress");
352 #endif
353 #endif
354 #ifdef ENETDOWN
355     add_errcode("ENETDOWN", ENETDOWN, "Network is down");
356 #else
357 #ifdef WSAENETDOWN
358     add_errcode("ENETDOWN", WSAENETDOWN, "Network is down");
359 #endif
360 #endif
361 #ifdef ENOTNAM
362     add_errcode("ENOTNAM", ENOTNAM, "Not a XENIX named type file");
363 #endif
364 #ifdef EACCES
365     add_errcode("EACCES", EACCES, "Permission denied");
366 #else
367 #ifdef WSAEACCES
368     add_errcode("EACCES", WSAEACCES, "Permission denied");
369 #endif
370 #endif
371 #ifdef ELNRNG
372     add_errcode("ELNRNG", ELNRNG, "Link number out of range");
373 #endif
374 #ifdef EILSEQ
375     add_errcode("EILSEQ", EILSEQ, "Illegal byte sequence");
376 #endif
377 #ifdef ENOTDIR
378     add_errcode("ENOTDIR", ENOTDIR, "Not a directory");
379 #endif
380 #ifdef ENOTUNIQ
381     add_errcode("ENOTUNIQ", ENOTUNIQ, "Name not unique on network");
382 #endif
383 #ifdef EPERM
384     add_errcode("EPERM", EPERM, "Operation not permitted");
385 #endif
386 #ifdef EDOM
387     add_errcode("EDOM", EDOM, "Math argument out of domain of func");
388 #endif
389 #ifdef EXFULL
390     add_errcode("EXFULL", EXFULL, "Exchange full");
391 #endif
392 #ifdef ECONNREFUSED
393     add_errcode("ECONNREFUSED", ECONNREFUSED, "Connection refused");
394 #else
395 #ifdef WSAECONNREFUSED
396     add_errcode("ECONNREFUSED", WSAECONNREFUSED, "Connection refused");
397 #endif
398 #endif
399 #ifdef EISDIR
400     add_errcode("EISDIR", EISDIR, "Is a directory");
401 #endif
402 #ifdef EPROTONOSUPPORT
403     add_errcode("EPROTONOSUPPORT", EPROTONOSUPPORT, "Protocol not supported");
404 #else
405 #ifdef WSAEPROTONOSUPPORT
406     add_errcode("EPROTONOSUPPORT", WSAEPROTONOSUPPORT, "Protocol not supported");
407 #endif
408 #endif
409 #ifdef EROFS
410     add_errcode("EROFS", EROFS, "Read-only file system");
411 #endif
412 #ifdef EADDRNOTAVAIL
413     add_errcode("EADDRNOTAVAIL", EADDRNOTAVAIL, "Cannot assign requested address");
414 #else
415 #ifdef WSAEADDRNOTAVAIL
416     add_errcode("EADDRNOTAVAIL", WSAEADDRNOTAVAIL, "Cannot assign requested address");
417 #endif
418 #endif
419 #ifdef EIDRM
420     add_errcode("EIDRM", EIDRM, "Identifier removed");
421 #endif
422 #ifdef ECOMM
423     add_errcode("ECOMM", ECOMM, "Communication error on send");
424 #endif
425 #ifdef ESRMNT
426     add_errcode("ESRMNT", ESRMNT, "Srmount error");
427 #endif
428 #ifdef EREMOTEIO
429     add_errcode("EREMOTEIO", EREMOTEIO, "Remote I/O error");
430 #endif
431 #ifdef EL3RST
432     add_errcode("EL3RST", EL3RST, "Level 3 reset");
433 #endif
434 #ifdef EBADMSG
435     add_errcode("EBADMSG", EBADMSG, "Not a data message");
436 #endif
437 #ifdef ENFILE
438     add_errcode("ENFILE", ENFILE, "File table overflow");
439 #endif
440 #ifdef ELIBMAX
441     add_errcode("ELIBMAX", ELIBMAX, "Attempting to link in too many shared libraries");
442 #endif
443 #ifdef ESPIPE
444     add_errcode("ESPIPE", ESPIPE, "Illegal seek");
445 #endif
446 #ifdef ENOLINK
447     add_errcode("ENOLINK", ENOLINK, "Link has been severed");
448 #endif
449 #ifdef ENETRESET
450     add_errcode("ENETRESET", ENETRESET, "Network dropped connection because of reset");
451 #else
452 #ifdef WSAENETRESET
453     add_errcode("ENETRESET", WSAENETRESET, "Network dropped connection because of reset");
454 #endif
455 #endif
456 #ifdef ETIMEDOUT
457     add_errcode("ETIMEDOUT", ETIMEDOUT, "Connection timed out");
458 #else
459 #ifdef WSAETIMEDOUT
460     add_errcode("ETIMEDOUT", WSAETIMEDOUT, "Connection timed out");
461 #endif
462 #endif
463 #ifdef ENOENT
464     add_errcode("ENOENT", ENOENT, "No such file or directory");
465 #endif
466 #ifdef EEXIST
467     add_errcode("EEXIST", EEXIST, "File exists");
468 #endif
469 #ifdef EDQUOT
470     add_errcode("EDQUOT", EDQUOT, "Quota exceeded");
471 #else
472 #ifdef WSAEDQUOT
473     add_errcode("EDQUOT", WSAEDQUOT, "Quota exceeded");
474 #endif
475 #endif
476 #ifdef ENOSTR
477     add_errcode("ENOSTR", ENOSTR, "Device not a stream");
478 #endif
479 #ifdef EBADSLT
480     add_errcode("EBADSLT", EBADSLT, "Invalid slot");
481 #endif
482 #ifdef EBADRQC
483     add_errcode("EBADRQC", EBADRQC, "Invalid request code");
484 #endif
485 #ifdef ELIBACC
486     add_errcode("ELIBACC", ELIBACC, "Can not access a needed shared library");
487 #endif
488 #ifdef EFAULT
489     add_errcode("EFAULT", EFAULT, "Bad address");
490 #else
491 #ifdef WSAEFAULT
492     add_errcode("EFAULT", WSAEFAULT, "Bad address");
493 #endif
494 #endif
495 #ifdef EFBIG
496     add_errcode("EFBIG", EFBIG, "File too large");
497 #endif
498 #ifdef EDEADLK
499     add_errcode("EDEADLK", EDEADLK, "Resource deadlock would occur");
500 #endif
501 #ifdef ENOTCONN
502     add_errcode("ENOTCONN", ENOTCONN, "Transport endpoint is not connected");
503 #else
504 #ifdef WSAENOTCONN
505     add_errcode("ENOTCONN", WSAENOTCONN, "Transport endpoint is not connected");
506 #endif
507 #endif
508 #ifdef EDESTADDRREQ
509     add_errcode("EDESTADDRREQ", EDESTADDRREQ, "Destination address required");
510 #else
511 #ifdef WSAEDESTADDRREQ
512     add_errcode("EDESTADDRREQ", WSAEDESTADDRREQ, "Destination address required");
513 #endif
514 #endif
515 #ifdef ELIBSCN
516     add_errcode("ELIBSCN", ELIBSCN, ".lib section in a.out corrupted");
517 #endif
518 #ifdef ENOLCK
519     add_errcode("ENOLCK", ENOLCK, "No record locks available");
520 #endif
521 #ifdef EISNAM
522     add_errcode("EISNAM", EISNAM, "Is a named type file");
523 #endif
524 #ifdef ECONNABORTED
525     add_errcode("ECONNABORTED", ECONNABORTED, "Software caused connection abort");
526 #else
527 #ifdef WSAECONNABORTED
528     add_errcode("ECONNABORTED", WSAECONNABORTED, "Software caused connection abort");
529 #endif
530 #endif
531 #ifdef ENETUNREACH
532     add_errcode("ENETUNREACH", ENETUNREACH, "Network is unreachable");
533 #else
534 #ifdef WSAENETUNREACH
535     add_errcode("ENETUNREACH", WSAENETUNREACH, "Network is unreachable");
536 #endif
537 #endif
538 #ifdef ESTALE
539     add_errcode("ESTALE", ESTALE, "Stale NFS file handle");
540 #else
541 #ifdef WSAESTALE
542     add_errcode("ESTALE", WSAESTALE, "Stale NFS file handle");
543 #endif
544 #endif
545 #ifdef ENOSR
546     add_errcode("ENOSR", ENOSR, "Out of streams resources");
547 #endif
548 #ifdef ENOMEM
549     add_errcode("ENOMEM", ENOMEM, "Out of memory");
550 #endif
551 #ifdef ENOTSOCK
552     add_errcode("ENOTSOCK", ENOTSOCK, "Socket operation on non-socket");
553 #else
554 #ifdef WSAENOTSOCK
555     add_errcode("ENOTSOCK", WSAENOTSOCK, "Socket operation on non-socket");
556 #endif
557 #endif
558 #ifdef ESTRPIPE
559     add_errcode("ESTRPIPE", ESTRPIPE, "Streams pipe error");
560 #endif
561 #ifdef EMLINK
562     add_errcode("EMLINK", EMLINK, "Too many links");
563 #endif
564 #ifdef ERANGE
565     add_errcode("ERANGE", ERANGE, "Math result not representable");
566 #endif
567 #ifdef ELIBEXEC
568     add_errcode("ELIBEXEC", ELIBEXEC, "Cannot exec a shared library directly");
569 #endif
570 #ifdef EL3HLT
571     add_errcode("EL3HLT", EL3HLT, "Level 3 halted");
572 #endif
573 #ifdef ECONNRESET
574     add_errcode("ECONNRESET", ECONNRESET, "Connection reset by peer");
575 #else
576 #ifdef WSAECONNRESET
577     add_errcode("ECONNRESET", WSAECONNRESET, "Connection reset by peer");
578 #endif
579 #endif
580 #ifdef EADDRINUSE
581     add_errcode("EADDRINUSE", EADDRINUSE, "Address already in use");
582 #else
583 #ifdef WSAEADDRINUSE
584     add_errcode("EADDRINUSE", WSAEADDRINUSE, "Address already in use");
585 #endif
586 #endif
587 #ifdef EOPNOTSUPP
588     add_errcode("EOPNOTSUPP", EOPNOTSUPP, "Operation not supported on transport endpoint");
589 #else
590 #ifdef WSAEOPNOTSUPP
591     add_errcode("EOPNOTSUPP", WSAEOPNOTSUPP, "Operation not supported on transport endpoint");
592 #endif
593 #endif
594 #ifdef EREMCHG
595     add_errcode("EREMCHG", EREMCHG, "Remote address changed");
596 #endif
597 #ifdef EAGAIN
598     add_errcode("EAGAIN", EAGAIN, "Try again");
599 #endif
600 #ifdef ENAMETOOLONG
601     add_errcode("ENAMETOOLONG", ENAMETOOLONG, "File name too long");
602 #else
603 #ifdef WSAENAMETOOLONG
604     add_errcode("ENAMETOOLONG", WSAENAMETOOLONG, "File name too long");
605 #endif
606 #endif
607 #ifdef ENOTTY
608     add_errcode("ENOTTY", ENOTTY, "Not a typewriter");
609 #endif
610 #ifdef ERESTART
611     add_errcode("ERESTART", ERESTART, "Interrupted system call should be restarted");
612 #endif
613 #ifdef ESOCKTNOSUPPORT
614     add_errcode("ESOCKTNOSUPPORT", ESOCKTNOSUPPORT, "Socket type not supported");
615 #else
616 #ifdef WSAESOCKTNOSUPPORT
617     add_errcode("ESOCKTNOSUPPORT", WSAESOCKTNOSUPPORT, "Socket type not supported");
618 #endif
619 #endif
620 #ifdef ETIME
621     add_errcode("ETIME", ETIME, "Timer expired");
622 #endif
623 #ifdef EBFONT
624     add_errcode("EBFONT", EBFONT, "Bad font file format");
625 #endif
626 #ifdef EDEADLOCK
627     add_errcode("EDEADLOCK", EDEADLOCK, "Error EDEADLOCK");
628 #endif
629 #ifdef ETOOMANYREFS
630     add_errcode("ETOOMANYREFS", ETOOMANYREFS, "Too many references: cannot splice");
631 #else
632 #ifdef WSAETOOMANYREFS
633     add_errcode("ETOOMANYREFS", WSAETOOMANYREFS, "Too many references: cannot splice");
634 #endif
635 #endif
636 #ifdef EMFILE
637     add_errcode("EMFILE", EMFILE, "Too many open files");
638 #else
639 #ifdef WSAEMFILE
640     add_errcode("EMFILE", WSAEMFILE, "Too many open files");
641 #endif
642 #endif
643 #ifdef ETXTBSY
644     add_errcode("ETXTBSY", ETXTBSY, "Text file busy");
645 #endif
646 #ifdef EINPROGRESS
647     add_errcode("EINPROGRESS", EINPROGRESS, "Operation now in progress");
648 #else
649 #ifdef WSAEINPROGRESS
650     add_errcode("EINPROGRESS", WSAEINPROGRESS, "Operation now in progress");
651 #endif
652 #endif
653 #ifdef ENXIO
654     add_errcode("ENXIO", ENXIO, "No such device or address");
655 #endif
656 #ifdef ENOPKG
657     add_errcode("ENOPKG", ENOPKG, "Package not installed");
658 #endif
659 #ifdef WSASY
660     add_errcode("WSASY", WSASY, "Error WSASY");
661 #endif
662 #ifdef WSAEHOSTDOWN
663     add_errcode("WSAEHOSTDOWN", WSAEHOSTDOWN, "Host is down");
664 #endif
665 #ifdef WSAENETDOWN
666     add_errcode("WSAENETDOWN", WSAENETDOWN, "Network is down");
667 #endif
668 #ifdef WSAENOTSOCK
669     add_errcode("WSAENOTSOCK", WSAENOTSOCK, "Socket operation on non-socket");
670 #endif
671 #ifdef WSAEHOSTUNREACH
672     add_errcode("WSAEHOSTUNREACH", WSAEHOSTUNREACH, "No route to host");
673 #endif
674 #ifdef WSAELOOP
675     add_errcode("WSAELOOP", WSAELOOP, "Too many symbolic links encountered");
676 #endif
677 #ifdef WSAEMFILE
678     add_errcode("WSAEMFILE", WSAEMFILE, "Too many open files");
679 #endif
680 #ifdef WSAESTALE
681     add_errcode("WSAESTALE", WSAESTALE, "Stale NFS file handle");
682 #endif
683 #ifdef WSAVERNOTSUPPORTED
684     add_errcode("WSAVERNOTSUPPORTED", WSAVERNOTSUPPORTED, "Error WSAVERNOTSUPPORTED");
685 #endif
686 #ifdef WSAENETUNREACH
687     add_errcode("WSAENETUNREACH", WSAENETUNREACH, "Network is unreachable");
688 #endif
689 #ifdef WSAEPROCLIM
690     add_errcode("WSAEPROCLIM", WSAEPROCLIM, "Error WSAEPROCLIM");
691 #endif
692 #ifdef WSAEFAULT
693     add_errcode("WSAEFAULT", WSAEFAULT, "Bad address");
694 #endif
695 #ifdef WSANOTINITIALISED
696     add_errcode("WSANOTINITIALISED", WSANOTINITIALISED, "Error WSANOTINITIALISED");
697 #endif
698 #ifdef WSAEUSERS
699     add_errcode("WSAEUSERS", WSAEUSERS, "Too many users");
700 #endif
701 #ifdef WSAMAKEASYNCREPL
702     add_errcode("WSAMAKEASYNCREPL", WSAMAKEASYNCREPL, "Error WSAMAKEASYNCREPL");
703 #endif
704 #ifdef WSAENOPROTOOPT
705     add_errcode("WSAENOPROTOOPT", WSAENOPROTOOPT, "Protocol not available");
706 #endif
707 #ifdef WSAECONNABORTED
708     add_errcode("WSAECONNABORTED", WSAECONNABORTED, "Software caused connection abort");
709 #endif
710 #ifdef WSAENAMETOOLONG
711     add_errcode("WSAENAMETOOLONG", WSAENAMETOOLONG, "File name too long");
712 #endif
713 #ifdef WSAENOTEMPTY
714     add_errcode("WSAENOTEMPTY", WSAENOTEMPTY, "Directory not empty");
715 #endif
716 #ifdef WSAESHUTDOWN
717     add_errcode("WSAESHUTDOWN", WSAESHUTDOWN, "Cannot send after transport endpoint shutdown");
718 #endif
719 #ifdef WSAEAFNOSUPPORT
720     add_errcode("WSAEAFNOSUPPORT", WSAEAFNOSUPPORT, "Address family not supported by protocol");
721 #endif
722 #ifdef WSAETOOMANYREFS
723     add_errcode("WSAETOOMANYREFS", WSAETOOMANYREFS, "Too many references: cannot splice");
724 #endif
725 #ifdef WSAEACCES
726     add_errcode("WSAEACCES", WSAEACCES, "Permission denied");
727 #endif
728 #ifdef WSATR
729     add_errcode("WSATR", WSATR, "Error WSATR");
730 #endif
731 #ifdef WSABASEERR
732     add_errcode("WSABASEERR", WSABASEERR, "Error WSABASEERR");
733 #endif
734 #ifdef WSADESCRIPTIO
735     add_errcode("WSADESCRIPTIO", WSADESCRIPTIO, "Error WSADESCRIPTIO");
736 #endif
737 #ifdef WSAEMSGSIZE
738     add_errcode("WSAEMSGSIZE", WSAEMSGSIZE, "Message too long");
739 #endif
740 #ifdef WSAEBADF
741     add_errcode("WSAEBADF", WSAEBADF, "Bad file number");
742 #endif
743 #ifdef WSAECONNRESET
744     add_errcode("WSAECONNRESET", WSAECONNRESET, "Connection reset by peer");
745 #endif
746 #ifdef WSAGETSELECTERRO
747     add_errcode("WSAGETSELECTERRO", WSAGETSELECTERRO, "Error WSAGETSELECTERRO");
748 #endif
749 #ifdef WSAETIMEDOUT
750     add_errcode("WSAETIMEDOUT", WSAETIMEDOUT, "Connection timed out");
751 #endif
752 #ifdef WSAENOBUFS
753     add_errcode("WSAENOBUFS", WSAENOBUFS, "No buffer space available");
754 #endif
755 #ifdef WSAEDISCON
756     add_errcode("WSAEDISCON", WSAEDISCON, "Error WSAEDISCON");
757 #endif
758 #ifdef WSAEINTR
759     add_errcode("WSAEINTR", WSAEINTR, "Interrupted system call");
760 #endif
761 #ifdef WSAEPROTOTYPE
762     add_errcode("WSAEPROTOTYPE", WSAEPROTOTYPE, "Protocol wrong type for socket");
763 #endif
764 #ifdef WSAHOS
765     add_errcode("WSAHOS", WSAHOS, "Error WSAHOS");
766 #endif
767 #ifdef WSAEADDRINUSE
768     add_errcode("WSAEADDRINUSE", WSAEADDRINUSE, "Address already in use");
769 #endif
770 #ifdef WSAEADDRNOTAVAIL
771     add_errcode("WSAEADDRNOTAVAIL", WSAEADDRNOTAVAIL, "Cannot assign requested address");
772 #endif
773 #ifdef WSAEALREADY
774     add_errcode("WSAEALREADY", WSAEALREADY, "Operation already in progress");
775 #endif
776 #ifdef WSAEPROTONOSUPPORT
777     add_errcode("WSAEPROTONOSUPPORT", WSAEPROTONOSUPPORT, "Protocol not supported");
778 #endif
779 #ifdef WSASYSNOTREADY
780     add_errcode("WSASYSNOTREADY", WSASYSNOTREADY, "Error WSASYSNOTREADY");
781 #endif
782 #ifdef WSAEWOULDBLOCK
783     add_errcode("WSAEWOULDBLOCK", WSAEWOULDBLOCK, "Operation would block");
784 #endif
785 #ifdef WSAEPFNOSUPPORT
786     add_errcode("WSAEPFNOSUPPORT", WSAEPFNOSUPPORT, "Protocol family not supported");
787 #endif
788 #ifdef WSAEOPNOTSUPP
789     add_errcode("WSAEOPNOTSUPP", WSAEOPNOTSUPP, "Operation not supported on transport endpoint");
790 #endif
791 #ifdef WSAEISCONN
792     add_errcode("WSAEISCONN", WSAEISCONN, "Transport endpoint is already connected");
793 #endif
794 #ifdef WSAEDQUOT
795     add_errcode("WSAEDQUOT", WSAEDQUOT, "Quota exceeded");
796 #endif
797 #ifdef WSAENOTCONN
798     add_errcode("WSAENOTCONN", WSAENOTCONN, "Transport endpoint is not connected");
799 #endif
800 #ifdef WSAEREMOTE
801     add_errcode("WSAEREMOTE", WSAEREMOTE, "Object is remote");
802 #endif
803 #ifdef WSAEINVAL
804     add_errcode("WSAEINVAL", WSAEINVAL, "Invalid argument");
805 #endif
806 #ifdef WSAEINPROGRESS
807     add_errcode("WSAEINPROGRESS", WSAEINPROGRESS, "Operation now in progress");
808 #endif
809 #ifdef WSAGETSELECTEVEN
810     add_errcode("WSAGETSELECTEVEN", WSAGETSELECTEVEN, "Error WSAGETSELECTEVEN");
811 #endif
812 #ifdef WSAESOCKTNOSUPPORT
813     add_errcode("WSAESOCKTNOSUPPORT", WSAESOCKTNOSUPPORT, "Socket type not supported");
814 #endif
815 #ifdef WSAGETASYNCERRO
816     add_errcode("WSAGETASYNCERRO", WSAGETASYNCERRO, "Error WSAGETASYNCERRO");
817 #endif
818 #ifdef WSAMAKESELECTREPL
819     add_errcode("WSAMAKESELECTREPL", WSAMAKESELECTREPL, "Error WSAMAKESELECTREPL");
820 #endif
821 #ifdef WSAGETASYNCBUFLE
822     add_errcode("WSAGETASYNCBUFLE", WSAGETASYNCBUFLE, "Error WSAGETASYNCBUFLE");
823 #endif
824 #ifdef WSAEDESTADDRREQ
825     add_errcode("WSAEDESTADDRREQ", WSAEDESTADDRREQ, "Destination address required");
826 #endif
827 #ifdef WSAECONNREFUSED
828     add_errcode("WSAECONNREFUSED", WSAECONNREFUSED, "Connection refused");
829 #endif
830 #ifdef WSAENETRESET
831     add_errcode("WSAENETRESET", WSAENETRESET, "Network dropped connection because of reset");
832 #endif
833 #ifdef WSAN
834     add_errcode("WSAN", WSAN, "Error WSAN");
835 #endif
836 #ifdef ENOMEDIUM
837     add_errcode("ENOMEDIUM", ENOMEDIUM, "No medium found");
838 #endif
839 #ifdef EMEDIUMTYPE
840     add_errcode("EMEDIUMTYPE", EMEDIUMTYPE, "Wrong medium type");
841 #endif
842 #ifdef ECANCELED
843     add_errcode("ECANCELED", ECANCELED, "Operation Canceled");
844 #endif
845 #ifdef ENOKEY
846     add_errcode("ENOKEY", ENOKEY, "Required key not available");
847 #endif
848 #ifdef EKEYEXPIRED
849     add_errcode("EKEYEXPIRED", EKEYEXPIRED, "Key has expired");
850 #endif
851 #ifdef EKEYREVOKED
852     add_errcode("EKEYREVOKED", EKEYREVOKED, "Key has been revoked");
853 #endif
854 #ifdef EKEYREJECTED
855     add_errcode("EKEYREJECTED", EKEYREJECTED, "Key was rejected by service");
856 #endif
857 #ifdef EOWNERDEAD
858     add_errcode("EOWNERDEAD", EOWNERDEAD, "Owner died");
859 #endif
860 #ifdef ENOTRECOVERABLE
861     add_errcode("ENOTRECOVERABLE", ENOTRECOVERABLE, "State not recoverable");
862 #endif
863 #ifdef ERFKILL
864     add_errcode("ERFKILL", ERFKILL, "Operation not possible due to RF-kill");
865 #endif
866 
867     /* Solaris-specific errnos */
868 #ifdef ECANCELED
869     add_errcode("ECANCELED", ECANCELED, "Operation canceled");
870 #endif
871 #ifdef ENOTSUP
872     add_errcode("ENOTSUP", ENOTSUP, "Operation not supported");
873 #endif
874 #ifdef EOWNERDEAD
875     add_errcode("EOWNERDEAD", EOWNERDEAD, "Process died with the lock");
876 #endif
877 #ifdef ENOTRECOVERABLE
878     add_errcode("ENOTRECOVERABLE", ENOTRECOVERABLE, "Lock is not recoverable");
879 #endif
880 #ifdef ELOCKUNMAPPED
881     add_errcode("ELOCKUNMAPPED", ELOCKUNMAPPED, "Locked lock was unmapped");
882 #endif
883 #ifdef ENOTACTIVE
884     add_errcode("ENOTACTIVE", ENOTACTIVE, "Facility is not active");
885 #endif
886 
887     /* MacOSX specific errnos */
888 #ifdef EAUTH
889     add_errcode("EAUTH", EAUTH, "Authentication error");
890 #endif
891 #ifdef EBADARCH
892     add_errcode("EBADARCH", EBADARCH, "Bad CPU type in executable");
893 #endif
894 #ifdef EBADEXEC
895     add_errcode("EBADEXEC", EBADEXEC, "Bad executable (or shared library)");
896 #endif
897 #ifdef EBADMACHO
898     add_errcode("EBADMACHO", EBADMACHO, "Malformed Mach-o file");
899 #endif
900 #ifdef EBADRPC
901     add_errcode("EBADRPC", EBADRPC, "RPC struct is bad");
902 #endif
903 #ifdef EDEVERR
904     add_errcode("EDEVERR", EDEVERR, "Device error");
905 #endif
906 #ifdef EFTYPE
907     add_errcode("EFTYPE", EFTYPE, "Inappropriate file type or format");
908 #endif
909 #ifdef ENEEDAUTH
910     add_errcode("ENEEDAUTH", ENEEDAUTH, "Need authenticator");
911 #endif
912 #ifdef ENOATTR
913     add_errcode("ENOATTR", ENOATTR, "Attribute not found");
914 #endif
915 #ifdef ENOPOLICY
916     add_errcode("ENOPOLICY", ENOPOLICY, "Policy not found");
917 #endif
918 #ifdef EPROCLIM
919     add_errcode("EPROCLIM", EPROCLIM, "Too many processes");
920 #endif
921 #ifdef EPROCUNAVAIL
922     add_errcode("EPROCUNAVAIL", EPROCUNAVAIL, "Bad procedure for program");
923 #endif
924 #ifdef EPROGMISMATCH
925     add_errcode("EPROGMISMATCH", EPROGMISMATCH, "Program version wrong");
926 #endif
927 #ifdef EPROGUNAVAIL
928     add_errcode("EPROGUNAVAIL", EPROGUNAVAIL, "RPC prog. not avail");
929 #endif
930 #ifdef EPWROFF
931     add_errcode("EPWROFF", EPWROFF, "Device power is off");
932 #endif
933 #ifdef ERPCMISMATCH
934     add_errcode("ERPCMISMATCH", ERPCMISMATCH, "RPC version wrong");
935 #endif
936 #ifdef ESHLIBVERS
937     add_errcode("ESHLIBVERS", ESHLIBVERS, "Shared library version mismatch");
938 #endif
939 #ifdef EQFULL
940     add_errcode("EQFULL", EQFULL, "Interface output queue is full");
941 #endif
942 #ifdef ENOTCAPABLE
943     // WASI extension
944     add_errcode("ENOTCAPABLE", ENOTCAPABLE, "Capabilities insufficient");
945 #endif
946 
947     Py_DECREF(error_dict);
948     return 0;
949 }
950 
951 static PyModuleDef_Slot errno_slots[] = {
952     {Py_mod_exec, errno_exec},
953     {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
954     {Py_mod_gil, Py_MOD_GIL_NOT_USED},
955     {0, NULL}
956 };
957 
958 PyDoc_STRVAR(errno__doc__,
959 "This module makes available standard errno system symbols.\n\
960 \n\
961 The value of each symbol is the corresponding integer value,\n\
962 e.g., on most systems, errno.ENOENT equals the integer 2.\n\
963 \n\
964 The dictionary errno.errorcode maps numeric codes to symbol names,\n\
965 e.g., errno.errorcode[2] could be the string 'ENOENT'.\n\
966 \n\
967 Symbols that are not relevant to the underlying system are not defined.\n\
968 \n\
969 To map error codes to error messages, use the function os.strerror(),\n\
970 e.g. os.strerror(2) could return 'No such file or directory'.");
971 
972 static struct PyModuleDef errnomodule = {
973     PyModuleDef_HEAD_INIT,
974     .m_name = "errno",
975     .m_doc = errno__doc__,
976     .m_size = 0,
977     .m_methods = errno_methods,
978     .m_slots = errno_slots,
979 };
980 
981 PyMODINIT_FUNC
PyInit_errno(void)982 PyInit_errno(void)
983 {
984     return PyModuleDef_Init(&errnomodule);
985 }
986