ucspi-ssl 0.13.03
ucspi-ssl
Loading...
Searching...
No Matches
ssl_timeout.c
Go to the documentation of this file.
1#include "ucspissl.h"
2#include "iopause.h"
3#include "logmsg.h"
4
5#define WHO "ssl_timeout"
6
7int ssl_timeoutaccept(SSL *ssl,unsigned int timeout)
8{
9 struct taia now;
10 struct taia deadline;
11 iopause_fd x;
12 int r;
13 int rfd;
14 int wfd;
15
16 if (taia_now(&now) == -1) {
17 errno = ETIMEDOUT;
18 return -1;
19 }
20 taia_uint(&deadline,timeout);
21 taia_add(&deadline,&now,&deadline);
22
23 rfd = SSL_get_fd(ssl); /* XXX */
24 wfd = SSL_get_fd(ssl); /* XXX */
25
26 SSL_set_accept_state(ssl);
27
28 for (;;) {
29 r = SSL_accept(ssl);
30 if (r == 1) return 0;
31 ssl_errno = SSL_get_error(ssl,r);
32 errno = EPROTO;
33 if ((ssl_errno != SSL_ERROR_WANT_READ) && (ssl_errno != SSL_ERROR_WANT_WRITE))
34 return -1;
35 if (ssl_errno == SSL_ERROR_WANT_READ) {
36 x.events = IOPAUSE_READ;
37 x.fd = rfd;
38 if (x.fd == -1) return -1;
39 }
40 else {
41 x.events = IOPAUSE_WRITE;
42 x.fd = wfd;
43 if (x.fd == -1) return -1;
44 }
45 for (;;) {
46 if (taia_now(&now) == -1) {
47 errno = ETIMEDOUT;
48 return -1;
49 }
50 iopause(&x,1,&deadline,&now);
51 if (x.revents) break;
52 if (taia_less(&deadline,&now)) {
53 errno = ETIMEDOUT;
54 return -1;
55 }
56 }
57 }
58}
59
60int ssl_timeoutconn(SSL *ssl,unsigned int timeout)
61{
62 struct taia now;
63 struct taia deadline;
64 iopause_fd x;
65 int r;
66 int rfd;
67 int wfd;
68
69 taia_now(&now);
70 taia_uint(&deadline,timeout);
71 taia_add(&deadline,&now,&deadline);
72
73 rfd = SSL_get_fd(ssl); /* XXX */
74 wfd = SSL_get_fd(ssl); /* XXX */
75
76 SSL_set_connect_state(ssl);
77
78 for (;;) {
79 r = SSL_connect(ssl);
80 errno = EPROTO;
81 if (r == 1) return 0;
82 ssl_errno = SSL_get_error(ssl,r);
83 if ((ssl_errno != SSL_ERROR_WANT_READ) && (ssl_errno != SSL_ERROR_WANT_WRITE))
84 return -1;
85 if (ssl_errno == SSL_ERROR_WANT_READ) {
86 x.events = IOPAUSE_READ;
87 x.fd = rfd;
88 if (x.fd == -1) return -1;
89 }
90 else {
91 x.events = IOPAUSE_WRITE;
92 x.fd = wfd;
93 if (x.fd == -1) return -1;
94 }
95 for (;;) {
96 if (taia_now(&now) == -1) {
97 errno = ETIMEDOUT;
98 return -1;
99 }
100 iopause(&x,1,&deadline,&now);
101 if (x.revents) break;
102 if (taia_less(&deadline,&now)) {
103 errno = ETIMEDOUT;
104 return -1;
105 }
106 }
107 }
108}
109
110stralloc sslerror = {0};
111
113{
114 char buf[256];
115 unsigned long err;
116
117 if (!stralloc_copys(&sslerror,"")) return -1;
118
119 while ((err = ERR_get_error()) != 0) {
120 ERR_error_string_n(err,buf,sizeof(buf));
121 if (!stralloc_cats(&sslerror,buf)) return -1;
122 if (!stralloc_cats(&sslerror," ")) return -1;
123 }
124 return err;
125}
int ssl_verberror(void)
Definition: ssl_timeout.c:112
int ssl_timeoutaccept(SSL *ssl, unsigned int timeout)
Definition: ssl_timeout.c:7
int ssl_timeoutconn(SSL *ssl, unsigned int timeout)
Definition: ssl_timeout.c:60
stralloc sslerror
Definition: ssl_timeout.c:110
unsigned long timeout
Definition: sslhandle.c:66
char buf[SSL_NAME_LEN]
Definition: sslhandle.c:127
int ssl_errno
Definition: ucspissl.c:3
Header file to be used with sqmail; previously called ssl.h. (name clash)