From: Evan Hunt Date: Sat, 6 Jun 2020 00:32:36 +0000 (-0700) Subject: implement isc_nm_cancelread() X-Git-Tag: v9.17.3~49^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5191ec8f86717c0c709aff8971b26951ab5f7353;p=thirdparty%2Fbind9.git implement isc_nm_cancelread() The isc_nm_cancelread() function cancels reading on a connected socket and calls its read callback function with a 'result' parameter of ISC_R_CANCELED. --- diff --git a/lib/isc/include/isc/netmgr.h b/lib/isc/include/isc/netmgr.h index 10b75bd171c..0e2db629ea5 100644 --- a/lib/isc/include/isc/netmgr.h +++ b/lib/isc/include/isc/netmgr.h @@ -192,6 +192,17 @@ isc_nm_pauseread(isc_nmsocket_t *sock); * Pause reading on this socket, while still remembering the callback. */ +void +isc_nm_cancelread(isc_nmhandle_t *handle); +/*%< + * Cancel reading on a connected socket. Calls the read/recv callback on + * active handles with a result code of ISC_R_CANCELED. + * + * Requires: + * \li 'sock' is a valid netmgr socket + * \li ...for which a read/recv callback has been defined. + */ + isc_result_t isc_nm_resumeread(isc_nmsocket_t *sock); /*%< diff --git a/lib/isc/netmgr/netmgr-int.h b/lib/isc/netmgr/netmgr-int.h index 5325c8cfbf8..b0b4833e4bd 100644 --- a/lib/isc/netmgr/netmgr-int.h +++ b/lib/isc/netmgr/netmgr-int.h @@ -715,7 +715,14 @@ isc__nm_tcp_resumeread(isc_nmsocket_t *sock); void isc__nm_tcp_shutdown(isc_nmsocket_t *sock); /*%< - * Called on shutdown to close and clean up a listening TCP socket. + * Called during the shutdown process to close and clean up connected + * sockets. + */ + +void +isc__nm_tcp_cancelread(isc_nmsocket_t *sock); +/*%< + * Stop reading on a connected socket. */ void diff --git a/lib/isc/netmgr/netmgr.c b/lib/isc/netmgr/netmgr.c index bf0f8efdd41..7fd029178c1 100644 --- a/lib/isc/netmgr/netmgr.c +++ b/lib/isc/netmgr/netmgr.c @@ -1348,9 +1348,24 @@ isc_nm_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) { } } +void +isc_nm_cancelread(isc_nmhandle_t *handle) { + REQUIRE(VALID_NMHANDLE(handle)); + + switch (handle->sock->type) { + case isc_nm_tcpsocket: + isc__nm_tcp_cancelread(handle->sock); + break; + default: + INSIST(0); + ISC_UNREACHABLE(); + } +} + isc_result_t isc_nm_pauseread(isc_nmsocket_t *sock) { REQUIRE(VALID_NMSOCK(sock)); + switch (sock->type) { case isc_nm_tcpsocket: return (isc__nm_tcp_pauseread(sock)); @@ -1363,6 +1378,7 @@ isc_nm_pauseread(isc_nmsocket_t *sock) { isc_result_t isc_nm_resumeread(isc_nmsocket_t *sock) { REQUIRE(VALID_NMSOCK(sock)); + switch (sock->type) { case isc_nm_tcpsocket: return (isc__nm_tcp_resumeread(sock)); @@ -1375,6 +1391,7 @@ isc_nm_resumeread(isc_nmsocket_t *sock) { void isc_nm_stoplistening(isc_nmsocket_t *sock) { REQUIRE(VALID_NMSOCK(sock)); + switch (sock->type) { case isc_nm_udplistener: isc__nm_udp_stoplistening(sock); diff --git a/lib/isc/netmgr/tcp.c b/lib/isc/netmgr/tcp.c index 5e1a57ec7b1..48c03148207 100644 --- a/lib/isc/netmgr/tcp.c +++ b/lib/isc/netmgr/tcp.c @@ -1079,3 +1079,15 @@ isc__nm_tcp_shutdown(isc_nmsocket_t *sock) { sock->rcb.recv(sock->tcphandle, NULL, sock->rcbarg); } } + +void +isc__nm_tcp_cancelread(isc_nmsocket_t *sock) { + REQUIRE(VALID_NMSOCK(sock)); + + if (sock->type == isc_nm_tcpsocket && sock->tcphandle != NULL && + sock->rcb.recv != NULL) + { + sock->rcb.recv(sock->tcphandle, ISC_R_CANCELED, NULL, + sock->rcbarg); + } +} diff --git a/lib/isc/win32/libisc.def.in b/lib/isc/win32/libisc.def.in index 723c6a95fde..4d6705feec0 100644 --- a/lib/isc/win32/libisc.def.in +++ b/lib/isc/win32/libisc.def.in @@ -449,6 +449,7 @@ isc_nmhandle_peeraddr isc_nmhandle_ref isc_nmhandle_setdata isc_nmhandle_unref +isc_nm_cancelread isc_nm_closedown isc_nm_destroy isc_nm_detach