X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fabandon.c;h=a88a5865b5a89ab8813b2c49ababf82bd4954ee3;hb=391af545e8006bc2b4b3669730cbef5c44fdb2f4;hp=18324260bd0f06edea8dfb01814772a6c474e2d6;hpb=42e0d83cb3a1a1c5b25183f1ab74ce7edbe25de7;p=openldap diff --git a/libraries/libldap/abandon.c b/libraries/libldap/abandon.c index 18324260bd..a88a5865b5 100644 --- a/libraries/libldap/abandon.c +++ b/libraries/libldap/abandon.c @@ -1,43 +1,78 @@ +/* $OpenLDAP$ */ /* + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ +/* Portions * Copyright (c) 1990 Regents of the University of Michigan. * All rights reserved. * * abandon.c */ -#ifndef lint -static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n"; -#endif +/* + * An abandon request looks like this: + * AbandonRequest ::= MessageID + */ + +#include "portable.h" #include -#include -#if !defined( MACOS ) && !defined( DOS ) -#include -#include +#include + +#include +#include +#include + +#include "ldap-int.h" + +static int do_abandon LDAP_P(( + LDAP *ld, + ber_int_t origid, + ber_int_t msgid, + LDAPControl **sctrls, + LDAPControl **cctrls)); + +/* + * ldap_abandon_ext - perform an ldap extended abandon operation. + * + * Parameters: + * ld LDAP descriptor + * msgid The message id of the operation to abandon + * scntrls Server Controls + * ccntrls Client Controls + * + * ldap_abandon_ext returns a LDAP error code. + * (LDAP_SUCCESS if everything went ok) + * + * Example: + * ldap_abandon_ext( ld, msgid, scntrls, ccntrls ); + */ +int +ldap_abandon_ext( + LDAP *ld, + int msgid, + LDAPControl **sctrls, + LDAPControl **cctrls ) +{ + int rc; +#ifdef NEW_LOGGING + LDAP_LOG ( OPERATION, ARGS, "ldap_abandon_ext %d\n", msgid, 0, 0 ); +#else + Debug( LDAP_DEBUG_TRACE, "ldap_abandon_ext %d\n", msgid, 0, 0 ); #endif -#if defined( DOS ) || defined( _WIN32 ) -#include -#include "msdos.h" -#endif /* DOS */ + /* check client controls */ + rc = ldap_int_client_controls( ld, cctrls ); + if( rc != LDAP_SUCCESS ) return rc; -#ifdef MACOS -#include -#include "macos.h" -#endif /* MACOS */ + return do_abandon( ld, msgid, msgid, sctrls, cctrls ); +} -#include "lber.h" -#include "ldap.h" -#include "ldap-int.h" -#ifdef NEEDPROTOS -static int do_abandon( LDAP *ld, int origid, int msgid ); -#else /* NEEDPROTOS */ -static int do_abandon(); -#endif /* NEEDPROTOS */ /* - * ldap_abandon - perform an ldap (and X.500) abandon operation. Parameters: + * ldap_abandon - perform an ldap abandon operation. Parameters: * * ld LDAP descriptor * msgid The message id of the operation to abandon @@ -50,39 +85,47 @@ static int do_abandon(); int ldap_abandon( LDAP *ld, int msgid ) { +#ifdef NEW_LOGGING + LDAP_LOG ( OPERATION, ARGS, "ldap_abandon %d\n", msgid, 0, 0 ); +#else Debug( LDAP_DEBUG_TRACE, "ldap_abandon %d\n", msgid, 0, 0 ); - return( do_abandon( ld, msgid, msgid )); +#endif + return ldap_abandon_ext( ld, msgid, NULL, NULL ) == LDAP_SUCCESS + ? 0 : -1; } static int -do_abandon( LDAP *ld, int origid, int msgid ) +do_abandon( + LDAP *ld, + 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_REFERRALS LDAPRequest *lr; -#endif /* LDAP_REFERRALS */ - - /* - * An abandon request looks like this: - * AbandonRequest ::= MessageID - */ +#ifdef NEW_LOGGING + LDAP_LOG ( OPERATION, ARGS, "do_abandon %d, msgid %d\n", origid, msgid, 0 ); +#else Debug( LDAP_DEBUG_TRACE, "do_abandon origid %d, msgid %d\n", origid, msgid, 0 ); +#endif sendabandon = 1; -#ifdef LDAP_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 */ break; } - if ( lr->lr_origid == msgid ) { /* child: abandon it */ - do_abandon( ld, msgid, lr->lr_msgid ); + if ( lr->lr_origid == msgid ) {/* child: abandon it */ + (void) do_abandon( ld, + msgid, lr->lr_msgid, sctrls, cctrls ); } } @@ -90,54 +133,86 @@ do_abandon( LDAP *ld, int origid, int msgid ) if ( origid == msgid && lr->lr_parent != NULL ) { /* don't let caller abandon child requests! */ ld->ld_errno = LDAP_PARAM_ERROR; - return( -1 ); + return( LDAP_PARAM_ERROR ); } if ( lr->lr_status != LDAP_REQST_INPROGRESS ) { /* no need to send abandon message */ sendabandon = 0; } } -#endif /* LDAP_REFERRALS */ if ( ldap_msgdelete( ld, msgid ) == 0 ) { ld->ld_errno = LDAP_SUCCESS; - return( 0 ); + return LDAP_SUCCESS; } err = 0; if ( sendabandon ) { - /* create a message to send */ - if ( (ber = 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 CLDAP - if ( ld->ld_sb.sb_naddr > 0 ) { - err = ber_printf( ber, "{isti}", - ++ld->ld_msgid, ld->ld_cldapdn, - LDAP_REQ_ABANDON, msgid ); +#ifdef LDAP_CONNECTIONLESS + 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 + { + /* create a message to send */ + err = ber_printf( ber, "{iti", /* '}' */ + ++ld->ld_msgid, + LDAP_REQ_ABANDON, msgid ); + } + + if( err == -1 ) { + /* encoding error */ + ld->ld_errno = LDAP_ENCODING_ERROR; + } else { -#endif /* CLDAP */ - err = ber_printf( ber, "{iti}", ++ld->ld_msgid, - LDAP_REQ_ABANDON, msgid ); -#ifdef CLDAP + /* Put Server Controls */ + if ( ldap_int_put_controls( ld, sctrls, ber ) + != LDAP_SUCCESS ) + { + err = -1; + + } else { + /* close '{' */ + err = ber_printf( ber, /*{*/ "N}" ); + + if( err == -1 ) { + /* encoding error */ + ld->ld_errno = LDAP_ENCODING_ERROR; + } + } } -#endif /* CLDAP */ if ( err == -1 ) { - ld->ld_errno = LDAP_ENCODING_ERROR; ber_free( ber, 1 ); + } else { /* send the message */ -#ifdef LDAP_REFERRALS if ( lr != NULL ) { sb = lr->lr_conn->lconn_sb; } else { - sb = &ld->ld_sb; + sb = ld->ld_sb; } -#else /* LDAP_REFERRALS */ - sb = &ld->ld_sb; -#endif /* LDAP_REFERRALS */ + if ( ber_flush( sb, ber, 1 ) != 0 ) { ld->ld_errno = LDAP_SERVER_DOWN; err = -1; @@ -148,39 +223,38 @@ do_abandon( LDAP *ld, int origid, int msgid ) } } -#ifdef LDAP_REFERRALS if ( lr != NULL ) { if ( sendabandon ) { - free_connection( ld, lr->lr_conn, 0, 1 ); + ldap_free_connection( ld, lr->lr_conn, 0, 1 ); } if ( origid == msgid ) { - free_request( ld, lr ); + ldap_free_request( ld, lr ); } } -#endif /* LDAP_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( -1 ); - } - 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( -1 ); - } + 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; if ( err != -1 ) { ld->ld_errno = LDAP_SUCCESS; } - return( err ); + + return( ld->ld_errno ); }