xref: /onnv-gate/usr/src/lib/libldap4/common/delete.c (revision 3857:21b9b714e4ab)
1 /*
2  * Portions Copyright 1998 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 
6 #pragma ident	"%Z%%M%	%I%	%E% SMI"
7 /*
8  *  Copyright (c) 1990 Regents of the University of Michigan.
9  *  All rights reserved.
10  *
11  *  delete.c
12  */
13 
14 #ifndef lint
15 static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
16 #endif
17 
18 #include <stdio.h>
19 #include <string.h>
20 
21 #ifdef MACOS
22 #include "macos.h"
23 #endif /* MACOS */
24 
25 #if defined( DOS ) || defined( _WIN32 )
26 #include "msdos.h"
27 #endif /* DOS */
28 
29 #if !defined( MACOS ) && !defined( DOS )
30 #include <sys/types.h>
31 #include <sys/socket.h>
32 #endif
33 
34 #include "lber.h"
35 #include "ldap.h"
36 #include "ldap-private.h"
37 #include "ldap-int.h"
38 
ldap_build_delete_req(LDAP * ld,char * dn,LDAPControl ** serverctrls)39 BerElement * ldap_build_delete_req(LDAP *ld, char *dn, LDAPControl **serverctrls)
40 {
41 	BerElement	*ber;
42 	int rv;
43 
44 	/* create a message to send */
45 	if ( (ber = alloc_ber_with_options( ld )) == NULLBER ) {
46 		ld->ld_errno = LDAP_NO_MEMORY;
47 		return(NULLBER );
48 	}
49 
50 	if ( ber_printf( ber, "{its", ++ld->ld_msgid, LDAP_REQ_DELETE, dn ) == -1 ) {
51 		ld->ld_errno = LDAP_ENCODING_ERROR;
52 		ber_free( ber, 1 );
53 		return(NULLBER );
54 	}
55 
56 	/* LDAPv3 */
57 	/* Code controls if any */
58 	if (serverctrls && serverctrls[0]) {
59 		if (ldap_controls_code(ber, serverctrls) != LDAP_SUCCESS){
60 			ld->ld_errno = LDAP_ENCODING_ERROR;
61 			ber_free( ber, 1 );
62 			return( NULLBER );
63 		}
64 	} else if (ld->ld_srvctrls && ld->ld_srvctrls[0]) {
65 		/* Otherwise, is there any global server ctrls ? */
66 		if (ldap_controls_code(ber, ld->ld_srvctrls) != LDAP_SUCCESS){
67 			ld->ld_errno = LDAP_ENCODING_ERROR;
68 			ber_free( ber, 1 );
69 			return( NULLBER );
70 		}
71 	}
72 
73 	if ( ber_printf( ber, "}" ) == -1 ) {
74 		ld->ld_errno = LDAP_ENCODING_ERROR;
75 		ber_free( ber, 1 );
76 		return( NULLBER );
77 	}
78 
79 	return (ber);
80 }
81 
82 /*
83  * ldap_delete - initiate an ldap (and X.500) delete operation. Parameters:
84  *
85  *	ld		LDAP descriptor
86  *	dn		DN of the object to delete
87  *
88  * Example:
89  *	msgid = ldap_delete( ld, dn );
90  */
91 int
ldap_delete(LDAP * ld,char * dn)92 ldap_delete( LDAP *ld, char *dn )
93 {
94 	BerElement	*ber;
95 	int rv;
96 
97 	/*
98 	 * A delete request looks like this:
99 	 *	DelRequet ::= DistinguishedName,
100 	 */
101 
102 	Debug( LDAP_DEBUG_TRACE, catgets(slapdcat, 1, 129, "ldap_delete\n"), 0, 0, 0 );
103 
104 #ifdef _REENTRANT
105 	LOCK_LDAP(ld);
106 #endif
107 
108 	if (( ber = ldap_build_delete_req(ld, dn, NULL)) == NULLBER) {
109 #ifdef _REENTRANT
110 		UNLOCK_LDAP(ld);
111 #endif
112 		return (-1);
113 	}
114 
115 	/* send the message */
116 	rv = send_initial_request( ld, LDAP_REQ_DELETE, dn, ber );
117 #ifdef _REENTRANT
118 	UNLOCK_LDAP(ld);
119 #endif
120 	return ( rv );
121 }
122 
123 
124 int
ldap_delete_s(LDAP * ld,char * dn)125 ldap_delete_s( LDAP *ld, char *dn )
126 {
127 	int		msgid;
128 	LDAPMessage	*res;
129 
130 	if ( (msgid = ldap_delete( ld, dn )) == -1 )
131 		return( ld->ld_errno );
132 
133 	if ( ldap_result( ld, msgid, 1, (struct timeval *) NULL, &res ) == -1 )
134 		return( ld->ld_errno );
135 
136 	return( ldap_result2error( ld, res, 1 ) );
137 }
138 
139 /* ldapv3 API extensions */
140 
ldap_delete_ext(LDAP * ld,char * dn,LDAPControl ** serverctrls,LDAPControl ** clientctrls,int * msgidp)141 int ldap_delete_ext(LDAP *ld, char *dn, LDAPControl **serverctrls, LDAPControl **clientctrls, int *msgidp)
142 {
143 	BerElement	*ber;
144 	int rv;
145 
146 #ifdef _REENTRANT
147 	LOCK_LDAP(ld);
148 #endif
149 
150 	Debug( LDAP_DEBUG_TRACE, catgets(slapdcat, 1, 192, "ldap_modify\n"), 0, 0, 0 );
151 
152 	if ((ber = ldap_build_delete_req(ld, dn, serverctrls)) == NULLBER){
153 		rv = ld->ld_errno;
154 		if (rv == LDAP_SUCCESS)
155 			rv = LDAP_OTHER;
156 #ifdef _REENTRANT
157 		UNLOCK_LDAP(ld);
158 #endif
159 		return (rv);
160 	}
161 
162 	/* send the message */
163 	rv =  send_initial_request( ld, LDAP_REQ_DELETE, dn, ber );
164 	if (rv == -1){
165 		rv = ld->ld_errno;
166 		if (rv == LDAP_SUCCESS){
167 			rv = LDAP_OTHER;
168 		}
169 #ifdef _REENTRANT
170 		UNLOCK_LDAP(ld);
171 #endif
172 		return (rv);
173 	}
174 	*msgidp = rv;
175 #ifdef _REENTRANT
176 	UNLOCK_LDAP(ld);
177 #endif
178 	return ( LDAP_SUCCESS );
179 }
180 
ldap_delete_ext_s(LDAP * ld,char * dn,LDAPControl ** serverctrls,LDAPControl ** clientctrls)181 int ldap_delete_ext_s(LDAP *ld, char *dn, LDAPControl **serverctrls, LDAPControl **clientctrls)
182 {
183 	int msgid;
184 	int retcode = LDAP_SUCCESS;
185 	LDAPMessage *res;
186 
187 	if ((retcode = ldap_delete_ext(ld, dn, serverctrls, clientctrls, &msgid)) != LDAP_SUCCESS)
188 		return (retcode);
189 	if (ldap_result(ld, msgid, 1, (struct timeval *)NULL, &res ) == -1)
190 		return (ld->ld_errno );
191 
192 #ifdef  _REENTRANT
193 	LOCK_LDAP(ld);
194 #endif
195 	retcode = ldap_parse_result( ld, res,  &ld->ld_errno, &ld->ld_matched, &ld->ld_error,
196 								 &ld->ld_referrals, &ld->ld_ret_ctrls, 1);
197 	if (retcode == LDAP_SUCCESS)
198 		retcode = ld->ld_errno;
199 #ifdef  _REENTRANT
200 	UNLOCK_LDAP(ld);
201 #endif
202 	return (retcode);
203 }
204