From fc513e3c2529b9707b0c40a4975a4e13b83e793b Mon Sep 17 00:00:00 2001 From: siontama Date: Tue, 2 Aug 2022 01:15:48 +0900 Subject: [PATCH 1/3] Refactor: pwd module --- vm/src/stdlib/pwd.rs | 48 ++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/vm/src/stdlib/pwd.rs b/vm/src/stdlib/pwd.rs index f44b04179..ac916da2c 100644 --- a/vm/src/stdlib/pwd.rs +++ b/vm/src/stdlib/pwd.rs @@ -56,36 +56,36 @@ mod pwd { if name.as_str().contains('\0') { return Err(exceptions::cstring_error(vm)); } - match User::from_name(name.as_str()).map_err(|err| err.into_pyexception(vm))? { - Some(user) => Ok(Passwd::from(user)), - None => { - let name_repr = name.as_object().repr(vm)?; - let message = vm - .ctx + let user = User::from_name(name.as_str()).map_err(|err| err.into_pyexception(vm))?; + let user = user.ok_or_else(|| { + let name_repr = name.as_object().repr(vm)?; + vm.new_key_error( + vm.ctx .new_str(format!("getpwnam(): name not found: {}", name_repr)) - .into(); - Err(vm.new_key_error(message)) - } - } + .into(), + ) + })?; + Ok(Passwd::from(user)) } #[pyfunction] fn getpwuid(uid: PyIntRef, vm: &VirtualMachine) -> PyResult { - let uid_t = libc::uid_t::try_from(uid.as_bigint()).map(unistd::Uid::from_raw); - let user = match uid_t { - Ok(uid) => User::from_uid(uid).map_err(|err| err.into_pyexception(vm))?, - Err(_) => None, - }; - match user { - Some(user) => Ok(Passwd::from(user)), - None => { - let message = vm - .ctx + let uid_t = libc::uid_t::try_from(uid.as_bigint()) + .map(unistd::Uid::from_raw) + .ok(); + let user = uid_t + .map(User::from_uid) + .transpose() + .map_err(|err| err.into_pyexception(vm))? + .flatten(); + let user = user.ok_or_else(|| { + vm.new_key_error( + vm.ctx .new_str(format!("getpwuid(): uid not found: {}", uid.as_bigint())) - .into(); - Err(vm.new_key_error(message)) - } - } + .into(), + ) + })?; + Ok(Passwd::from(user)) } // TODO: maybe merge this functionality into nix? From c97148529cfba33ed33ceed196cb2d6deab1d4b4 Mon Sep 17 00:00:00 2001 From: siontama Date: Tue, 2 Aug 2022 20:29:59 +0900 Subject: [PATCH 2/3] Fix: subtract `name_repr` --- vm/src/stdlib/pwd.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vm/src/stdlib/pwd.rs b/vm/src/stdlib/pwd.rs index ac916da2c..e39bcfb7b 100644 --- a/vm/src/stdlib/pwd.rs +++ b/vm/src/stdlib/pwd.rs @@ -57,8 +57,8 @@ mod pwd { return Err(exceptions::cstring_error(vm)); } let user = User::from_name(name.as_str()).map_err(|err| err.into_pyexception(vm))?; + let name_repr = name.as_object().repr(vm)?; let user = user.ok_or_else(|| { - let name_repr = name.as_object().repr(vm)?; vm.new_key_error( vm.ctx .new_str(format!("getpwnam(): name not found: {}", name_repr)) From 8e3cd3e16a4930e08dc27a1fa65fe6888ec1a14b Mon Sep 17 00:00:00 2001 From: siontama Date: Sat, 13 Aug 2022 17:39:59 +0900 Subject: [PATCH 3/3] Refactor: pw_name --- vm/src/stdlib/pwd.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vm/src/stdlib/pwd.rs b/vm/src/stdlib/pwd.rs index e39bcfb7b..78411c8be 100644 --- a/vm/src/stdlib/pwd.rs +++ b/vm/src/stdlib/pwd.rs @@ -53,15 +53,15 @@ mod pwd { #[pyfunction] fn getpwnam(name: PyStrRef, vm: &VirtualMachine) -> PyResult { - if name.as_str().contains('\0') { + let pw_name = name.as_str(); + if pw_name.contains('\0') { return Err(exceptions::cstring_error(vm)); } let user = User::from_name(name.as_str()).map_err(|err| err.into_pyexception(vm))?; - let name_repr = name.as_object().repr(vm)?; let user = user.ok_or_else(|| { vm.new_key_error( vm.ctx - .new_str(format!("getpwnam(): name not found: {}", name_repr)) + .new_str(format!("getpwnam(): name not found: {}", pw_name)) .into(), ) })?;