dmake: do not set MAKEFLAGS=k
[unleashed/tickless.git] / usr / src / lib / libldap5 / sources / ldap / common / add.c
blob96f84b2ddae80dd9c5ca2182288c1f742686e7b0
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 static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
34 #endif
36 #include "ldap-int.h"
39 * ldap_add - initiate an ldap add operation. Parameters:
41 * ld LDAP descriptor
42 * dn DN of the entry to add
43 * mods List of attributes for the entry. This is a null-
44 * terminated array of pointers to LDAPMod structures.
45 * only the type and values in the structures need be
46 * filled in.
48 * Example:
49 * LDAPMod *attrs[] = {
50 * { 0, "cn", { "babs jensen", "babs", 0 } },
51 * { 0, "sn", { "jensen", 0 } },
52 * { 0, "objectClass", { "person", 0 } },
53 * 0
54 * }
55 * msgid = ldap_add( ld, dn, attrs );
57 int
58 LDAP_CALL
59 ldap_add( LDAP *ld, const char *dn, LDAPMod **attrs )
61 int msgid;
63 LDAPDebug( LDAP_DEBUG_TRACE, "ldap_add\n", 0, 0, 0 );
65 if ( ldap_add_ext( ld, dn, attrs, NULL, NULL, &msgid )
66 == LDAP_SUCCESS ) {
67 return( msgid );
68 } else {
69 return( -1 ); /* error is in ld handle */
75 * LDAPv3 extended add.
76 * Returns an LDAP error code.
78 int
79 LDAP_CALL
80 ldap_add_ext( LDAP *ld, const char *dn, LDAPMod **attrs,
81 LDAPControl **serverctrls, LDAPControl **clientctrls, int *msgidp )
83 BerElement *ber;
84 int i, rc, lderr;
87 * An add request looks like this:
88 * AddRequest ::= SEQUENCE {
89 * entry DistinguishedName,
90 * attrs SEQUENCE OF SEQUENCE {
91 * type AttributeType,
92 * values SET OF AttributeValue
93 * }
94 * }
97 LDAPDebug( LDAP_DEBUG_TRACE, "ldap_add_ext\n", 0, 0, 0 );
99 if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
100 return( LDAP_PARAM_ERROR );
103 if ( !NSLDAPI_VALID_LDAPMESSAGE_POINTER( msgidp ))
105 LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
106 return( LDAP_PARAM_ERROR );
108 if ( !NSLDAPI_VALID_NONEMPTY_LDAPMOD_ARRAY( attrs )
109 || msgidp == NULL ) {
110 lderr = LDAP_PARAM_ERROR;
111 LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
112 return( lderr );
115 if ( dn == NULL ) {
116 dn = "";
119 LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK );
120 *msgidp = ++ld->ld_msgid;
121 LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK );
123 /* see if we should add to the cache */
124 if ( ld->ld_cache_on && ld->ld_cache_add != NULL ) {
125 LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK );
126 if ( (rc = (ld->ld_cache_add)( ld, *msgidp, LDAP_REQ_ADD, dn,
127 attrs )) != 0 ) {
128 *msgidp = rc;
129 LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
130 return( LDAP_SUCCESS );
132 LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
135 /* create a message to send */
136 if (( lderr = nsldapi_alloc_ber_with_options( ld, &ber ))
137 != LDAP_SUCCESS ) {
138 return( lderr );
141 if ( ber_printf( ber, "{it{s{", *msgidp, LDAP_REQ_ADD, dn )
142 == -1 ) {
143 lderr = LDAP_ENCODING_ERROR;
144 LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
145 ber_free( ber, 1 );
146 return( lderr );
149 /* for each attribute in the entry... */
150 for ( i = 0; attrs[i] != NULL; i++ ) {
151 if ( ( attrs[i]->mod_op & LDAP_MOD_BVALUES) != 0 ) {
152 rc = ber_printf( ber, "{s[V]}", attrs[i]->mod_type,
153 attrs[i]->mod_bvalues );
154 } else {
155 rc = ber_printf( ber, "{s[v]}", attrs[i]->mod_type,
156 attrs[i]->mod_values );
158 if ( rc == -1 ) {
159 lderr = LDAP_ENCODING_ERROR;
160 LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
161 ber_free( ber, 1 );
162 return( lderr );
166 if ( ber_printf( ber, "}}" ) == -1 ) {
167 lderr = LDAP_ENCODING_ERROR;
168 LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
169 ber_free( ber, 1 );
170 return( lderr );
173 if (( lderr = nsldapi_put_controls( ld, serverctrls, 1, ber ))
174 != LDAP_SUCCESS ) {
175 ber_free( ber, 1 );
176 return( lderr );
179 /* send the message */
180 rc = nsldapi_send_initial_request( ld, *msgidp, LDAP_REQ_ADD,
181 (char *) dn, ber );
182 *msgidp = rc;
183 return( rc < 0 ? LDAP_GET_LDERRNO( ld, NULL, NULL ) : LDAP_SUCCESS );
187 LDAP_CALL
188 ldap_add_s( LDAP *ld, const char *dn, LDAPMod **attrs )
190 return( ldap_add_ext_s( ld, dn, attrs, NULL, NULL ));
193 int LDAP_CALL
194 ldap_add_ext_s( LDAP *ld, const char *dn, LDAPMod **attrs,
195 LDAPControl **serverctrls, LDAPControl **clientctrls )
197 int err, msgid;
198 LDAPMessage *res;
200 if (( err = ldap_add_ext( ld, dn, attrs, serverctrls, clientctrls,
201 &msgid )) != LDAP_SUCCESS ) {
202 return( err );
205 if ( ldap_result( ld, msgid, 1, NULL, &res ) == -1 ) {
206 return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
209 return( ldap_result2error( ld, res, 1 ) );