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