diff --git a/bufferevent.c b/bufferevent.c index 98799704..3960bcaf 100644 --- a/bufferevent.c +++ b/bufferevent.c @@ -358,6 +358,26 @@ bufferevent_setcb(struct bufferevent *bufev, BEV_UNLOCK(bufev); } +void +bufferevent_getcb(struct bufferevent *bufev, + bufferevent_data_cb *readcb_ptr, + bufferevent_data_cb *writecb_ptr, + bufferevent_event_cb *eventcb_ptr, + void **cbarg_ptr) +{ + BEV_LOCK(bufev); + if (readcb_ptr) + *readcb_ptr = bufev->readcb; + if (writecb_ptr) + *writecb_ptr = bufev->writecb; + if (eventcb_ptr) + *eventcb_ptr = bufev->errorcb; + if (cbarg_ptr) + *cbarg_ptr = bufev->cbarg; + + BEV_UNLOCK(bufev); +} + struct evbuffer * bufferevent_get_input(struct bufferevent *bufev) { diff --git a/include/event2/bufferevent.h b/include/event2/bufferevent.h index 82953db7..56fc7dce 100644 --- a/include/event2/bufferevent.h +++ b/include/event2/bufferevent.h @@ -300,6 +300,26 @@ void bufferevent_setcb(struct bufferevent *bufev, bufferevent_data_cb readcb, bufferevent_data_cb writecb, bufferevent_event_cb eventcb, void *cbarg); +/** + Retrieves the callbacks for a bufferevent. + + @param bufev the bufferevent to examine. + @param readcb_ptr if readcb_ptr is nonnull, *readcb_ptr is set to the current + read callback for the bufferevent. + @param writecb_ptr if writecb_ptr is nonnull, *writecb_ptr is set to the + current write callback for the bufferevent. + @param eventcb_ptr if eventcb_ptr is nonnull, *eventcb_ptr is set to the + current event callback for the bufferevent. + @param cbarg_ptr if cbarg_ptr is nonnull, *cbarg_ptr is set to the current + callback argument for the bufferevent. + @see buffervent_setcb() +*/ +void bufferevent_getcb(struct bufferevent *bufev, + bufferevent_data_cb *readcb_ptr, + bufferevent_data_cb *writecb_ptr, + bufferevent_event_cb *eventcb_ptr, + void **cbarg_ptr); + /** Changes the file descriptor on which the bufferevent operates. Not supported for all bufferevent types. diff --git a/test/regress_bufferevent.c b/test/regress_bufferevent.c index dae83f90..fad1a210 100644 --- a/test/regress_bufferevent.c +++ b/test/regress_bufferevent.c @@ -132,7 +132,7 @@ test_bufferevent_impl(int use_pair) tt_assert(0 == bufferevent_pair_new(NULL, 0, pair)); bev1 = pair[0]; bev2 = pair[1]; - bufferevent_setcb(bev1, readcb, writecb, errorcb, NULL); + bufferevent_setcb(bev1, readcb, writecb, errorcb, bev1); bufferevent_setcb(bev2, readcb, writecb, errorcb, NULL); tt_int_op(bufferevent_getfd(bev1), ==, -1); tt_ptr_op(bufferevent_get_underlying(bev1), ==, NULL); @@ -147,6 +147,18 @@ test_bufferevent_impl(int use_pair) tt_ptr_op(bufferevent_pair_get_partner(bev2), ==, NULL); } + { + /* Test getcb. */ + bufferevent_data_cb r, w; + bufferevent_event_cb e; + void *a; + bufferevent_getcb(bev1, &r, &w, &e, &a); + tt_ptr_op(r, ==, readcb); + tt_ptr_op(w, ==, writecb); + tt_ptr_op(e, ==, errorcb); + tt_ptr_op(a, ==, use_pair ? bev1 : NULL); + } + bufferevent_disable(bev1, EV_READ); bufferevent_enable(bev2, EV_READ);