summaryrefslogtreecommitdiff
path: root/bufferevent_sock.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2009-07-28 04:03:57 +0000
committerNick Mathewson <nickm@torproject.org>2009-07-28 04:03:57 +0000
commit709c21c48ca541c75bf803e6801c335d8ae3d043 (patch)
treeff87cc257ecf83765377ef01ce8c29cfa5d69cab /bufferevent_sock.c
parentb06b2649b4c7f5feaedea97c31001c14708e4d1f (diff)
downloadlibevent-709c21c48ca541c75bf803e6801c335d8ae3d043.tar.gz
Bufferevent support for openssl.
This code adds a new Bufferevent type that is only compiled when the openssl library is present. It supports using an SSL object and an event alert mechanism, which can either be an fd or an underlying bufferevent. There is still more work to do: the unit tests are incomplete, and we need to support flush and shutdown much better. Sometimes events are generated needlessly: this will hose performance. There's a new encrypting proxy in sample/le-proxy.c. This code has only been tested on OSX, and nowhere else. svn:r1382
Diffstat (limited to 'bufferevent_sock.c')
-rw-r--r--bufferevent_sock.c48
1 files changed, 16 insertions, 32 deletions
diff --git a/bufferevent_sock.c b/bufferevent_sock.c
index e0b3c5d3..50c139c6 100644
--- a/bufferevent_sock.c
+++ b/bufferevent_sock.c
@@ -88,14 +88,8 @@ const struct bufferevent_ops bufferevent_ops_socket = {
be_socket_ctrl,
};
-static int
-be_socket_add(struct event *ev, const struct timeval *tv)
-{
- if (tv->tv_sec == 0 && tv->tv_usec == 0)
- return event_add(ev, NULL);
- else
- return event_add(ev, tv);
-}
+#define be_socket_add(ev, t) \
+ _bufferevent_add_event((ev), (t))
static void
bufferevent_socket_outbuf_cb(struct evbuffer *buf,
@@ -285,45 +279,35 @@ bufferevent_socket_connect(struct bufferevent *bev,
struct bufferevent_private *bufev_p =
EVUTIL_UPCAST(bev, struct bufferevent_private, bev);
- int family = sa->sa_family;
evutil_socket_t fd;
- int made_socket = 0;
- int result = -1;
+ int r;
+ int result=-1;
_bufferevent_incref_and_lock(bev);
if (!bufev_p)
goto done;
- fd = event_get_fd(&bev->ev_read);
- if (fd < 0) {
- made_socket = 1;
- if ((fd = socket(family, SOCK_STREAM, 0)) < 0)
- goto done;
- if (evutil_make_socket_nonblocking(fd) < 0) {
- EVUTIL_CLOSESOCKET(fd);
- goto done;
- }
- be_socket_setfd(bev, fd);
+ fd = bufferevent_getfd(bev);
+ r = evutil_socket_connect(&fd, sa, socklen);
+ if (r < 0) {
+ _bufferevent_run_eventcb(bev, BEV_EVENT_ERROR);
+ /* do something about the error? */
+ goto done;
}
- if (connect(fd, sa, socklen)<0) {
- int e = evutil_socket_geterror(fd);
- if (EVUTIL_ERR_CONNECT_RETRIABLE(e)) {
- if (! be_socket_enable(bev, EV_WRITE)) {
- bufev_p->connecting = 1;
- result = 0;
- goto done;
- }
+ bufferevent_setfd(bev, fd);
+ if (r == 0) {
+ if (! bufferevent_enable(bev, EV_WRITE)) {
+ bufev_p->connecting = 1;
+ result = 0;
+ goto done;
}
- _bufferevent_run_eventcb(bev, BEV_EVENT_ERROR);
- /* do something about the error? */
} else {
/* The connect succeeded already. How odd. */
_bufferevent_run_eventcb(bev, BEV_EVENT_CONNECTED);
}
- result = 0;
done:
_bufferevent_decref_and_unlock(bev);
return result;