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