version 1.158, 2004/06/21 17:36:31 |
version 1.159, 2005/01/05 08:51:32 |
|
|
* second). If proxy_command is non-NULL, it specifies the command (with %h |
* second). If proxy_command is non-NULL, it specifies the command (with %h |
* and %p substituted for host and port, respectively) to use to contact |
* and %p substituted for host and port, respectively) to use to contact |
* the daemon. |
* the daemon. |
* Return values: |
|
* 0 for OK |
|
* ECONNREFUSED if we got a "Connection Refused" by the peer on any address |
|
* ECONNABORTED if we failed without a "Connection refused" |
|
* Suitable error messages for the connection failure will already have been |
|
* printed. |
|
*/ |
*/ |
int |
int |
ssh_connect(const char *host, struct sockaddr_storage * hostaddr, |
ssh_connect(const char *host, struct sockaddr_storage * hostaddr, |
|
|
char ntop[NI_MAXHOST], strport[NI_MAXSERV]; |
char ntop[NI_MAXHOST], strport[NI_MAXSERV]; |
struct addrinfo hints, *ai, *aitop; |
struct addrinfo hints, *ai, *aitop; |
struct servent *sp; |
struct servent *sp; |
/* |
|
* Did we get only other errors than "Connection refused" (which |
|
* should block fallback to rsh and similar), or did we get at least |
|
* one "Connection refused"? |
|
*/ |
|
int full_failure = 1; |
|
|
|
debug2("ssh_connect: needpriv %d", needpriv); |
debug2("ssh_connect: needpriv %d", needpriv); |
|
|
|
|
memcpy(hostaddr, ai->ai_addr, ai->ai_addrlen); |
memcpy(hostaddr, ai->ai_addr, ai->ai_addrlen); |
break; |
break; |
} else { |
} else { |
if (errno == ECONNREFUSED) |
|
full_failure = 0; |
|
debug("connect to address %s port %s: %s", |
debug("connect to address %s port %s: %s", |
ntop, strport, strerror(errno)); |
ntop, strport, strerror(errno)); |
/* |
/* |
|
|
|
|
/* Return failure if we didn't get a successful connection. */ |
/* Return failure if we didn't get a successful connection. */ |
if (attempt >= connection_attempts) { |
if (attempt >= connection_attempts) { |
logit("ssh: connect to host %s port %s: %s", |
error("ssh: connect to host %s port %s: %s", |
host, strport, strerror(errno)); |
host, strport, strerror(errno)); |
return full_failure ? ECONNABORTED : ECONNREFUSED; |
return (-1); |
} |
} |
|
|
debug("Connection established."); |
debug("Connection established."); |