diff options
-rw-r--r-- | tools/mpremote/mpremote/mp_errno.py | 53 | ||||
-rw-r--r-- | tools/mpremote/mpremote/transport.py | 13 |
2 files changed, 65 insertions, 1 deletions
diff --git a/tools/mpremote/mpremote/mp_errno.py b/tools/mpremote/mpremote/mp_errno.py new file mode 100644 index 0000000000..37cb1e0cb9 --- /dev/null +++ b/tools/mpremote/mpremote/mp_errno.py @@ -0,0 +1,53 @@ +import errno + +# This table maps numeric values defined by `py/mperrno.h` to host errno code. +MP_ERRNO_TABLE = { + 1: errno.EPERM, + 2: errno.ENOENT, + 3: errno.ESRCH, + 4: errno.EINTR, + 5: errno.EIO, + 6: errno.ENXIO, + 7: errno.E2BIG, + 8: errno.ENOEXEC, + 9: errno.EBADF, + 10: errno.ECHILD, + 11: errno.EAGAIN, + 12: errno.ENOMEM, + 13: errno.EACCES, + 14: errno.EFAULT, + 15: errno.ENOTBLK, + 16: errno.EBUSY, + 17: errno.EEXIST, + 18: errno.EXDEV, + 19: errno.ENODEV, + 20: errno.ENOTDIR, + 21: errno.EISDIR, + 22: errno.EINVAL, + 23: errno.ENFILE, + 24: errno.EMFILE, + 25: errno.ENOTTY, + 26: errno.ETXTBSY, + 27: errno.EFBIG, + 28: errno.ENOSPC, + 29: errno.ESPIPE, + 30: errno.EROFS, + 31: errno.EMLINK, + 32: errno.EPIPE, + 33: errno.EDOM, + 34: errno.ERANGE, + 95: errno.EOPNOTSUPP, + 97: errno.EAFNOSUPPORT, + 98: errno.EADDRINUSE, + 103: errno.ECONNABORTED, + 104: errno.ECONNRESET, + 105: errno.ENOBUFS, + 106: errno.EISCONN, + 107: errno.ENOTCONN, + 110: errno.ETIMEDOUT, + 111: errno.ECONNREFUSED, + 113: errno.EHOSTUNREACH, + 114: errno.EALREADY, + 115: errno.EINPROGRESS, + 125: errno.ECANCELED, +} diff --git a/tools/mpremote/mpremote/transport.py b/tools/mpremote/mpremote/transport.py index 1b70f9b2ed..d7568b281b 100644 --- a/tools/mpremote/mpremote/transport.py +++ b/tools/mpremote/mpremote/transport.py @@ -24,8 +24,9 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -import ast, errno, hashlib, os, sys +import ast, errno, hashlib, os, re, sys from collections import namedtuple +from .mp_errno import MP_ERRNO_TABLE def stdout_write_bytes(b): @@ -62,6 +63,16 @@ def _convert_filesystem_error(e, info): ]: if estr in e.error_output: return OSError(code, info) + + # Some targets don't render OSError with the name of the errno, so in these + # cases support an explicit mapping of errnos to known numeric codes. + error_lines = e.error_output.splitlines() + match = re.match(r"OSError: (\d+)$", error_lines[-1]) + if match: + value = int(match.group(1), 10) + if value in MP_ERRNO_TABLE: + return OSError(MP_ERRNO_TABLE[value], info) + return e |