1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
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()
|