diff options
Diffstat (limited to 'pytest/p9err.py')
-rw-r--r-- | pytest/p9err.py | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/pytest/p9err.py b/pytest/p9err.py new file mode 100644 index 000000000000..407278b2a404 --- /dev/null +++ b/pytest/p9err.py @@ -0,0 +1,146 @@ +#! /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() |