]> granicus.if.org Git - libevent/commitdiff
Add error callback to evconnlistener
authorSimon Perreault <simon.perreault@viagenie.ca>
Mon, 20 Sep 2010 16:47:39 +0000 (12:47 -0400)
committerNick Mathewson <nickm@torproject.org>
Wed, 22 Sep 2010 19:54:18 +0000 (15:54 -0400)
include/event2/listener.h
listener.c

index fa4e949988faee4b18006e45dd60362b76819182..372043603fb22eea4a837c469f1da7a7a00774a4 100644 (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
index edfdaefca4c6bac353b5a0aa2a9260dac10d5dec..335091d93413857e536d385bd3dbf2205e7dd52b 100644 (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