src/server/util/io.c

changeset 106
b122f34ddc80
parent 104
a8acbb12f27c
child 110
43a746e905f6
child 111
c93be34fde76
equal deleted inserted replaced
105:63d9051fe35c 106:b122f34ddc80
57 (io_writev_f)net_stream_writev, 57 (io_writev_f)net_stream_writev,
58 (io_read_f)net_stream_read, 58 (io_read_f)net_stream_read,
59 (io_sendfile_f)net_stream_sendfile, 59 (io_sendfile_f)net_stream_sendfile,
60 (io_close_f)net_stream_close, 60 (io_close_f)net_stream_close,
61 (io_finish_f)net_stream_finish 61 (io_finish_f)net_stream_finish
62 };
63
64 IOStream ssl_io_funcs = {
65 (io_write_f)net_ssl_write,
66 (io_writev_f)net_ssl_writev,
67 (io_read_f)net_ssl_read,
68 NULL,
69 (io_close_f)net_ssl_close,
70 (io_finish_f)net_ssl_finish
62 }; 71 };
63 72
64 73
65 IOStream* stream_new_from_fd(pool_handle_t *pool, int fd) { 74 IOStream* stream_new_from_fd(pool_handle_t *pool, int fd) {
66 SystemIOStream *st = pool_malloc(pool, sizeof(SystemIOStream)); 75 SystemIOStream *st = pool_malloc(pool, sizeof(SystemIOStream));
189 198
190 void net_stream_finish(NetIOStream *st) { 199 void net_stream_finish(NetIOStream *st) {
191 if(st->chunked_enc) { 200 if(st->chunked_enc) {
192 write(st->fd, "0\r\n\r\n", 5); 201 write(st->fd, "0\r\n\r\n", 5);
193 } 202 }
203 }
204
205
206 /* ssl stream */
207 IOStream* net_ssl_stream(pool_handle_t *pool, SSL *ssl) {
208 SSLStream *st = pool_malloc(pool, sizeof(SSLStream));
209 st->st = ssl_io_funcs;
210 st->ssl = ssl;
211 return (IOStream*)st;
212 }
213
214 ssize_t net_ssl_write(SSLStream *st, void *buf, size_t nbytes) {
215 return SSL_write(st->ssl, buf, nbytes);
216 }
217
218 ssize_t net_ssl_writev(SSLStream *st, struct iovec *iovec, int iovcnt) {
219 ssize_t r = 0;
220 for(int i=0;i<iovcnt;i++) {
221 int ret = SSL_write(st->ssl, iovec[i].iov_base, iovec[i].iov_len);
222 if(ret <= 0) {
223 return 0;
224 }
225 r += ret;
226 }
227 return r;
228 }
229
230 ssize_t net_ssl_read(SSLStream *st, void *buf, size_t nbytes) {
231 return SSL_read(st->ssl, buf, nbytes);
232 }
233
234 void net_ssl_close(SSLStream *st) {
235 SSL_shutdown(st->ssl);
236 close(SSL_get_fd(st->ssl));
237 }
238
239 void net_ssl_finish(SSLStream *st) {
240
194 } 241 }
195 242
196 243
197 ssize_t net_read(SYS_NETFD fd, void *buf, size_t nbytes) { 244 ssize_t net_read(SYS_NETFD fd, void *buf, size_t nbytes) {
198 ssize_t r = ((IOStream*)fd)->read(fd, buf, nbytes); 245 ssize_t r = ((IOStream*)fd)->read(fd, buf, nbytes);

mercurial