Added Sam Rushing's errno module
diff --git a/Modules/errnomodule.c b/Modules/errnomodule.c
new file mode 100644
index 0000000..a3a3fd0
--- /dev/null
+++ b/Modules/errnomodule.c
@@ -0,0 +1,561 @@
+/***********************************************************
+Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
+The Netherlands.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in 
+supporting documentation, and that the names of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
+/* Errno module */
+
+#include "Python.h"
+
+/*
+ * Pull in the system error definitions
+ */ 
+
+#include <errno.h>
+
+static PyMethodDef errno_methods[] = {
+  {NULL,	NULL}
+};
+
+/*
+ * Convenience routine to export an integer value.
+ * For simplicity, errors (which are unlikely anyway) are ignored.
+ */
+
+static void
+insint(d, name, value)
+	PyObject * d;
+	char * name;
+	int value;
+{
+	PyObject *v = PyInt_FromLong((long) value);
+	if (v == NULL) {
+		/* Don't bother reporting this error */
+		PyErr_Clear();
+	}
+	else {
+		PyDict_SetItemString(d, name, v);
+		Py_DECREF(v);
+	}
+}
+
+void
+initerrno()
+{
+	PyObject *m, *d;
+	m = Py_InitModule("errno", errno_methods);
+	d = PyModule_GetDict(m);
+
+	/*
+	 * The names and comments are borrowed from linux/include/errno.h,
+	 * which should be pretty all-inclusive
+	 */ 
+
+#ifdef EPERM
+	/* Operation not permitted */
+	insint(d, "EPERM", EPERM);
+#endif
+#ifdef ENOENT
+	/* No such file or directory */
+	insint(d, "ENOENT", ENOENT);
+#endif
+#ifdef ESRCH
+	/* No such process */
+	insint(d, "ESRCH", ESRCH);
+#endif
+#ifdef EINTR
+	/* Interrupted system call */
+	insint(d, "EINTR", EINTR);
+#endif
+#ifdef EIO
+	/* I/O error */
+	insint(d, "EIO", EIO);
+#endif
+#ifdef ENXIO
+	/* No such device or address */
+	insint(d, "ENXIO", ENXIO);
+#endif
+#ifdef E2BIG
+	/* Arg list too long */
+	insint(d, "E2BIG", E2BIG);
+#endif
+#ifdef ENOEXEC
+	/* Exec format error */
+	insint(d, "ENOEXEC", ENOEXEC);
+#endif
+#ifdef EBADF
+	/* Bad file number */
+	insint(d, "EBADF", EBADF);
+#endif
+#ifdef ECHILD
+	/* No child processes */
+	insint(d, "ECHILD", ECHILD);
+#endif
+#ifdef EAGAIN
+	/* Try again */
+	insint(d, "EAGAIN", EAGAIN);
+#endif
+#ifdef ENOMEM
+	/* Out of memory */
+	insint(d, "ENOMEM", ENOMEM);
+#endif
+#ifdef EACCES
+	/* Permission denied */
+	insint(d, "EACCES", EACCES);
+#endif
+#ifdef EFAULT
+	/* Bad address */
+	insint(d, "EFAULT", EFAULT);
+#endif
+#ifdef ENOTBLK
+	/* Block device required */
+	insint(d, "ENOTBLK", ENOTBLK);
+#endif
+#ifdef EBUSY
+	/* Device or resource busy */
+	insint(d, "EBUSY", EBUSY);
+#endif
+#ifdef EEXIST
+	/* File exists */
+	insint(d, "EEXIST", EEXIST);
+#endif
+#ifdef EXDEV
+	/* Cross-device link */
+	insint(d, "EXDEV", EXDEV);
+#endif
+#ifdef ENODEV
+	/* No such device */
+	insint(d, "ENODEV", ENODEV);
+#endif
+#ifdef ENOTDIR
+	/* Not a directory */
+	insint(d, "ENOTDIR", ENOTDIR);
+#endif
+#ifdef EISDIR
+	/* Is a directory */
+	insint(d, "EISDIR", EISDIR);
+#endif
+#ifdef EINVAL
+	/* Invalid argument */
+	insint(d, "EINVAL", EINVAL);
+#endif
+#ifdef ENFILE
+	/* File table overflow */
+	insint(d, "ENFILE", ENFILE);
+#endif
+#ifdef EMFILE
+	/* Too many open files */
+	insint(d, "EMFILE", EMFILE);
+#endif
+#ifdef ENOTTY
+	/* Not a typewriter */
+	insint(d, "ENOTTY", ENOTTY);
+#endif
+#ifdef ETXTBSY
+	/* Text file busy */
+	insint(d, "ETXTBSY", ETXTBSY);
+#endif
+#ifdef EFBIG
+	/* File too large */
+	insint(d, "EFBIG", EFBIG);
+#endif
+#ifdef ENOSPC
+	/* No space left on device */
+	insint(d, "ENOSPC", ENOSPC);
+#endif
+#ifdef ESPIPE
+	/* Illegal seek */
+	insint(d, "ESPIPE", ESPIPE);
+#endif
+#ifdef EROFS
+	/* Read-only file system */
+	insint(d, "EROFS", EROFS);
+#endif
+#ifdef EMLINK
+	/* Too many links */
+	insint(d, "EMLINK", EMLINK);
+#endif
+#ifdef EPIPE
+	/* Broken pipe */
+	insint(d, "EPIPE", EPIPE);
+#endif
+#ifdef EDOM
+	/* Math argument out of domain of func */
+	insint(d, "EDOM", EDOM);
+#endif
+#ifdef ERANGE
+	/* Math result not representable */
+	insint(d, "ERANGE", ERANGE);
+#endif
+#ifdef EDEADLK
+	/* Resource deadlock would occur */
+	insint(d, "EDEADLK", EDEADLK);
+#endif
+#ifdef ENAMETOOLONG
+	/* File name too long */
+	insint(d, "ENAMETOOLONG", ENAMETOOLONG);
+#endif
+#ifdef ENOLCK
+	/* No record locks available */
+	insint(d, "ENOLCK", ENOLCK);
+#endif
+#ifdef ENOSYS
+	/* Function not implemented */
+	insint(d, "ENOSYS", ENOSYS);
+#endif
+#ifdef ENOTEMPTY
+	/* Directory not empty */
+	insint(d, "ENOTEMPTY", ENOTEMPTY);
+#endif
+#ifdef ELOOP
+	/* Too many symbolic links encountered */
+	insint(d, "ELOOP", ELOOP);
+#endif
+#ifdef EWOULDBLOCK
+	/* Operation would block */
+	insint(d, "EWOULDBLOCK", EWOULDBLOCK);
+#endif
+#ifdef ENOMSG
+	/* No message of desired type */
+	insint(d, "ENOMSG", ENOMSG);
+#endif
+#ifdef EIDRM
+	/* Identifier removed */
+	insint(d, "EIDRM", EIDRM);
+#endif
+#ifdef ECHRNG
+	/* Channel number out of range */
+	insint(d, "ECHRNG", ECHRNG);
+#endif
+#ifdef EL2NSYNC
+	/* Level 2 not synchronized */
+	insint(d, "EL2NSYNC", EL2NSYNC);
+#endif
+#ifdef EL3HLT
+	/* Level 3 halted */
+	insint(d, "EL3HLT", EL3HLT);
+#endif
+#ifdef EL3RST
+	/* Level 3 reset */
+	insint(d, "EL3RST", EL3RST);
+#endif
+#ifdef ELNRNG
+	/* Link number out of range */
+	insint(d, "ELNRNG", ELNRNG);
+#endif
+#ifdef EUNATCH
+	/* Protocol driver not attached */
+	insint(d, "EUNATCH", EUNATCH);
+#endif
+#ifdef ENOCSI
+	/* No CSI structure available */
+	insint(d, "ENOCSI", ENOCSI);
+#endif
+#ifdef EL2HLT
+	/* Level 2 halted */
+	insint(d, "EL2HLT", EL2HLT);
+#endif
+#ifdef EBADE
+	/* Invalid exchange */
+	insint(d, "EBADE", EBADE);
+#endif
+#ifdef EBADR
+	/* Invalid request descriptor */
+	insint(d, "EBADR", EBADR);
+#endif
+#ifdef EXFULL
+	/* Exchange full */
+	insint(d, "EXFULL", EXFULL);
+#endif
+#ifdef ENOANO
+	/* No anode */
+	insint(d, "ENOANO", ENOANO);
+#endif
+#ifdef EBADRQC
+	/* Invalid request code */
+	insint(d, "EBADRQC", EBADRQC);
+#endif
+#ifdef EBADSLT
+	/* Invalid slot */
+	insint(d, "EBADSLT", EBADSLT);
+#endif
+#ifdef EDEADLOCK
+	/* File locking deadlock error */
+	insint(d, "EDEADLOCK", EDEADLOCK);
+#endif
+#ifdef EBFONT
+	/* Bad font file format */
+	insint(d, "EBFONT", EBFONT);
+#endif
+#ifdef ENOSTR
+	/* Device not a stream */
+	insint(d, "ENOSTR", ENOSTR);
+#endif
+#ifdef ENODATA
+	/* No data available */
+	insint(d, "ENODATA", ENODATA);
+#endif
+#ifdef ETIME
+	/* Timer expired */
+	insint(d, "ETIME", ETIME);
+#endif
+#ifdef ENOSR
+	/* Out of streams resources */
+	insint(d, "ENOSR", ENOSR);
+#endif
+#ifdef ENONET
+	/* Machine is not on the network */
+	insint(d, "ENONET", ENONET);
+#endif
+#ifdef ENOPKG
+	/* Package not installed */
+	insint(d, "ENOPKG", ENOPKG);
+#endif
+#ifdef EREMOTE
+	/* Object is remote */
+	insint(d, "EREMOTE", EREMOTE);
+#endif
+#ifdef ENOLINK
+	/* Link has been severed */
+	insint(d, "ENOLINK", ENOLINK);
+#endif
+#ifdef EADV
+	/* Advertise error */
+	insint(d, "EADV", EADV);
+#endif
+#ifdef ESRMNT
+	/* Srmount error */
+	insint(d, "ESRMNT", ESRMNT);
+#endif
+#ifdef ECOMM
+	/* Communication error on send */
+	insint(d, "ECOMM", ECOMM);
+#endif
+#ifdef EPROTO
+	/* Protocol error */
+	insint(d, "EPROTO", EPROTO);
+#endif
+#ifdef EMULTIHOP
+	/* Multihop attempted */
+	insint(d, "EMULTIHOP", EMULTIHOP);
+#endif
+#ifdef EDOTDOT
+	/* RFS specific error */
+	insint(d, "EDOTDOT", EDOTDOT);
+#endif
+#ifdef EBADMSG
+	/* Not a data message */
+	insint(d, "EBADMSG", EBADMSG);
+#endif
+#ifdef EOVERFLOW
+	/* Value too large for defined data type */
+	insint(d, "EOVERFLOW", EOVERFLOW);
+#endif
+#ifdef ENOTUNIQ
+	/* Name not unique on network */
+	insint(d, "ENOTUNIQ", ENOTUNIQ);
+#endif
+#ifdef EBADFD
+	/* File descriptor in bad state */
+	insint(d, "EBADFD", EBADFD);
+#endif
+#ifdef EREMCHG
+	/* Remote address changed */
+	insint(d, "EREMCHG", EREMCHG);
+#endif
+#ifdef ELIBACC
+	/* Can not access a needed shared library */
+	insint(d, "ELIBACC", ELIBACC);
+#endif
+#ifdef ELIBBAD
+	/* Accessing a corrupted shared library */
+	insint(d, "ELIBBAD", ELIBBAD);
+#endif
+#ifdef ELIBSCN
+	/* .lib section in a.out corrupted */
+	insint(d, "ELIBSCN", ELIBSCN);
+#endif
+#ifdef ELIBMAX
+	/* Attempting to link in too many shared libraries */
+	insint(d, "ELIBMAX", ELIBMAX);
+#endif
+#ifdef ELIBEXEC
+	/* Cannot exec a shared library directly */
+	insint(d, "ELIBEXEC", ELIBEXEC);
+#endif
+#ifdef EILSEQ
+	/* Illegal byte sequence */
+	insint(d, "EILSEQ", EILSEQ);
+#endif
+#ifdef ERESTART
+	/* Interrupted system call should be restarted */
+	insint(d, "ERESTART", ERESTART);
+#endif
+#ifdef ESTRPIPE
+	/* Streams pipe error */
+	insint(d, "ESTRPIPE", ESTRPIPE);
+#endif
+#ifdef EUSERS
+	/* Too many users */
+	insint(d, "EUSERS", EUSERS);
+#endif
+#ifdef ENOTSOCK
+	/* Socket operation on non-socket */
+	insint(d, "ENOTSOCK", ENOTSOCK);
+#endif
+#ifdef EDESTADDRREQ
+	/* Destination address required */
+	insint(d, "EDESTADDRREQ", EDESTADDRREQ);
+#endif
+#ifdef EMSGSIZE
+	/* Message too long */
+	insint(d, "EMSGSIZE", EMSGSIZE);
+#endif
+#ifdef EPROTOTYPE
+	/* Protocol wrong type for socket */
+	insint(d, "EPROTOTYPE", EPROTOTYPE);
+#endif
+#ifdef ENOPROTOOPT
+	/* Protocol not available */
+	insint(d, "ENOPROTOOPT", ENOPROTOOPT);
+#endif
+#ifdef EPROTONOSUPPORT
+	/* Protocol not supported */
+	insint(d, "EPROTONOSUPPORT", EPROTONOSUPPORT);
+#endif
+#ifdef ESOCKTNOSUPPORT
+	/* Socket type not supported */
+	insint(d, "ESOCKTNOSUPPORT", ESOCKTNOSUPPORT);
+#endif
+#ifdef EOPNOTSUPP
+	/* Operation not supported on transport endpoint */
+	insint(d, "EOPNOTSUPP", EOPNOTSUPP);
+#endif
+#ifdef EPFNOSUPPORT
+	/* Protocol family not supported */
+	insint(d, "EPFNOSUPPORT", EPFNOSUPPORT);
+#endif
+#ifdef EAFNOSUPPORT
+	/* Address family not supported by protocol */
+	insint(d, "EAFNOSUPPORT", EAFNOSUPPORT);
+#endif
+#ifdef EADDRINUSE
+	/* Address already in use */
+	insint(d, "EADDRINUSE", EADDRINUSE);
+#endif
+#ifdef EADDRNOTAVAIL
+	/* Cannot assign requested address */
+	insint(d, "EADDRNOTAVAIL", EADDRNOTAVAIL);
+#endif
+#ifdef ENETDOWN
+	/* Network is down */
+	insint(d, "ENETDOWN", ENETDOWN);
+#endif
+#ifdef ENETUNREACH
+	/* Network is unreachable */
+	insint(d, "ENETUNREACH", ENETUNREACH);
+#endif
+#ifdef ENETRESET
+	/* Network dropped connection because of reset */
+	insint(d, "ENETRESET", ENETRESET);
+#endif
+#ifdef ECONNABORTED
+	/* Software caused connection abort */
+	insint(d, "ECONNABORTED", ECONNABORTED);
+#endif
+#ifdef ECONNRESET
+	/* Connection reset by peer */
+	insint(d, "ECONNRESET", ECONNRESET);
+#endif
+#ifdef ENOBUFS
+	/* No buffer space available */
+	insint(d, "ENOBUFS", ENOBUFS);
+#endif
+#ifdef EISCONN
+	/* Transport endpoint is already connected */
+	insint(d, "EISCONN", EISCONN);
+#endif
+#ifdef ENOTCONN
+	/* Transport endpoint is not connected */
+	insint(d, "ENOTCONN", ENOTCONN);
+#endif
+#ifdef ESHUTDOWN
+	/* Cannot send after transport endpoint shutdown */
+	insint(d, "ESHUTDOWN", ESHUTDOWN);
+#endif
+#ifdef ETOOMANYREFS
+	/* Too many references: cannot splice */
+	insint(d, "ETOOMANYREFS", ETOOMANYREFS);
+#endif
+#ifdef ETIMEDOUT
+	/* Connection timed out */
+	insint(d, "ETIMEDOUT", ETIMEDOUT);
+#endif
+#ifdef ECONNREFUSED
+	/* Connection refused */
+	insint(d, "ECONNREFUSED", ECONNREFUSED);
+#endif
+#ifdef EHOSTDOWN
+	/* Host is down */
+	insint(d, "EHOSTDOWN", EHOSTDOWN);
+#endif
+#ifdef EHOSTUNREACH
+	/* No route to host */
+	insint(d, "EHOSTUNREACH", EHOSTUNREACH);
+#endif
+#ifdef EALREADY
+	/* Operation already in progress */
+	insint(d, "EALREADY", EALREADY);
+#endif
+#ifdef EINPROGRESS
+	/* Operation now in progress */
+	insint(d, "EINPROGRESS", EINPROGRESS);
+#endif
+#ifdef ESTALE
+	/* Stale NFS file handle */
+	insint(d, "ESTALE", ESTALE);
+#endif
+#ifdef EUCLEAN
+	/* Structure needs cleaning */
+	insint(d, "EUCLEAN", EUCLEAN);
+#endif
+#ifdef ENOTNAM
+	/* Not a XENIX named type file */
+	insint(d, "ENOTNAM", ENOTNAM);
+#endif
+#ifdef ENAVAIL
+	/* No XENIX semaphores available */
+	insint(d, "ENAVAIL", ENAVAIL);
+#endif
+#ifdef EISNAM
+	/* Is a named type file */
+	insint(d, "EISNAM", EISNAM);
+#endif
+#ifdef EREMOTEIO
+	/* Remote I/O error */
+	insint(d, "EREMOTEIO", EREMOTEIO);
+#endif
+#ifdef EDQUOT
+	/* Quota exceeded */
+	insint(d, "EDQUOT", EDQUOT);
+#endif
+}