]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/abandon.c
ITS#6254
[openldap] / libraries / libldap / abandon.c
index 9785b21b161499073c072b1194c3a00da32caf5d..e8b32a0f3e4452dc953fceeea7a411896a5478b2 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2006 The OpenLDAP Foundation.
+ * Copyright 1998-2009 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -224,8 +224,9 @@ start_again:;
                        i = ++(ld)->ld_msgid;
 #ifdef LDAP_CONNECTIONLESS
                        if ( LDAP_IS_UDP(ld) ) {
-                               err = ber_write( ber, ld->ld_options.ldo_peer,
-                                       sizeof(struct sockaddr), 0);
+                               struct sockaddr sa = {0};
+                               /* dummy, filled with ldo_peer in request.c */
+                               err = ber_write( ber, &sa, sizeof(sa), 0 );
                        }
                        if ( LDAP_IS_UDP(ld) && ld->ld_options.ldo_version ==
                                LDAP_VERSION2 )
@@ -311,9 +312,9 @@ start_again:;
        /* use bisection */
        i = 0;
        if ( ld->ld_nabandoned == 0 ||
-               lutil_bisect_find( ld->ld_abandoned, ld->ld_nabandoned, msgid, &i ) == 0 )
+               ldap_int_bisect_find( ld->ld_abandoned, ld->ld_nabandoned, msgid, &i ) == 0 )
        {
-               lutil_bisect_insert( &ld->ld_abandoned, &ld->ld_nabandoned, msgid, i );
+               ldap_int_bisect_insert( &ld->ld_abandoned, &ld->ld_nabandoned, msgid, i );
        }
 
        if ( err != -1 ) {
@@ -326,3 +327,142 @@ start_again:;
 #endif
        return( ld->ld_errno );
 }
+
+/*
+ * ldap_int_bisect_find
+ *
+ * args:
+ *     v:      array of length n (in)
+ *     n:      length of array v (in)
+ *     id:     value to look for (in)
+ *     idxp:   pointer to location of value/insert point
+ *
+ * return:
+ *     0:      not found
+ *     1:      found
+ *     -1:     error
+ */
+int
+ldap_int_bisect_find( ber_int_t *v, ber_len_t n, ber_int_t id, int *idxp )
+{
+       int             begin,
+                       end,
+                       rc = 0;
+
+       assert( id >= 0 );
+
+       begin = 0;
+       end = n - 1;
+
+               if ( n <= 0 || id < v[ begin ] ) {
+                       *idxp = 0;
+
+               } else if ( id > v[ end ] ) {
+                       *idxp = n;
+
+               } else {
+                       int             pos;
+                       ber_int_t       curid;
+       
+                       do {
+                               pos = (begin + end)/2;
+                               curid = v[ pos ];
+       
+                               if ( id < curid ) {
+                                       end = pos - 1;
+       
+                               } else if ( id > curid ) {
+                                       begin = ++pos;
+       
+                               } else {
+                                       /* already abandoned? */
+                                       rc = 1;
+                                       break;
+                               }
+                       } while ( end >= begin );
+       
+                       *idxp = pos;
+               }
+
+       return rc;
+}
+
+/*
+ * ldap_int_bisect_insert
+ *
+ * args:
+ *     vp:     pointer to array of length *np (in/out)
+ *     np:     pointer to length of array *vp (in/out)
+ *     id:     value to insert (in)
+ *     idx:    location of insert point (as computed by ldap_int_bisect_find())
+ *
+ * return:
+ *     0:      inserted
+ *     -1:     error
+ */
+int
+ldap_int_bisect_insert( ber_int_t **vp, ber_len_t *np, int id, int idx )
+{
+       ber_int_t       *v;
+       ber_len_t       n;
+       int             i;
+
+       assert( vp != NULL );
+       assert( np != NULL );
+       assert( idx >= 0 );
+       assert( (unsigned) idx <= *np );
+
+       n = *np;
+
+       v = ber_memrealloc( *vp, sizeof( ber_int_t ) * ( n + 1 ) );
+       if ( v == NULL ) {
+               return -1;
+       }
+       *vp = v;
+
+       for ( i = n; i > idx; i-- ) {
+               v[ i ] = v[ i - 1 ];
+       }
+       v[ idx ] = id;
+       ++(*np);
+
+       return 0;
+}
+
+/*
+ * ldap_int_bisect_delete
+ *
+ * args:
+ *     vp:     pointer to array of length *np (in/out)
+ *     np:     pointer to length of array *vp (in/out)
+ *     id:     value to delete (in)
+ *     idx:    location of value to delete (as computed by ldap_int_bisect_find())
+ *
+ * return:
+ *     0:      deleted
+ */
+int
+ldap_int_bisect_delete( ber_int_t **vp, ber_len_t *np, int id, int idx )
+{
+       ber_int_t       *v;
+       ber_len_t       i, n;
+
+       assert( vp != NULL );
+       assert( np != NULL );
+       assert( idx >= 0 );
+       assert( (unsigned) idx < *np );
+
+       v = *vp;
+
+       assert( v[ idx ] == id );
+
+       --(*np);
+       n = *np;
+
+       for ( i = idx; i < n; i++ ) {
+               v[ i ] = v[ i + 1 ];
+       }
+
+       return 0;
+}
+