]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Connection write support
authorOndřej Kuzník <ondra@mistotebe.net>
Thu, 16 Mar 2017 12:19:31 +0000 (12:19 +0000)
committerOndřej Kuzník <okuznik@symas.com>
Tue, 17 Nov 2020 17:42:43 +0000 (17:42 +0000)
servers/lloadd/client.c
servers/lloadd/slap.h
servers/lloadd/upstream.c

index 7dfac6a48653a5eafba57bc8bf130954f049e81b..faee2637f5da1c6f7a59c5688788cdc34b8af692 100644 (file)
@@ -42,6 +42,24 @@ void
 client_write_cb( evutil_socket_t s, short what, void *arg )
 {
     Connection *c = arg;
+
+    ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
+    Debug( LDAP_DEBUG_CONNS, "client_write_cb: "
+            "have something to write to client %lu\n",
+            c->c_connid );
+
+    if ( ber_flush( c->c_sb, c->c_pendingber, 1 ) ) {
+        int err = sock_errno();
+        if ( err != EWOULDBLOCK && err != EAGAIN ) {
+            ldap_pvt_thread_mutex_lock( &c->c_mutex );
+            ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+            client_destroy( c );
+            return;
+        }
+        event_add( c->c_write_event, NULL );
+    }
+    c->c_pendingber = NULL;
+    ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
 }
 
 Connection *
index bceed14bacffbaa4c99206789c234bdca345e7bd..7eebeeaca0366c025c5ec431ad970a451e51b093 100644 (file)
@@ -285,8 +285,8 @@ struct Connection {
 
     ldap_pvt_thread_mutex_t c_io_mutex; /* only one pdu written at a time */
 
-    BerElement *c_currentber;   /* ber we're attempting to read */
-    struct berval c_pendingber; /* ber we're attempting to write */
+    BerElement *c_currentber; /* ber we're attempting to read */
+    BerElement *c_pendingber; /* ber we're attempting to write */
 
 #define CONN_IS_TLS 1
 #define CONN_IS_CLIENT 4
index 5cc883fdd3da27f9d8c9bf9ba99f9e7836280d94..453b9ab0db88ec999e7bb0d5ebabe2074b7d11ef 100644 (file)
@@ -39,6 +39,27 @@ void
 upstream_write_cb( evutil_socket_t s, short what, void *arg )
 {
     Connection *c = arg;
+
+    ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
+    Debug( LDAP_DEBUG_CONNS, "upstream_write_cb: "
+            "have something to write to upstream %lu\n",
+            c->c_connid );
+
+    if ( ber_flush( c->c_sb, c->c_pendingber, 1 ) ) {
+        int err = sock_errno();
+        if ( err != EWOULDBLOCK && err != EAGAIN ) {
+            ldap_pvt_thread_mutex_lock( &c->c_mutex );
+            Debug( LDAP_DEBUG_ANY, "upstream_write_cb: "
+                    "error writing to connection %ld\n",
+                    c->c_connid );
+            ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+            upstream_destroy( c );
+            return;
+        }
+        event_add( c->c_write_event, 0 );
+    }
+    c->c_pendingber = NULL;
+    ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
 }
 
 Connection *