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 */