ssh: Treat "connection refused" on Windows
Slightly relax the conditions under which an error is considered to indicate that the SSH agent is not running, to accommodate differences in the API of named pipes on Windows vs. Unix domain sockets.
This commit is contained in:
parent
5099c25df7
commit
7425ae4b49
|
|
@ -52,7 +52,20 @@ pub enum Error {
|
||||||
|
|
||||||
impl Error {
|
impl Error {
|
||||||
pub fn is_not_running(&self) -> bool {
|
pub fn is_not_running(&self) -> bool {
|
||||||
matches!(self, Self::EnvVar { .. } | Self::BadAuthSock { .. })
|
match self {
|
||||||
|
Self::EnvVar { .. } | Self::BadAuthSock { .. } => true,
|
||||||
|
#[cfg(windows)]
|
||||||
|
Self::Connect { source, .. }
|
||||||
|
if source.kind() == std::io::ErrorKind::ConnectionRefused =>
|
||||||
|
{
|
||||||
|
// On Windows, a named pipe might be used, and if no
|
||||||
|
// agent is running, we might get a "connection refused"
|
||||||
|
// error, even though the `SSH_AUTH_SOCK` environment
|
||||||
|
// variable is set and the named pipe exists.
|
||||||
|
true
|
||||||
|
}
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -104,24 +117,20 @@ impl AgentClient<Stream> {
|
||||||
pub fn connect_env() -> Result<Self, Error> {
|
pub fn connect_env() -> Result<Self, Error> {
|
||||||
const SSH_AUTH_SOCK: &str = "SSH_AUTH_SOCK";
|
const SSH_AUTH_SOCK: &str = "SSH_AUTH_SOCK";
|
||||||
|
|
||||||
let path = match std::env::var(SSH_AUTH_SOCK) {
|
let var = std::env::var(SSH_AUTH_SOCK);
|
||||||
Ok(var) => var,
|
|
||||||
Err(err) => {
|
|
||||||
if cfg!(windows) {
|
|
||||||
// Windows uses a named pipe for the SSH agent, which
|
|
||||||
// we fall back to in case reading the environment
|
|
||||||
// variable fails.
|
|
||||||
"\\\\.\\pipe\\openssh-ssh-agent".to_string()
|
|
||||||
} else {
|
|
||||||
return Err(Error::EnvVar {
|
|
||||||
var: SSH_AUTH_SOCK.to_string(),
|
|
||||||
source: err,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Self::connect(path)
|
#[cfg(windows)]
|
||||||
|
let var = var.or({
|
||||||
|
// Windows uses a named pipe for the SSH agent, which
|
||||||
|
// we fall back to in case reading the environment
|
||||||
|
// variable fails.
|
||||||
|
Ok(r"\\.\pipe\openssh-ssh-agent".to_string())
|
||||||
|
});
|
||||||
|
|
||||||
|
Self::connect(var.map_err(|err| Error::EnvVar {
|
||||||
|
var: SSH_AUTH_SOCK.to_string(),
|
||||||
|
source: err,
|
||||||
|
})?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue