147 lines
2.9 KiB
Python
147 lines
2.9 KiB
Python
|
#! /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()
|