X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fabandon.c;h=80dadc325b23fe3f219ef0b649875b3e42ceb147;hb=a2eec74fc1d535fa9092f4d7b82a669b39eef539;hp=b2b2b83009c7133e2642bf83760c1efc8de74426;hpb=dc07e765f263ef459dcd2afd1ece01cfc85a0edd;p=openldap diff --git a/libraries/libldap/abandon.c b/libraries/libldap/abandon.c index b2b2b83009..80dadc325b 100644 --- a/libraries/libldap/abandon.c +++ b/libraries/libldap/abandon.c @@ -1,5 +1,6 @@ +/* $OpenLDAP$ */ /* - * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* Portions @@ -9,10 +10,16 @@ * abandon.c */ +/* + * An abandon request looks like this: + * AbandonRequest ::= MessageID + */ + #include "portable.h" #include -#include + +#include #include #include @@ -22,8 +29,8 @@ static int do_abandon LDAP_P(( LDAP *ld, - int origid, - int msgid, + ber_int_t origid, + ber_int_t msgid, LDAPControl **sctrls, LDAPControl **cctrls)); @@ -49,8 +56,13 @@ ldap_abandon_ext( LDAPControl **sctrls, LDAPControl **cctrls ) { + int rc; Debug( LDAP_DEBUG_TRACE, "ldap_abandon_ext %d\n", msgid, 0, 0 ); + /* check client controls */ + rc = ldap_int_client_controls( ld, cctrls ); + if( rc != LDAP_SUCCESS ) return rc; + return do_abandon( ld, msgid, msgid, sctrls, cctrls ); } @@ -70,7 +82,7 @@ int ldap_abandon( LDAP *ld, int msgid ) { Debug( LDAP_DEBUG_TRACE, "ldap_abandon %d\n", msgid, 0, 0 ); - return do_abandon( ld, msgid, msgid, NULL, NULL ) == LDAP_SUCCESS + return ldap_abandon_ext( ld, msgid, NULL, NULL ) == LDAP_SUCCESS ? 0 : -1; } @@ -78,29 +90,22 @@ ldap_abandon( LDAP *ld, int msgid ) static int do_abandon( LDAP *ld, - int origid, - int msgid, + ber_int_t origid, + ber_int_t msgid, LDAPControl **sctrls, LDAPControl **cctrls) { BerElement *ber; int i, err, sendabandon; + ber_int_t *old_abandon; Sockbuf *sb; -#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS LDAPRequest *lr; -#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS */ - - /* - * An abandon request looks like this: - * AbandonRequest ::= MessageID - */ Debug( LDAP_DEBUG_TRACE, "do_abandon origid %d, msgid %d\n", origid, msgid, 0 ); sendabandon = 1; -#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS /* find the request that we are abandoning */ for ( lr = ld->ld_requests; lr != NULL; lr = lr->lr_next ) { if ( lr->lr_msgid == msgid ) { /* this message */ @@ -123,7 +128,6 @@ do_abandon( sendabandon = 0; } } -#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS */ if ( ldap_msgdelete( ld, msgid ) == 0 ) { ld->ld_errno = LDAP_SUCCESS; @@ -132,23 +136,36 @@ do_abandon( err = 0; if ( sendabandon ) { - /* create a message to send */ - if ( (ber = ldap_alloc_ber_with_options( ld )) == NULLBER ) { + if( ber_sockbuf_ctrl( ld->ld_sb, LBER_SB_OPT_GET_FD, NULL ) == -1 ) { + /* not connected */ + err = -1; + ld->ld_errno = LDAP_SERVER_DOWN; + + } else if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) { + /* BER element alocation failed */ err = -1; ld->ld_errno = LDAP_NO_MEMORY; } else { #ifdef LDAP_CONNECTIONLESS - if ( ld->ld_cldapnaddr > 0 ) { - err = ber_printf( ber, "{isti", /* leave open '}' */ - ++ld->ld_msgid, ld->ld_cldapdn, - LDAP_REQ_ABANDON, msgid ); + if ( LDAP_IS_UDP(ld) ) { + err = ber_write( ber, ld->ld_options.ldo_peer, + sizeof(struct sockaddr), 0); + } + if ( LDAP_IS_UDP(ld) && ld->ld_options.ldo_version == + LDAP_VERSION2) { + char *dn = ld->ld_options.ldo_cldapdn; + if (!dn) dn = ""; + err = ber_printf( ber, "{isti", /* '}' */ + ++ld->ld_msgid, dn, + LDAP_REQ_ABANDON, msgid ); } else -#endif /* LDAP_CONNECTIONLESS */ +#endif { - err = ber_printf( ber, "{iti", /* leave open '}' */ - ++ld->ld_msgid, - LDAP_REQ_ABANDON, msgid ); + /* create a message to send */ + err = ber_printf( ber, "{iti", /* '}' */ + ++ld->ld_msgid, + LDAP_REQ_ABANDON, msgid ); } if( err == -1 ) { @@ -164,7 +181,7 @@ do_abandon( } else { /* close '{' */ - err = ber_printf( ber, "}" ); + err = ber_printf( ber, /*{*/ "N}" ); if( err == -1 ) { /* encoding error */ @@ -178,13 +195,10 @@ do_abandon( } else { /* send the message */ -#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS if ( lr != NULL ) { sb = lr->lr_conn->lconn_sb; - } else -#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS */ - { - sb = &ld->ld_sb; + } else { + sb = ld->ld_sb; } if ( ber_flush( sb, ber, 1 ) != 0 ) { @@ -197,7 +211,6 @@ do_abandon( } } -#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS if ( lr != NULL ) { if ( sendabandon ) { ldap_free_connection( ld, lr->lr_conn, 0, 1 ); @@ -206,25 +219,24 @@ do_abandon( ldap_free_request( ld, lr ); } } -#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS */ + i = 0; + if ( ld->ld_abandoned != NULL ) { + for ( ; ld->ld_abandoned[i] != -1; i++ ) + ; /* NULL */ + } + + old_abandon = ld->ld_abandoned; + ld->ld_abandoned = (ber_int_t *) LDAP_REALLOC( (char *) + ld->ld_abandoned, (i + 2) * sizeof(ber_int_t) ); + if ( ld->ld_abandoned == NULL ) { - if ( (ld->ld_abandoned = (int *) malloc( 2 * sizeof(int) )) - == NULL ) { - ld->ld_errno = LDAP_NO_MEMORY; - return( ld->ld_errno ); - } - i = 0; - } else { - for ( i = 0; ld->ld_abandoned[i] != -1; i++ ) - ; /* NULL */ - if ( (ld->ld_abandoned = (int *) realloc( (char *) - ld->ld_abandoned, (i + 2) * sizeof(int) )) == NULL ) { - ld->ld_errno = LDAP_NO_MEMORY; - return( ld->ld_errno ); - } + ld->ld_abandoned = old_abandon; + ld->ld_errno = LDAP_NO_MEMORY; + return( ld->ld_errno ); } + ld->ld_abandoned[i] = msgid; ld->ld_abandoned[i + 1] = -1;