]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/connection.c
Merge remote branch 'origin/mdb.master'
[openldap] / servers / slapd / connection.c
index 130838ced8f51f17c8a99d4df6685f0cfb53d408..7f9cd8adbf3713228220bd48f65062ce66f985cf 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2011 The OpenLDAP Foundation.
+ * Copyright 1998-2012 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -209,7 +209,7 @@ int connections_shutdown(void)
 int connections_timeout_idle(time_t now)
 {
        int i = 0, writers = 0;
-       int connindex;
+       ber_socket_t connindex;
        Connection* c;
        time_t old;
 
@@ -225,7 +225,6 @@ int connections_timeout_idle(time_t now)
                 */
                if(( c->c_n_ops_executing && !c->c_writewaiter)
                        || c->c_conn_state == SLAP_C_CLIENT ) {
-                       connection_done( c );
                        continue;
                }
 
@@ -247,8 +246,8 @@ int connections_timeout_idle(time_t now)
                                continue;
                        }
                }
-               connection_done( c );
        }
+       connection_done( c );
        if ( old && !writers )
                slapd_clr_writetime( old );
 
@@ -259,7 +258,7 @@ int connections_timeout_idle(time_t now)
 void connections_drop()
 {
        Connection* c;
-       int connindex;
+       ber_socket_t connindex;
 
        for( c = connection_first( &connindex );
                c != NULL;
@@ -270,12 +269,12 @@ void connections_drop()
                 */
                if(( c->c_n_ops_executing && !c->c_writewaiter)
                        || c->c_conn_state == SLAP_C_CLIENT ) {
-                       connection_done( c );
                        continue;
                }
                connection_closing( c, "dropping" );
                connection_close( c );
        }
+       connection_done( c );
 }
 
 static Connection* connection_get( ber_socket_t s )
@@ -865,6 +864,17 @@ unsigned long connections_nextid(void)
        return id;
 }
 
+/*
+ * Loop through the connections:
+ *
+ *     for (c = connection_first(&i); c; c = connection_next(c, &i)) ...;
+ *     connection_done(c);
+ *
+ * 'i' is the cursor, initialized by connection_first().
+ * 'c_mutex' is locked in the returned connection.  The functions must
+ * be passed the previous return value so they can unlock it again.
+ */
+
 Connection* connection_first( ber_socket_t *index )
 {
        assert( connections != NULL );
@@ -881,6 +891,7 @@ Connection* connection_first( ber_socket_t *index )
        return connection_next(NULL, index);
 }
 
+/* Next connection in loop, see connection_first() */
 Connection* connection_next( Connection *c, ber_socket_t *index )
 {
        assert( connections != NULL );
@@ -929,6 +940,7 @@ Connection* connection_next( Connection *c, ber_socket_t *index )
        return c;
 }
 
+/* End connection loop, see connection_first() */
 void connection_done( Connection *c )
 {
        assert( connections != NULL );
@@ -1500,12 +1512,20 @@ connection_input( Connection *conn , conn_readinfo *cri )
 #ifdef LDAP_CONNECTIONLESS
        if ( conn->c_is_udp ) {
                char peername[sizeof("IP=255.255.255.255:65336")];
+               const char *peeraddr_string = NULL;
 
                len = ber_int_sb_read(conn->c_sb, &peeraddr, sizeof(struct sockaddr));
                if (len != sizeof(struct sockaddr)) return 1;
 
+#if defined( HAVE_GETADDRINFO ) && defined( HAVE_INET_NTOP )
+               char addr[INET_ADDRSTRLEN];
+               peeraddr_string = inet_ntop( AF_INET, &peeraddr.sa_in_addr.sin_addr,
+                          addr, sizeof(addr) );
+#else /* ! HAVE_GETADDRINFO || ! HAVE_INET_NTOP */
+               peeraddr_string = inet_ntoa( peeraddr.sa_in_addr.sin_addr );
+#endif /* ! HAVE_GETADDRINFO || ! HAVE_INET_NTOP */
                sprintf( peername, "IP=%s:%d",
-                       inet_ntoa( peeraddr.sa_in_addr.sin_addr ),
+                        peeraddr_string,
                        (unsigned) ntohs( peeraddr.sa_in_addr.sin_port ) );
                Statslog( LDAP_DEBUG_STATS,
                        "conn=%lu UDP request from %s (%s) accepted.\n",
@@ -1885,8 +1905,6 @@ int connection_write(ber_socket_t s)
 
        assert( connections != NULL );
 
-       slapd_clr_write( s, 0 );
-
        c = connection_get( s );
        if( c == NULL ) {
                Debug( LDAP_DEBUG_ANY,
@@ -1895,6 +1913,8 @@ int connection_write(ber_socket_t s)
                return -1;
        }
 
+       slapd_clr_write( s, 0 );
+
 #ifdef HAVE_TLS
        if ( c->c_is_tls && c->c_needs_tls_accept ) {
                connection_return( c );