fehQlibs 30
Qlibs
Loading...
Searching...
No Matches
timeoutconn.c
Go to the documentation of this file.
1#include "ndelay.h"
2#include "socket_if.h"
3#include "iopause.h"
4#include "error.h"
5#include "timeoutconn.h"
6#include "ip.h"
7
15int timeoutconn4(int s,char ip[4],uint16 port,unsigned int timeout)
16{
17 struct taia now;
18 struct taia deadline;
19 iopause_fd x;
20
21 if (socket_connect4(s,ip,port) == -1) {
22 if ((errno != EWOULDBLOCK) && (errno != EINPROGRESS)) return -1;
23 x.fd = s;
24 x.events = IOPAUSE_WRITE;
25 taia_now(&now);
26 taia_uint(&deadline,timeout);
27 taia_add(&deadline,&now,&deadline);
28 for (;;) {
29 taia_now(&now);
30 iopause(&x,1,&deadline,&now);
31 if (x.revents) break; /* 's' available */
32 if (taia_less(&deadline,&now)) {
33 errno = ETIMEDOUT; /* note that connect attempt is continuing */
34 return -1;
35 }
36 }
37 if (!socket_connected(s)) return -1;
38 }
39
40 if (ndelay_off(s) == -1) return -1;
41 return 0;
42}
43
44int timeoutconn6(int s,char ip[16],uint16 port,unsigned int timeout,uint32 netif)
45{
46 struct taia now;
47 struct taia deadline;
48 iopause_fd x;
49
50 if (socket_connect6(s,ip,port,netif) == -1) {
51 if ((errno != EWOULDBLOCK) && (errno != EINPROGRESS)) return -1;
52 x.fd = s;
53 x.events = IOPAUSE_WRITE;
54 taia_now(&now);
55 taia_uint(&deadline,timeout);
56 taia_add(&deadline,&now,&deadline);
57 for (;;) {
58 taia_now(&now);
59 iopause(&x,1,&deadline,&now);
60 if (x.revents) break; /* 's' available */
61 if (taia_less(&deadline,&now)) {
62 errno = ETIMEDOUT; /* note that connect attempt is continuing */
63 return -1;
64 }
65 }
66 if (!socket_connected(s)) return -1;
67 }
68
69 if (ndelay_off(s) == -1) return -1;
70 return 0;
71}
72
73int timeoutconn(int s,char ip[16],uint16 port,unsigned int timeout,uint32 netif)
74{
75 struct taia now;
76 struct taia deadline;
77 iopause_fd x;
78 int r;
79
80 if (ip6_isv4mapped(ip))
81 r = socket_connect4(s,ip + 12,port);
82 else
83 r = socket_connect6(s,ip,port,netif);
84
85 if (r == -1) {
86 if ((errno != EWOULDBLOCK) && (errno != EINPROGRESS)) return -1;
87 x.fd = s;
88 x.events = IOPAUSE_WRITE;
89 taia_now(&now);
90 taia_uint(&deadline,timeout);
91 taia_add(&deadline,&now,&deadline);
92 for (;;) {
93 taia_now(&now);
94 iopause(&x,1,&deadline,&now);
95 if (x.revents) break; /* 's' available */
96 if (taia_less(&deadline,&now)) {
97 errno = ETIMEDOUT; /* note that connect attempt is continuing */
98 return -1;
99 }
100 }
101 if (!socket_connected(s)) return -1;
102 }
103
104 if (ndelay_off(s) == -1) return -1;
105 return 0;
106}
uint16_t uint16
Definition: uint_t.h:62
uint32_t uint32
Definition: uint_t.h:73
int socket_connect6(int, const char[16], uint16, uint32)
int socket_connected(int)
int socket_connect4(int, const char[4], uint16)
int taia_less(struct taia *, struct taia *)
Definition: taia.c:39
void taia_add(struct taia *, struct taia *, struct taia *)
Definition: taia.c:14
void taia_uint(struct taia *, unsigned int)
Definition: taia.c:99
int taia_now(struct taia *)
Definition: taia.c:48
#define IOPAUSE_WRITE
Definition: iopause.h:20
int iopause(iopause_fd *, unsigned int, struct taia *, struct taia *)
Definition: iopause.c:14
int ndelay_off(int)
Definition: ndelay.c:21
#define ip6_isv4mapped(ip)
Definition: ip.h:107
int timeoutconn(int s, char ip[16], uint16 port, unsigned int timeout, uint32 netif)
Definition: timeoutconn.c:73
int timeoutconn4(int s, char ip[4], uint16 port, unsigned int timeout)
Definition: timeoutconn.c:15
int timeoutconn6(int s, char ip[16], uint16 port, unsigned int timeout, uint32 netif)
Definition: timeoutconn.c:44
int fd
Definition: iopause.h:15
Definition: taia.h:13