summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--tools/mpremote/mpremote/mp_errno.py53
-rw-r--r--tools/mpremote/mpremote/transport.py13
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