]> 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)
committerOndřej Surý <ondrej@isc.org>
Thu, 1 Oct 2020 14:44:43 +0000 (16:44 +0200)
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.

(cherry picked from commit 5191ec8f86717c0c709aff8971b26951ab5f7353)

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 1c9fb8f4c10d658b9ec7393b7ac3ce5ff87c22dd..f20861b4e2a70a13c1f22daff5ea756885958fb7 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 ecb6cadda32741ea01de91922dbfff9448dcee5b..2cc0c93299422c44f3488dbe323585921acbed68 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 0ecd2cd87db10dd095938ffe6879cca3bbc14105..bf6b0fda8ae0572c75b02a0a6af904ab5e8b376d 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 38afd00ddbb60ef08d0e1cc406ad81d8d4a49dfe..7fc3d0f1260774a56f9e77b25d994c3768ddef44 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 ad27e4b35ff123d670edc295cec5ad9b982f43fc..2965723660b9b13cab2c504b9480eac8001c97d0 100644 (file)
@@ -453,6 +453,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