]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
implement isc_nm_cancelread()
authorEvan Hunt <each@isc.org>
Sat, 6 Jun 2020 00:32:36 +0000 (17:32 -0700)
committerEvan Hunt <each@isc.org>
Fri, 19 Jun 2020 19:33:26 +0000 (12:33 -0700)
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.

lib/isc/include/isc/netmgr.h
lib/isc/netmgr/netmgr-int.h
lib/isc/netmgr/netmgr.c
lib/isc/netmgr/tcp.c
lib/isc/win32/libisc.def.in

index 10b75bd171c62db5dddf3f41187e8ab860b53e31..0e2db629ea5d3668ed49c351180143c880421f52 100644 (file)
@@ -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);
 /*%<
index 5325c8cfbf87c6a21e216add7de9cd2edab27ab7..b0b4833e4bd3a9f0adf9b3c5cce93d76eddeb8a6 100644 (file)
@@ -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
index bf0f8efdd4153d928049fab72e67727d284f6eff..7fd029178c1906a4dae035c89342ef46db95384d 100644 (file)
@@ -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);
index 5e1a57ec7b1d06e4bb0dd0344b39c6c3f1540f3e..48c03148207368ce0c3a804e04e4b6b21b5bfc06 100644 (file)
@@ -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);
+       }
+}
index 723c6a95fde296becec43f21636ff025a3829787..4d6705feec0faeb8edbe6e29966de055c353b715 100644 (file)
@@ -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