diff --git a/src/shell.rs b/src/shell.rs index e38b0a50de..c0ae508b01 100644 --- a/src/shell.rs +++ b/src/shell.rs @@ -209,6 +209,13 @@ pub fn run_shell(vm: &VirtualMachine, scope: Scope) -> PyResult<()> { ReadlineResult::Eof => { break; } + #[cfg(unix)] + ReadlineResult::OsError(num) => { + let os_error = + vm.new_exception_msg(vm.ctx.exceptions.os_error.to_owned(), format!("{num:?}")); + vm.print_exception(os_error); + break; + } ReadlineResult::Other(err) => { eprintln!("Readline error: {err:?}"); break; diff --git a/vm/src/readline.rs b/vm/src/readline.rs index 86c8fc4fdd..839ac98003 100644 --- a/vm/src/readline.rs +++ b/vm/src/readline.rs @@ -13,6 +13,8 @@ pub enum ReadlineResult { Eof, Interrupt, Io(std::io::Error), + #[cfg(unix)] + OsError(nix::Error), Other(OtherError), } @@ -118,6 +120,8 @@ mod rustyline_readline { Err(ReadlineError::Eof) => ReadlineResult::Eof, Err(ReadlineError::Io(e)) => ReadlineResult::Io(e), Err(ReadlineError::Signal(_)) => continue, + #[cfg(unix)] + Err(ReadlineError::Errno(num)) => ReadlineResult::OsError(num), Err(e) => ReadlineResult::Other(e.into()), }; } diff --git a/vm/src/stdlib/builtins.rs b/vm/src/stdlib/builtins.rs index f723ed801b..8cf99770e7 100644 --- a/vm/src/stdlib/builtins.rs +++ b/vm/src/stdlib/builtins.rs @@ -489,6 +489,8 @@ mod builtins { Err(vm.new_exception_empty(vm.ctx.exceptions.keyboard_interrupt.to_owned())) } ReadlineResult::Io(e) => Err(vm.new_os_error(e.to_string())), + #[cfg(unix)] + ReadlineResult::OsError(num) => Err(vm.new_os_error(num.to_string())), ReadlineResult::Other(e) => Err(vm.new_runtime_error(e.to_string())), } } else {