8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / lib / libldap5 / sources / ldap / common / add.c
blobff678f888def0d2d05bc7abd2de45e01d759c721
1 #pragma ident "%Z%%M% %I% %E% SMI"
3 /*
4 * The contents of this file are subject to the Netscape Public
5 * License Version 1.1 (the "License"); you may not use this file
6 * except in compliance with the License. You may obtain a copy of
7 * the License at http://www.mozilla.org/NPL/
9 * Software distributed under the License is distributed on an "AS
10 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11 * implied. See the License for the specific language governing
12 * rights and limitations under the License.
14 * The Original Code is Mozilla Communicator client code, released
15 * March 31, 1998.
17 * The Initial Developer of the Original Code is Netscape
18 * Communications Corporation. Portions created by Netscape are
19 * Copyright (C) 1998-1999 Netscape Communications Corporation. All
20 * Rights Reserved.
22 * Contributor(s):
25 * Copyright (c) 1990 Regents of the University of Michigan.
26 * All rights reserved.
29 * add.c
32 #if 0
33 #ifndef lint
34 static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
35 #endif
36 #endif
38 #include "ldap-int.h"
41 * ldap_add - initiate an ldap add operation. Parameters:
43 * ld LDAP descriptor
44 * dn DN of the entry to add
45 * mods List of attributes for the entry. This is a null-
46 * terminated array of pointers to LDAPMod structures.
47 * only the type and values in the structures need be
48 * filled in.
50 * Example:
51 * LDAPMod *attrs[] = {
52 * { 0, "cn", { "babs jensen", "babs", 0 } },
53 * { 0, "sn", { "jensen", 0 } },
54 * { 0, "objectClass", { "person", 0 } },
55 * 0
56 * }
57 * msgid = ldap_add( ld, dn, attrs );
59 int
60 LDAP_CALL
61 ldap_add( LDAP *ld, const char *dn, LDAPMod **attrs )
63 int msgid;
65 LDAPDebug( LDAP_DEBUG_TRACE, "ldap_add\n", 0, 0, 0 );
67 if ( ldap_add_ext( ld, dn, attrs, NULL, NULL, &msgid )
68 == LDAP_SUCCESS ) {
69 return( msgid );
70 } else {
71 return( -1 ); /* error is in ld handle */
77 * LDAPv3 extended add.
78 * Returns an LDAP error code.
80 int
81 LDAP_CALL
82 ldap_add_ext( LDAP *ld, const char *dn, LDAPMod **attrs,
83 LDAPControl **serverctrls, LDAPControl **clientctrls, int *msgidp )
85 BerElement *ber;
86 int i, rc, lderr;
89 * An add request looks like this:
90 * AddRequest ::= SEQUENCE {
91 * entry DistinguishedName,
92 * attrs SEQUENCE OF SEQUENCE {
93 * type AttributeType,
94 * values SET OF AttributeValue
95 * }
96 * }
99 LDAPDebug( LDAP_DEBUG_TRACE, "ldap_add_ext\n", 0, 0, 0 );
101 if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
102 return( LDAP_PARAM_ERROR );
105 if ( !NSLDAPI_VALID_LDAPMESSAGE_POINTER( msgidp ))
107 LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
108 return( LDAP_PARAM_ERROR );
110 if ( !NSLDAPI_VALID_NONEMPTY_LDAPMOD_ARRAY( attrs )
111 || msgidp == NULL ) {
112 lderr = LDAP_PARAM_ERROR;
113 LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
114 return( lderr );
117 if ( dn == NULL ) {
118 dn = "";
121 LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK );
122 *msgidp = ++ld->ld_msgid;
123 LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK );
125 /* see if we should add to the cache */
126 if ( ld->ld_cache_on && ld->ld_cache_add != NULL ) {
127 LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK );
128 if ( (rc = (ld->ld_cache_add)( ld, *msgidp, LDAP_REQ_ADD, dn,
129 attrs )) != 0 ) {
130 *msgidp = rc;
131 LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
132 return( LDAP_SUCCESS );
134 LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
137 /* create a message to send */
138 if (( lderr = nsldapi_alloc_ber_with_options( ld, &ber ))
139 != LDAP_SUCCESS ) {
140 return( lderr );
143 if ( ber_printf( ber, "{it{s{", *msgidp, LDAP_REQ_ADD, dn )
144 == -1 ) {
145 lderr = LDAP_ENCODING_ERROR;
146 LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
147 ber_free( ber, 1 );
148 return( lderr );
151 /* for each attribute in the entry... */
152 for ( i = 0; attrs[i] != NULL; i++ ) {
153 if ( ( attrs[i]->mod_op & LDAP_MOD_BVALUES) != 0 ) {
154 rc = ber_printf( ber, "{s[V]}", attrs[i]->mod_type,
155 attrs[i]->mod_bvalues );
156 } else {
157 rc = ber_printf( ber, "{s[v]}", attrs[i]->mod_type,
158 attrs[i]->mod_values );
160 if ( rc == -1 ) {
161 lderr = LDAP_ENCODING_ERROR;
162 LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
163 ber_free( ber, 1 );
164 return( lderr );
168 if ( ber_printf( ber, "}}" ) == -1 ) {
169 lderr = LDAP_ENCODING_ERROR;
170 LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
171 ber_free( ber, 1 );
172 return( lderr );
175 if (( lderr = nsldapi_put_controls( ld, serverctrls, 1, ber ))
176 != LDAP_SUCCESS ) {
177 ber_free( ber, 1 );
178 return( lderr );
181 /* send the message */
182 rc = nsldapi_send_initial_request( ld, *msgidp, LDAP_REQ_ADD,
183 (char *) dn, ber );
184 *msgidp = rc;
185 return( rc < 0 ? LDAP_GET_LDERRNO( ld, NULL, NULL ) : LDAP_SUCCESS );
189 LDAP_CALL
190 ldap_add_s( LDAP *ld, const char *dn, LDAPMod **attrs )
192 return( ldap_add_ext_s( ld, dn, attrs, NULL, NULL ));
195 int LDAP_CALL
196 ldap_add_ext_s( LDAP *ld, const char *dn, LDAPMod **attrs,
197 LDAPControl **serverctrls, LDAPControl **clientctrls )
199 int err, msgid;
200 LDAPMessage *res;
202 if (( err = ldap_add_ext( ld, dn, attrs, serverctrls, clientctrls,
203 &msgid )) != LDAP_SUCCESS ) {
204 return( err );
207 if ( ldap_result( ld, msgid, 1, (struct timeval *)NULL, &res ) == -1 ) {
208 return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
211 return( ldap_result2error( ld, res, 1 ) );