]> git.sur5r.net Git - openldap/commitdiff
sync update
authorKurt Zeilenga <kurt@openldap.org>
Mon, 31 Jan 2005 16:53:39 +0000 (16:53 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Mon, 31 Jan 2005 16:53:39 +0000 (16:53 +0000)
restart fix

CHANGES
libraries/libldap/addentry.c
libraries/libldap/error.c
libraries/libldap/ldap-int.h
libraries/libldap/os-ip.c
libraries/libldap/result.c

diff --git a/CHANGES b/CHANGES
index 43d4455be67bc80754dd7d4cd513b8178a0ca73f..f22e8dbe5db9e6577d03d70143d60384fa2a3917 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,8 @@
 OpenLDAP 2.2 Change Log
 
 OpenLDAP 2.2.24 Engineering
+       Added libldap fast synchronous search result processing
+       Fixed libldap fdset re-init for restart (ITS#3524)
 
 OpenLDAP 2.2.23 Release
        Updated slapd extensibleMatch empty DN bug fix (ITS#3506)
index 7b8cd08c4a2fcc6acf34b468ec6e444c8f26f8b9..4edeb28aee1bc856a726872c670d6f475be7f999 100644 (file)
@@ -43,10 +43,15 @@ ldap_delete_result_entry( LDAPMessage **list, LDAPMessage *e )
        if ( tmp == NULL )
                return( NULL );
 
-       if ( prev == NULL )
+       if ( prev == NULL ) {
+               if ( tmp->lm_chain )
+                       tmp->lm_chain->lm_chain_tail = (*list)->lm_chain_tail;
                *list = tmp->lm_chain;
-       else
+       } else {
                prev->lm_chain = tmp->lm_chain;
+               if ( prev->lm_chain == NULL )
+                       (*list)->lm_chain_tail = prev;
+       }
        tmp->lm_chain = NULL;
 
        return( tmp );
@@ -59,5 +64,6 @@ ldap_add_result_entry( LDAPMessage **list, LDAPMessage *e )
        assert( e != NULL );
 
        e->lm_chain = *list;
+       e->lm_chain_tail = (*list)->lm_chain_tail;
        *list = e;
 }
index f789f633630636c6d572b323680ff4087e18b077..8d74980d3146efe083bd14f2f7052d431c208277 100644 (file)
@@ -267,13 +267,24 @@ ldap_parse_result(
        ldap_pvt_thread_mutex_lock( &ld->ld_res_mutex );
 #endif
        /* Find the next result... */
-       for ( lm = r; lm != NULL; lm = lm->lm_chain ) {
-               /* skip over entries and references */
-               if( lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY &&
-                       lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE &&
-                       lm->lm_msgtype != LDAP_RES_INTERMEDIATE )
-               {
-                       break;
+       if ( r->lm_chain == NULL ) {
+               if ((r->lm_msgtype == LDAP_RES_SEARCH_ENTRY) ||
+                       (r->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) ||
+                       (r->lm_msgtype == LDAP_RES_INTERMEDIATE)) {
+                       lm = NULL;      
+               } else {
+                       lm = r;
+               }
+       } else {
+               if ((r->lm_chain_tail->lm_chain->lm_msgtype
+                               == LDAP_RES_SEARCH_ENTRY) ||
+                       (r->lm_chain_tail->lm_chain->lm_msgtype
+                               == LDAP_RES_SEARCH_REFERENCE) ||
+                       (r->lm_chain_tail->lm_chain->lm_msgtype
+                               == LDAP_RES_INTERMEDIATE)) {
+                       lm = NULL;
+               } else {
+                       lm = r->lm_chain_tail->lm_chain;
                }
        }
 
@@ -380,15 +391,24 @@ ldap_parse_result(
                }
 
                /* Find the next result... */
-               for ( lm = lm->lm_chain; lm != NULL; lm = lm->lm_chain ) {
-                       /* skip over entries and references */
-                       if( lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY &&
-                               lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE &&
-                               lm->lm_msgtype != LDAP_RES_INTERMEDIATE )
-                       {
-                               /* more results to return */
-                               errcode = LDAP_MORE_RESULTS_TO_RETURN;
-                               break;
+               lm = lm->lm_chain;
+               if ( lm ) {
+                       if ( lm->lm_chain == NULL ) {
+                               if ((lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY) &&
+                                       (lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE) &&
+                                       (lm->lm_msgtype != LDAP_RES_INTERMEDIATE)) {
+                                       /* more results to return */
+                                       errcode = LDAP_MORE_RESULTS_TO_RETURN;
+                               }
+                       } else {
+                               if ((lm->lm_chain_tail->lm_chain->lm_msgtype
+                                               != LDAP_RES_SEARCH_ENTRY) &&
+                                       (lm->lm_chain_tail->lm_chain->lm_msgtype
+                                               != LDAP_RES_SEARCH_REFERENCE) &&
+                                       (lm->lm_chain_tail->lm_chain->lm_msgtype
+                                               != LDAP_RES_INTERMEDIATE)) {
+                                       errcode = LDAP_MORE_RESULTS_TO_RETURN;
+                               }
                        }
                }
        }
index cbaa57db8f71b08570673642b6b4f7852a3a7d4d..017b37c38fd08104e93950d189915fce99e95cf7 100644 (file)
@@ -134,6 +134,7 @@ struct ldapmsg {
        ber_tag_t               lm_msgtype;     /* the message type */
        BerElement      *lm_ber;        /* the ber encoded message contents */
        struct ldapmsg  *lm_chain;      /* for search - next msg in the resp */
+       struct ldapmsg  *lm_chain_tail;
        struct ldapmsg  *lm_next;       /* next response */
        time_t  lm_time;        /* used to maintain cache */
 };
index 572f79e725c52e2081fc235224e646c6d6171caf..b4276b5d6a62d93914e8139845063eaa9a7399fa 100644 (file)
@@ -258,15 +258,15 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s,
        if ( async ) return ( -2 );
 #endif
 
-       FD_ZERO(&wfds);
-       FD_SET(s, &wfds );
+       do {
+               FD_ZERO(&wfds);
+               FD_SET(s, &wfds );
 
 #ifdef HAVE_WINSOCK
-       FD_ZERO(&efds);
-       FD_SET(s, &efds );
+               FD_ZERO(&efds);
+               FD_SET(s, &efds );
 #endif
 
-       do {
                rc = select(ldap_int_tblsize, z, &wfds,
 #ifdef HAVE_WINSOCK
                        &efds,
index 1c48c338a78087cb5cd3a7cfe3e851d52ba96baa..37f6fe386e285d9f84cb42d30857b5199f5e3b01 100644 (file)
@@ -191,12 +191,24 @@ chkResponseList(
                                break;
                        }
 
-                       for ( tmp = lm; tmp != NULL; tmp = tmp->lm_chain ) {
-                               if ( tmp->lm_msgtype != LDAP_RES_SEARCH_ENTRY
-                                   && tmp->lm_msgtype != LDAP_RES_SEARCH_REFERENCE
-                                       && tmp->lm_msgtype != LDAP_RES_INTERMEDIATE )
-                               {
-                                       break;
+                       if ( lm->lm_chain == NULL ) {
+                               if ((lm->lm_msgtype == LDAP_RES_SEARCH_ENTRY) ||
+                                       (lm->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) ||
+                                       (lm->lm_msgtype == LDAP_RES_INTERMEDIATE)) {
+                                       tmp = NULL;
+                               } else {
+                                       tmp = lm;
+                               }
+                       } else {
+                               if ((lm->lm_chain_tail->lm_chain->lm_msgtype
+                                               == LDAP_RES_SEARCH_ENTRY) ||
+                                       (lm->lm_chain_tail->lm_chain->lm_msgtype
+                                               == LDAP_RES_SEARCH_REFERENCE) ||
+                                       (lm->lm_chain_tail->lm_chain->lm_msgtype
+                                               == LDAP_RES_INTERMEDIATE)) {
+                                       tmp = NULL;
+                               } else {
+                                       tmp = lm->lm_chain_tail->lm_chain;
                                }
                        }
 
@@ -417,7 +429,7 @@ try_read1msg(
        LDAPMessage **result )
 {
        BerElement      *ber;
-       LDAPMessage     *new, *l, *prev, *tmp;
+       LDAPMessage     *new, *l, *prev, *tmp, *chain_head;
        ber_int_t       id;
        ber_tag_t       tag;
        ber_len_t       len;
@@ -891,8 +903,11 @@ lr->lr_res_matched ? lr->lr_res_matched : "" );
                                firstmsg = 0;
                                new->lm_next = ld->ld_responses;
                                ld->ld_responses = new;
+                               new->lm_chain_tail = new;
+                               chain_head = new;
                        } else {
                                tmp->lm_chain = new;
+                               chain_head->lm_chain_tail = tmp;
                        }
                        tmp = new;
                        /* "ok" means there's more to parse */
@@ -914,6 +929,7 @@ lr->lr_res_matched ? lr->lr_res_matched : "" );
                 * first response off the head of the chain.
                 */
                        tmp->lm_chain = new;
+                       chain_head->lm_chain_tail = tmp;
                        *result = chkResponseList( ld, msgid, all );
                        ld->ld_errno = LDAP_SUCCESS;
                        return( (*result)->lm_msgtype );
@@ -957,6 +973,7 @@ lr->lr_res_matched ? lr->lr_res_matched : "" );
 
                new->lm_next = ld->ld_responses;
                ld->ld_responses = new;
+               new->lm_chain_tail = new;
                goto exit;
        }
 
@@ -970,13 +987,31 @@ lr->lr_res_matched ? lr->lr_res_matched : "" );
 #endif
 
        /* part of a search response - add to end of list of entries */
-       for ( tmp = l; (tmp->lm_chain != NULL) &&
-               ((tmp->lm_chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY) ||
-                (tmp->lm_chain->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) ||
-                        (tmp->lm_chain->lm_msgtype == LDAP_RES_INTERMEDIATE ));
-           tmp = tmp->lm_chain )
-               ;       /* NULL */
-       tmp->lm_chain = new;
+       if (l->lm_chain == NULL) {
+               if ((l->lm_msgtype == LDAP_RES_SEARCH_ENTRY) ||
+                       (l->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) ||
+                       (l->lm_msgtype == LDAP_RES_INTERMEDIATE)) {
+                       /* do not advance lm_chain_tail in this case */
+                       l->lm_chain = new;
+               } else {
+                       /*FIXME: ldap_msgfree( l );*/
+                       l = new;
+                       l->lm_chain_tail = new;
+               }
+       } else {
+               if ((l->lm_chain_tail->lm_chain->lm_msgtype
+                               == LDAP_RES_SEARCH_ENTRY) ||
+                       (l->lm_chain_tail->lm_chain->lm_msgtype
+                               == LDAP_RES_SEARCH_REFERENCE) ||
+                       (l->lm_chain_tail->lm_chain->lm_msgtype
+                               == LDAP_RES_INTERMEDIATE)) {
+                       l->lm_chain_tail->lm_chain->lm_chain = new;
+                       l->lm_chain_tail = l->lm_chain_tail->lm_chain;
+               } else {
+                       /*FIXME: ldap_msgfree( l->lm_chain_tail->lm_chain );*/
+                       l->lm_chain_tail->lm_chain = new;
+               }
+       }
 
        /* return the whole chain if that's what we were looking for */
        if ( foundit ) {