Changeset View
Changeset View
Standalone View
Standalone View
contrib/lib9p/pytest/p9err.py
Property | Old Value | New Value |
---|---|---|
svn:eol-style | null | native \ No newline at end of property |
svn:keywords | null | FreeBSD=%H \ No newline at end of property |
svn:mime-type | null | text/plain \ No newline at end of property |
#! /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() |