Improve ssh_connect_ai_timeout().

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@727 7dcaeef0-15fb-0310-b436-a5af3365683c
This commit is contained in:
Andreas Schneider
2009-05-05 07:55:24 +00:00
parent 83b26b97b5
commit 7568e42f4e

View File

@@ -111,48 +111,61 @@ static int getai(const char *host, int port, struct addrinfo **ai) {
} }
static int ssh_connect_ai_timeout(SSH_SESSION *session, const char *host, static int ssh_connect_ai_timeout(SSH_SESSION *session, const char *host,
int port, struct addrinfo *ai, long timeout, long usec,socket_t s) int port, struct addrinfo *ai, long timeout, long usec, socket_t s) {
{ struct timeval to;
struct timeval to; fd_set set;
fd_set set; int rc = 0;
int ret=0; unsigned int len = sizeof(rc);
unsigned int len=sizeof(ret);
enter_function(); enter_function();
to.tv_sec=timeout;
to.tv_usec=usec; to.tv_sec = timeout;
sock_set_nonblocking(s); to.tv_usec = usec;
connect(s,ai->ai_addr,ai->ai_addrlen);
freeaddrinfo(ai); sock_set_nonblocking(s);
FD_ZERO(&set);
FD_SET(s,&set); /* The return value is checked later */
ret=select(s+1,NULL,&set,NULL,&to); connect(s, ai->ai_addr, ai->ai_addrlen);
if(ret==0){ freeaddrinfo(ai);
/* timeout */
ssh_set_error(session,SSH_FATAL,"Timeout while connecting to %s:%d",host,port); FD_ZERO(&set);
close(s); FD_SET(s, &set);
leave_function();
return -1; rc = select(s + 1, NULL, &set, NULL, &to);
} if (rc == 0) {
if(ret<0){ /* timeout */
ssh_set_error(session,SSH_FATAL,"Select error : %s",strerror(errno)); ssh_set_error(session, SSH_FATAL,
close(s); "Timeout while connecting to %s:%d", host, port);
leave_function(); close(s);
return -1;
}
ret = 0;
/* get connect(2) return code. zero means no error */
getsockopt(s,SOL_SOCKET,SO_ERROR,(char *)&ret,&len);
if (ret!=0){
ssh_set_error(session,SSH_FATAL,"Connecting : %s",strerror(ret));
close(s);
leave_function();
return -1;
}
/* s is connected ? */
ssh_log(session,SSH_LOG_PACKET,"socket connected with timeout\n");
sock_set_blocking(s);
leave_function(); leave_function();
return s; return -1;
}
if (rc < 0) {
ssh_set_error(session, SSH_FATAL,
"Select error: %s", strerror(errno));
close(s);
leave_function();
return -1;
}
rc = 0;
/* Get connect(2) return code. Zero means no error */
getsockopt(s, SOL_SOCKET, SO_ERROR,(char *) &rc, &len);
if (rc != 0) {
ssh_set_error(session, SSH_FATAL,
"Connect to %s:%d failed: %s", host, port, strerror(rc));
close(s);
leave_function();
return -1;
}
/* s is connected ? */
ssh_log(session, SSH_LOG_PACKET, "Socket connected with timeout\n");
sock_set_blocking(s);
leave_function();
return s;
} }
/** \internal /** \internal