mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-18 16:54:42 -04:00
Add error callback to evconnlistener
This commit is contained in:
parent
e1198997bc
commit
c4be8d82b3
@ -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
|
||||
|
12
listener.c
12
listener.c
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user