Add error callback to evconnlistener

This commit is contained in:
Simon Perreault 2010-09-20 12:47:39 -04:00 committed by Nick Mathewson
parent e1198997bc
commit c4be8d82b3
2 changed files with 23 additions and 1 deletions

View File

@ -47,6 +47,14 @@ struct evconnlistener;
*/
typedef void (*evconnlistener_cb)(struct evconnlistener *, evutil_socket_t, struct sockaddr *, int socklen, void *);
/**
A callback that we invoke when a listener encounters a non-retriable error.
@param listener The evconnlistener
@param user_arg the pointer passed to evconnlistener_new()
*/
typedef void (*evconnlistener_errorcb)(struct evconnlistener *, void *);
/** Flag: Indicates that we should not make incoming sockets nonblocking
* before passing them to the callback. */
#define LEV_OPT_LEAVE_SOCKETS_BLOCKING (1u<<0)
@ -112,6 +120,10 @@ struct event_base *evconnlistener_get_base(struct evconnlistener *lev);
/** Return the socket that an evconnlistner is listening on. */
evutil_socket_t evconnlistener_get_fd(struct evconnlistener *lev);
/** Set an evconnlistener's error callback. */
void evconnlistener_set_error_cb(struct evconnlistener *lev,
evconnlistener_errorcb errorcb);
#ifdef __cplusplus
}
#endif

View File

@ -67,6 +67,7 @@ struct evconnlistener_ops {
struct evconnlistener {
const struct evconnlistener_ops *ops;
evconnlistener_cb cb;
evconnlistener_errorcb errorcb;
void *user_data;
unsigned flags;
};
@ -275,6 +276,12 @@ event_listener_getbase(struct evconnlistener *lev)
return event_get_base(&lev_e->listener);
}
void evconnlistener_set_error_cb(struct evconnlistener *lev,
evconnlistener_errorcb errorcb)
{
lev->errorcb = errorcb;
}
static void
listener_read_cb(evutil_socket_t fd, short what, void *p)
{
@ -297,7 +304,10 @@ listener_read_cb(evutil_socket_t fd, short what, void *p)
err = evutil_socket_geterror(fd);
if (EVUTIL_ERR_ACCEPT_RETRIABLE(err))
return;
event_sock_warn(fd, "Error from accept() call");
if (lev->errorcb != NULL)
lev->errorcb(lev, lev->user_data);
else
event_sock_warn(fd, "Error from accept() call");
}
#ifdef WIN32