2 #include <sys/socket.h>
3 #include <netinet/in.h>
11 #include "timeoutconn.h"
13 int timeoutconn(s,ip,port,timeout)
15 struct ip_address *ip;
20 struct sockaddr_in sin;
25 byte_zero(&sin,sizeof(sin));
26 byte_copy(&sin.sin_addr,4,ip);
27 x = (char *) &sin.sin_port;
28 x[1] = port; port >>= 8; x[0] = port;
29 sin.sin_family = AF_INET;
31 if (ndelay_on(s) == -1) return -1;
33 /* XXX: could bind s */
35 if (connect(s,(struct sockaddr *) &sin,sizeof(sin)) == 0) {
39 if ((errno != error_inprogress) && (errno != error_wouldblock)) return -1;
43 tv.tv_sec = timeout; tv.tv_usec = 0;
45 if (select(s + 1,(fd_set *) 0,&wfds,(fd_set *) 0,&tv) == -1) return -1;
46 if (FD_ISSET(s,&wfds)) {
49 if (getpeername(s,(struct sockaddr *) &sin,&dummy) == -1) {
57 errno = error_timeout; /* note that connect attempt is continuing */