From a09bc913c06739add22f14a032c66834e44f4acb Mon Sep 17 00:00:00 2001 From: arookieofc <2128194521@qq.com> Date: Fri, 5 Jun 2026 22:48:37 +0800 Subject: [PATCH] fix: preserve UNC paths in pwd and readlink --- src/uu/pwd/src/pwd.rs | 18 +++++++++++++----- src/uu/readlink/src/readlink.rs | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/uu/pwd/src/pwd.rs b/src/uu/pwd/src/pwd.rs index 41d568b7276..6cc4aa1ef5c 100644 --- a/src/uu/pwd/src/pwd.rs +++ b/src/uu/pwd/src/pwd.rs @@ -109,6 +109,15 @@ fn logical_path() -> io::Result { } } +#[cfg(windows)] +fn strip_windows_verbatim_prefix(path: &str) -> Option { + if let Some(rest) = path.strip_prefix(r"\\?\UNC\") { + Some(PathBuf::from(format!(r"\\{rest}"))) + } else { + path.strip_prefix(r"\\?\").map(PathBuf::from) + } +} + #[uucore::main(no_signals)] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uucore::clap_localization::handle_clap_result(uu_app(), args)?; @@ -135,11 +144,10 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { // With the right extension trait we can remove it non-lossily, but // we print it lossily anyway, so no reason to bother. #[cfg(windows)] - let cwd = cwd - .to_string_lossy() - .strip_prefix(r"\\?\") - .map(Into::into) - .unwrap_or(cwd); + let cwd = { + let path = cwd.to_string_lossy(); + strip_windows_verbatim_prefix(&path).unwrap_or(cwd) + }; println_verbatim(cwd) .map_err_context(|| translate!("pwd-error-failed-to-print-current-directory"))?; diff --git a/src/uu/readlink/src/readlink.rs b/src/uu/readlink/src/readlink.rs index 89499cf388f..65596caec93 100644 --- a/src/uu/readlink/src/readlink.rs +++ b/src/uu/readlink/src/readlink.rs @@ -185,7 +185,22 @@ pub fn uu_app() -> Command { ) } +#[cfg(windows)] +fn strip_windows_verbatim_prefix(path: &str) -> Option { + if let Some(rest) = path.strip_prefix(r"\\?\UNC\") { + Some(PathBuf::from(format!(r"\\{rest}"))) + } else { + path.strip_prefix(r"\\?\").map(PathBuf::from) + } +} + fn show(path: &Path, line_ending: Option) -> std::io::Result<()> { + #[cfg(windows)] + let path = { + let path_str = path.to_string_lossy(); + strip_windows_verbatim_prefix(&path_str).unwrap_or_else(|| path.to_path_buf()) + }; + uucore::display::print_verbatim(path)?; if let Some(line_ending) = line_ending { write!(stdout(), "{line_ending}")?;