]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/abandon.c
moved rdn parsing in a dedicated routine, ldap_str2rdn(), that can be used directly...
[openldap] / libraries / libldap / abandon.c
index 6923133bde842b13d081a709cc4a84b6728f35f2..80dadc325b23fe3f219ef0b649875b3e42ceb147 100644 (file)
@@ -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,6 +10,11 @@
  *  abandon.c
  */
 
+/*
+ * An abandon request looks like this:
+ *     AbandonRequest ::= MessageID
+ */
+
 #include "portable.h"
 
 #include <stdio.h>
@@ -23,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));
 
@@ -50,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 );
 }
 
@@ -71,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;
 }
 
@@ -79,22 +90,17 @@ 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;
-       unsigned int *old_abandon;
+       ber_int_t *old_abandon;
        Sockbuf         *sb;
        LDAPRequest     *lr;
 
-       /*
-        * An abandon request looks like this:
-        *      AbandonRequest ::= MessageID
-        */
-
        Debug( LDAP_DEBUG_TRACE, "do_abandon origid %d, msgid %d\n",
                origid, msgid, 0 );
 
@@ -130,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 ) {
@@ -162,7 +181,7 @@ do_abandon(
 
                                } else {
                                        /* close '{' */
-                                       err = ber_printf( ber, "}" );
+                                       err = ber_printf( ber, /*{*/ "N}" );
 
                                        if( err == -1 ) {
                                                /* encoding error */
@@ -179,7 +198,7 @@ do_abandon(
                                if ( lr != NULL ) {
                                        sb = lr->lr_conn->lconn_sb;
                                } else {
-                                       sb = &ld->ld_sb;
+                                       sb = ld->ld_sb;
                                }
 
                                if ( ber_flush( sb, ber, 1 ) != 0 ) {
@@ -209,8 +228,8 @@ do_abandon(
 
        old_abandon = ld->ld_abandoned;
 
-       ld->ld_abandoned = (int *) LDAP_REALLOC( (char *)
-               ld->ld_abandoned, (i + 2) * sizeof(int) );
+       ld->ld_abandoned = (ber_int_t *) LDAP_REALLOC( (char *)
+               ld->ld_abandoned, (i + 2) * sizeof(ber_int_t) );
                
        if ( ld->ld_abandoned == NULL ) {
                ld->ld_abandoned = old_abandon;