ucspi-ssl  0.99e
TLS encryption for IPv6 communication
timeoutconn.c
Go to the documentation of this file.
1 #include "ndelay.h"
2 #include "socket.h"
3 #include "iopause.h"
4 #include "error.h"
5 #include "timeoutconn.h"
6 
7 int timeoutconn(int s,char ip[4],uint16 port,unsigned int timeout)
8 {
9  struct taia now;
10  struct taia deadline;
11  iopause_fd x;
12 
13  if (socket_connect4(s,ip,port) == -1) {
14  if ((errno != error_wouldblock) && (errno != error_inprogress)) return -1;
15  x.fd = s;
16  x.events = IOPAUSE_WRITE;
17  if (taia_now(&now) == -1) return -1;
18  taia_uint(&deadline,timeout);
19  taia_add(&deadline,&now,&deadline);
20  for (;;) {
21  if (taia_now(&now) == -1) return -1;
22  iopause(&x,1,&deadline,&now);
23  if (x.revents) break;
24  if (taia_less(&deadline,&now)) {
25  errno = error_timeout; /* note that connect attempt is continuing */
26  return -1;
27  }
28  }
29  if (!socket_connected(s)) return -1;
30  }
31 
32  if (ndelay_off(s) == -1) return -1;
33  return 0;
34 }
Definition: taia.h:8
int iopause(iopause_fd *x, unsigned int len, struct taia *deadline, struct taia *stamp)
Definition: iopause.c:7
int error_wouldblock
Definition: error.c:64
int taia_now(struct taia *)
Definition: taia_now.c:8
int taia_less(const struct taia *, const struct taia *)
Definition: taia_less.c:7
void taia_add(struct taia *, const struct taia *, const struct taia *)
Definition: taia_add.c:7
int timeoutconn(int s, char ip[4], uint16 port, unsigned int timeout)
Definition: timeoutconn.c:7
void taia_uint(struct taia *, unsigned int)
Definition: taia_uint.c:7
int socket_connect4(int, const char *, uint16)
int ndelay_off(int)
Definition: ndelay_off.c:11
int socket_connected(int)
Definition: socket_conn.c:21
unsigned short uint16
Definition: uint16.h:4
int error_timeout
Definition: error.c:50
int error_inprogress
Definition: error.c:57
unsigned long timeout
Definition: sslhandle.c:67