home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ldapsdk.zip / libraries / libldap / modrdn.c < prev    next >
C/C++ Source or Header  |  2001-07-22  |  5KB  |  244 lines

  1. /* $OpenLDAP: pkg/ldap/libraries/libldap/modrdn.c,v 1.12.6.4 2001/07/21 19:01:39 kurt Exp $ */
  2. /*
  3.  * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
  4.  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  5.  */
  6. /*  Portions
  7.  *  Copyright (c) 1990 Regents of the University of Michigan.
  8.  *  All rights reserved.
  9.  *
  10.  *  modrdn.c
  11.  */
  12. /*
  13.  * Support for MODIFYDN REQUEST V3 (newSuperior) by:
  14.  *
  15.  * Copyright 1999, Juan C. Gomez, All rights reserved.
  16.  * This software is not subject to any license of Silicon Graphics 
  17.  * Inc. or Purdue University.
  18.  *
  19.  * Redistribution and use in source and binary forms are permitted
  20.  * without restriction or fee of any kind as long as this notice
  21.  * is preserved.
  22.  */
  23.  
  24. /*
  25.  * A modify rdn request looks like this:
  26.  *    ModifyRDNRequest ::= SEQUENCE {
  27.  *        entry        DistinguishedName,
  28.  *        newrdn        RelativeDistinguishedName,
  29.  *        deleteoldrdn    BOOLEAN
  30.  *        newSuperior    [0] DistinguishedName    [v3 only]
  31.  *    }
  32.  */
  33.  
  34. #include "portable.h"
  35.  
  36. #include <stdio.h>
  37.  
  38. #include <ac/socket.h>
  39. #include <ac/string.h>
  40. #include <ac/time.h>
  41.  
  42. #include "ldap-int.h"
  43.  
  44. /*
  45.  * ldap_rename - initiate an ldap extended modifyDN operation.
  46.  *
  47.  * Parameters:
  48.  *    ld                LDAP descriptor
  49.  *    dn                DN of the object to modify
  50.  *    newrdn            RDN to give the object
  51.  *    deleteoldrdn    nonzero means to delete old rdn values from the entry
  52.  *    newSuperior        DN of the new parent if applicable
  53.  *
  54.  * Returns the LDAP error code.
  55.  */
  56.  
  57. int
  58. ldap_rename(
  59.     LDAP *ld,
  60.     LDAP_CONST char *dn,
  61.     LDAP_CONST char *newrdn,
  62.     LDAP_CONST char *newSuperior,
  63.     int deleteoldrdn,
  64.     LDAPControl **sctrls,
  65.     LDAPControl **cctrls,
  66.     int *msgidp )
  67. {
  68.     BerElement    *ber;
  69.     int rc;
  70.  
  71.     Debug( LDAP_DEBUG_TRACE, "ldap_rename\n", 0, 0, 0 );
  72.  
  73.     /* check client controls */
  74.     rc = ldap_int_client_controls( ld, cctrls );
  75.     if( rc != LDAP_SUCCESS ) return rc;
  76.  
  77.     /* create a message to send */
  78.     if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
  79.         return( LDAP_NO_MEMORY );
  80.     }
  81.  
  82.     if( newSuperior != NULL ) {
  83.         /* must be version 3 (or greater) */
  84.         if ( ld->ld_version < LDAP_VERSION3 ) {
  85.             ld->ld_errno = LDAP_NOT_SUPPORTED;
  86.             ber_free( ber, 1 );
  87.             return( ld->ld_errno );
  88.         }
  89.  
  90.         rc = ber_printf( ber, "{it{ssbtsN}", /* '}' */ 
  91.             ++ld->ld_msgid, LDAP_REQ_MODDN,
  92.             dn, newrdn, (ber_int_t) deleteoldrdn,
  93.             LDAP_TAG_NEWSUPERIOR, newSuperior );
  94.  
  95.     } else {
  96.         rc = ber_printf( ber, "{it{ssbN}", /* '}' */ 
  97.             ++ld->ld_msgid, LDAP_REQ_MODDN,
  98.             dn, newrdn, (ber_int_t) deleteoldrdn );
  99.     }
  100.  
  101.     if ( rc < 0 ) {
  102.         ld->ld_errno = LDAP_ENCODING_ERROR;
  103.         ber_free( ber, 1 );
  104.         return( ld->ld_errno );
  105.     }
  106.  
  107.     /* Put Server Controls */
  108.     if( ldap_int_put_controls( ld, sctrls, ber ) != LDAP_SUCCESS ) {
  109.         ber_free( ber, 1 );
  110.         return ld->ld_errno;
  111.     }
  112.  
  113.     rc = ber_printf( ber, /*{*/ "N}" );
  114.     if ( rc < 0 ) {
  115.         ld->ld_errno = LDAP_ENCODING_ERROR;
  116.         ber_free( ber, 1 );
  117.         return( ld->ld_errno );
  118.     }
  119.  
  120.     /* send the message */
  121.     *msgidp = ldap_send_initial_request( ld, LDAP_REQ_MODRDN, dn, ber );
  122.     
  123.     if( *msgidp < 0 ) {
  124.         return( ld->ld_errno );
  125.     }
  126.  
  127.     return LDAP_SUCCESS;
  128. }
  129.  
  130.  
  131. /*
  132.  * ldap_rename2 - initiate an ldap (and X.500) modifyDN operation. Parameters:
  133.  *    (LDAP V3 MODIFYDN REQUEST)
  134.  *    ld        LDAP descriptor
  135.  *    dn        DN of the object to modify
  136.  *    newrdn        RDN to give the object
  137.  *    deleteoldrdn    nonzero means to delete old rdn values from the entry
  138.  *    newSuperior    DN of the new parent if applicable
  139.  *
  140.  * ldap_rename2 uses a U-Mich Style API.  It returns the msgid.
  141.  */
  142.  
  143. int
  144. ldap_rename2(
  145.     LDAP *ld,
  146.     LDAP_CONST char *dn,
  147.     LDAP_CONST char *newrdn,
  148.     LDAP_CONST char *newSuperior,
  149.     int deleteoldrdn )
  150. {
  151.     int msgid;
  152.     int rc;
  153.  
  154.     Debug( LDAP_DEBUG_TRACE, "ldap_rename2\n", 0, 0, 0 );
  155.  
  156.     rc = ldap_rename( ld, dn, newrdn, newSuperior,
  157.         deleteoldrdn, NULL, NULL, &msgid );
  158.  
  159.     return rc == LDAP_SUCCESS ? msgid : -1;
  160. }
  161.  
  162.  
  163. /*
  164.  * ldap_modrdn2 - initiate an ldap modifyRDN operation. Parameters:
  165.  *
  166.  *    ld        LDAP descriptor
  167.  *    dn        DN of the object to modify
  168.  *    newrdn        RDN to give the object
  169.  *    deleteoldrdn    nonzero means to delete old rdn values from the entry
  170.  *
  171.  * Example:
  172.  *    msgid = ldap_modrdn( ld, dn, newrdn );
  173.  */
  174. int
  175. ldap_modrdn2( LDAP *ld,
  176.     LDAP_CONST char *dn,
  177.     LDAP_CONST char *newrdn,
  178.     int deleteoldrdn )
  179. {
  180.     return ldap_rename2( ld, dn, newrdn, NULL, deleteoldrdn );
  181. }
  182.  
  183. int
  184. ldap_modrdn( LDAP *ld, LDAP_CONST char *dn, LDAP_CONST char *newrdn )
  185. {
  186.     return( ldap_rename2( ld, dn, newrdn, NULL, 1 ) );
  187. }
  188.  
  189.  
  190. int
  191. ldap_rename_s(
  192.     LDAP *ld,
  193.     LDAP_CONST char *dn,
  194.     LDAP_CONST char *newrdn,
  195.     LDAP_CONST char *newSuperior,
  196.     int deleteoldrdn,
  197.     LDAPControl **sctrls,
  198.     LDAPControl **cctrls )
  199. {
  200.     int rc;
  201.     int msgid;
  202.     LDAPMessage *res;
  203.  
  204.     rc = ldap_rename( ld, dn, newrdn, newSuperior,
  205.         deleteoldrdn, sctrls, cctrls, &msgid );
  206.  
  207.     if( rc != LDAP_SUCCESS ) {
  208.         return rc;
  209.     }
  210.  
  211.     rc = ldap_result( ld, msgid, 1, NULL, &res );
  212.  
  213.     if( rc == -1 ) {
  214.         return ld->ld_errno;
  215.     }
  216.  
  217.     return ldap_result2error( ld, res, 1 );
  218. }
  219.  
  220. int
  221. ldap_rename2_s(
  222.     LDAP *ld,
  223.     LDAP_CONST char *dn,
  224.     LDAP_CONST char *newrdn,
  225.     LDAP_CONST char *newSuperior,
  226.     int deleteoldrdn )
  227. {
  228.     return ldap_rename_s( ld, dn, newrdn, newSuperior,
  229.         deleteoldrdn, NULL, NULL );
  230. }
  231.  
  232. int
  233. ldap_modrdn2_s( LDAP *ld, LDAP_CONST char *dn, LDAP_CONST char *newrdn, int deleteoldrdn )
  234. {
  235.     return ldap_rename_s( ld, dn, newrdn, NULL, deleteoldrdn, NULL, NULL );
  236. }
  237.  
  238. int
  239. ldap_modrdn_s( LDAP *ld, LDAP_CONST char *dn, LDAP_CONST char *newrdn )
  240. {
  241.     return ldap_rename_s( ld, dn, newrdn, NULL, 1, NULL, NULL );
  242. }
  243.  
  244.