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

  1. /* $OpenLDAP: pkg/ldap/libraries/libldap/add.c,v 1.9.6.5 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.  *  add.c
  11.  */
  12.  
  13. /*
  14.  * An add request looks like this:
  15.  *    AddRequest ::= SEQUENCE {
  16.  *        entry    DistinguishedName,
  17.  *        attrs    SEQUENCE OF SEQUENCE {
  18.  *            type    AttributeType,
  19.  *            values    SET OF AttributeValue
  20.  *        }
  21.  *    }
  22.  */
  23.  
  24. #include "portable.h"
  25.  
  26. #include <stdio.h>
  27.  
  28. #include <ac/socket.h>
  29. #include <ac/string.h>
  30. #include <ac/time.h>
  31.  
  32. #include "ldap-int.h"
  33.  
  34. /*
  35.  * ldap_add - initiate an ldap add operation.  Parameters:
  36.  *
  37.  *    ld        LDAP descriptor
  38.  *    dn        DN of the entry to add
  39.  *    mods        List of attributes for the entry.  This is a null-
  40.  *            terminated array of pointers to LDAPMod structures.
  41.  *            only the type and values in the structures need be
  42.  *            filled in.
  43.  *
  44.  * Example:
  45.  *    LDAPMod    *attrs[] = { 
  46.  *            { 0, "cn", { "babs jensen", "babs", 0 } },
  47.  *            { 0, "sn", { "jensen", 0 } },
  48.  *            { 0, "objectClass", { "person", 0 } },
  49.  *            0
  50.  *        }
  51.  *    msgid = ldap_add( ld, dn, attrs );
  52.  */
  53. int
  54. ldap_add( LDAP *ld, LDAP_CONST char *dn, LDAPMod **attrs )
  55. {
  56.     int rc;
  57.     int msgid;
  58.  
  59.     rc = ldap_add_ext( ld, dn, attrs, NULL, NULL, &msgid );
  60.  
  61.     if ( rc != LDAP_SUCCESS )
  62.         return -1;
  63.  
  64.     return msgid;
  65. }
  66.  
  67.  
  68. /*
  69.  * ldap_add_ext - initiate an ldap extended add operation.  Parameters:
  70.  *
  71.  *    ld        LDAP descriptor
  72.  *    dn        DN of the entry to add
  73.  *    mods        List of attributes for the entry.  This is a null-
  74.  *            terminated array of pointers to LDAPMod structures.
  75.  *            only the type and values in the structures need be
  76.  *            filled in.
  77.  *    sctrl    Server Controls
  78.  *    cctrl    Client Controls
  79.  *    msgidp    Message ID pointer
  80.  *
  81.  * Example:
  82.  *    LDAPMod    *attrs[] = { 
  83.  *            { 0, "cn", { "babs jensen", "babs", 0 } },
  84.  *            { 0, "sn", { "jensen", 0 } },
  85.  *            { 0, "objectClass", { "person", 0 } },
  86.  *            0
  87.  *        }
  88.  *    rc = ldap_add_ext( ld, dn, attrs, NULL, NULL, &msgid );
  89.  */
  90. int
  91. ldap_add_ext(
  92.     LDAP *ld,
  93.     LDAP_CONST char *dn,
  94.     LDAPMod **attrs,
  95.     LDAPControl **sctrls,
  96.     LDAPControl **cctrls,
  97.     int    *msgidp )
  98. {
  99.     BerElement    *ber;
  100.     int        i, rc;
  101.  
  102.     Debug( LDAP_DEBUG_TRACE, "ldap_add\n", 0, 0, 0 );
  103.     assert( ld != NULL );
  104.     assert( LDAP_VALID( ld ) );
  105.     assert( dn != NULL );
  106.     assert( msgidp != NULL );
  107.  
  108.     /* check client controls */
  109.     rc = ldap_int_client_controls( ld, cctrls );
  110.     if( rc != LDAP_SUCCESS ) return rc;
  111.  
  112.     /* create a message to send */
  113.     if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) {
  114.         ld->ld_errno = LDAP_NO_MEMORY;
  115.         return ld->ld_errno;
  116.     }
  117.  
  118.     rc = ber_printf( ber, "{it{s{", /* '}}}' */
  119.         ++ld->ld_msgid, LDAP_REQ_ADD, dn );
  120.  
  121.     if ( rc == -1 ) {
  122.         ld->ld_errno = LDAP_ENCODING_ERROR;
  123.         ber_free( ber, 1 );
  124.         return ld->ld_errno;
  125.     }
  126.  
  127.     /* for each attribute in the entry... */
  128.     for ( i = 0; attrs[i] != NULL; i++ ) {
  129.         if ( ( attrs[i]->mod_op & LDAP_MOD_BVALUES) != 0 ) {
  130.             rc = ber_printf( ber, "{s[V]N}", attrs[i]->mod_type,
  131.                 attrs[i]->mod_bvalues );
  132.         } else {
  133.             rc = ber_printf( ber, "{s[v]N}", attrs[i]->mod_type,
  134.                 attrs[i]->mod_values );
  135.         }
  136.         if ( rc == -1 ) {
  137.             ld->ld_errno = LDAP_ENCODING_ERROR;
  138.             ber_free( ber, 1 );
  139.             return ld->ld_errno;
  140.         }
  141.     }
  142.  
  143.     if ( ber_printf( ber, /*{{*/ "N}N}" ) == -1 ) {
  144.         ld->ld_errno = LDAP_ENCODING_ERROR;
  145.         ber_free( ber, 1 );
  146.         return ld->ld_errno;
  147.     }
  148.  
  149.     /* Put Server Controls */
  150.     if( ldap_int_put_controls( ld, sctrls, ber ) != LDAP_SUCCESS ) {
  151.         ber_free( ber, 1 );
  152.         return ld->ld_errno;
  153.     }
  154.  
  155.     if ( ber_printf( ber, /*{*/ "N}" ) == -1 ) {
  156.         ld->ld_errno = LDAP_ENCODING_ERROR;
  157.         ber_free( ber, 1 );
  158.         return ld->ld_errno;
  159.     }
  160.  
  161.     /* send the message */
  162.     *msgidp = ldap_send_initial_request( ld, LDAP_REQ_ADD, dn, ber );
  163.  
  164.     if(*msgidp < 0)
  165.         return ld->ld_errno;
  166.  
  167.     return LDAP_SUCCESS;
  168. }
  169.  
  170. int
  171. ldap_add_ext_s(
  172.     LDAP *ld,
  173.     LDAP_CONST char *dn,
  174.     LDAPMod **attrs,
  175.     LDAPControl **sctrls,
  176.     LDAPControl **cctrls )
  177. {
  178.     int        msgid, rc;
  179.     LDAPMessage    *res;
  180.  
  181.     rc = ldap_add_ext( ld, dn, attrs, sctrls, cctrls, &msgid );
  182.  
  183.     if ( rc != LDAP_SUCCESS )
  184.         return( rc );
  185.  
  186.     if ( ldap_result( ld, msgid, 1, (struct timeval *) NULL, &res ) == -1 )
  187.         return( ld->ld_errno );
  188.  
  189.     return( ldap_result2error( ld, res, 1 ) );
  190. }
  191.  
  192. int
  193. ldap_add_s( LDAP *ld, LDAP_CONST char *dn, LDAPMod **attrs )
  194. {
  195.     return ldap_add_ext_s( ld, dn, attrs, NULL, NULL );
  196. }
  197.  
  198.