#! /usr/bin/env python """ Error number definitions for 9P2000, .u, and .L. Note that there is no native-to-9P2000 (plain) translation table since 9P2000 takes error *strings* rather than error *numbers*. """ import errno as _errno import lerrno as _lerrno import os as _os _native_to_dotu = { # These are in the "standard" range(1, errno.ERANGE) # but do not map to themselves, so map them here first. _errno.ENOTEMPTY: _errno.EPERM, _errno.EDQUOT: _errno.EPERM, _errno.ENOSYS: _errno.EPERM, } _native_to_dotl = {} # Add standard errno's. for _i in range(1, _errno.ERANGE): _native_to_dotu.setdefault(_i, _i) _native_to_dotl[_i] = _i # Add linux errno's. Note that Linux EAGAIN at #11 overrides BSD EDEADLK, # but Linux has EDEADLK at #35 which overrides BSD EAGAIN, so it all # works out. # # We just list every BSD error name here, since the hasattr()s do # the real work. for _i in ( 'EDEADLK', 'EAGAIN', 'EINPROGRESS', 'EALREADY', 'ENOTSOCK', 'EDESTADDRREQ', 'EMSGSIZE', 'EPROTOTYPE', 'ENOPROTOOPT', 'EPROTONOSUPPORT', 'ESOCKTNOSUPPORT', 'EOPNOTSUPP', 'EPFNOSUPPORT', 'EAFNOSUPPORT', 'EADDRINUSE', 'EADDRNOTAVAIL', 'ENETDOWN', 'ENETUNREACH', 'ENETRESET', 'ECONNABORTED', 'ECONNRESET', 'ENOBUFS', 'EISCONN', 'ENOTCONN', 'ESHUTDOWN', 'ETOOMANYREFS', 'ETIMEDOUT', 'ECONNREFUSED', 'ELOOP', 'ENAMETOOLONG', 'EHOSTDOWN', 'EHOSTUNREACH', 'ENOTEMPTY', 'EPROCLIM', 'EUSERS', 'EDQUOT', 'ESTALE', 'EREMOTE', 'EBADRPC', 'ERPCMISMATCH', 'EPROGUNAVAIL', 'EPROGMISMATCH', 'EPROCUNAVAIL', 'ENOLCK', 'ENOSYS', 'EFTYPE', 'EAUTH', 'ENEEDAUTH', 'EIDRM', 'ENOMSG', 'EOVERFLOW', 'ECANCELED', 'EILSEQ', 'EDOOFUS', 'EBADMSG', 'EMULTIHOP', 'ENOLINK', 'EPROTO', 'ENOTCAPABLE', 'ECAPMODE', 'ENOTRECOVERABLE', 'EOWNERDEAD', ): if hasattr(_errno, _i) and hasattr(_lerrno, _i): _native_to_dotl[getattr(_errno, _i)] = getattr(_lerrno, _i) del _i def to_dotu(errnum): """ Translate native errno to 9P2000.u errno. >>> import errno >>> to_dotu(errno.EIO) 5 >>> to_dotu(errno.EDQUOT) 1 >>> to_dotu(errno.ELOOP) 5 There is a corresponding dotu_strerror() (which is really just os.strerror): >>> dotu_strerror(5) 'Input/output error' """ return _native_to_dotu.get(errnum, _errno.EIO) # default to EIO def to_dotl(errnum): """ Translate native errno to 9P2000.L errno. >>> import errno >>> to_dotl(errno.ELOOP) 40 There is a corresponding dotl_strerror(): >>> dotl_strerror(40) 'Too many levels of symbolic links' """ return _native_to_dotl.get(errnum, _lerrno.ENOTRECOVERABLE) dotu_strerror = _os.strerror dotl_strerror = _lerrno.strerror if __name__ == '__main__': import doctest doctest.testmod()