diff options
author | John Denker <jsd@av8n.com> | 2012-07-31 22:34:58 -0700 |
---|---|---|
committer | John Denker <jsd@av8n.com> | 2012-07-31 22:36:28 -0700 |
commit | ef6722750b4518fcb29bf983755b5f02451ef224 (patch) | |
tree | 966e94ffd01cd8abb59e16a6992e142db345aa9f /ucspi-tcp-0.88/timeoutconn6.c | |
parent | b95f5ec1d83519c603f6e2145865c14932c4a813 (diff) |
a bunch of files added by the ipv6 patch
Diffstat (limited to 'ucspi-tcp-0.88/timeoutconn6.c')
-rw-r--r-- | ucspi-tcp-0.88/timeoutconn6.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/ucspi-tcp-0.88/timeoutconn6.c b/ucspi-tcp-0.88/timeoutconn6.c new file mode 100644 index 0000000..75e9f5a --- /dev/null +++ b/ucspi-tcp-0.88/timeoutconn6.c @@ -0,0 +1,34 @@ +#include "ndelay.h" +#include "socket.h" +#include "iopause.h" +#include "error.h" +#include "timeoutconn.h" + +int timeoutconn6(int s,char ip[16],uint16 port,unsigned int timeout,uint32 netif) +{ + struct taia now; + struct taia deadline; + iopause_fd x; + + if (socket_connect6(s,ip,port,netif) == -1) { + if ((errno != error_wouldblock) && (errno != error_inprogress)) return -1; + x.fd = s; + x.events = IOPAUSE_WRITE; + taia_now(&now); + taia_uint(&deadline,timeout); + taia_add(&deadline,&now,&deadline); + for (;;) { + taia_now(&now); + iopause(&x,1,&deadline,&now); + if (x.revents) break; + if (taia_less(&deadline,&now)) { + errno = error_timeout; /* note that connect attempt is continuing */ + return -1; + } + } + if (!socket_connected(s)) return -1; + } + + if (ndelay_off(s) == -1) return -1; + return 0; +} |