]> git.sur5r.net Git - openldap/blob - libraries/libldap/delete.c
Minor adjustments to the LBER_VFREE() & LDAP_VFREE macros.
[openldap] / libraries / libldap / delete.c
1 /*
2  * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
3  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
4  */
5 /*  Portions
6  *  Copyright (c) 1990 Regents of the University of Michigan.
7  *  All rights reserved.
8  *
9  *  delete.c
10  */
11
12 #include "portable.h"
13
14 #include <stdio.h>
15
16 #include <ac/socket.h>
17 #include <ac/string.h>
18 #include <ac/time.h>
19
20 #include "ldap-int.h"
21
22 /*
23  * ldap_delete_ext - initiate an ldap extended delete operation. Parameters:
24  *
25  *      ld              LDAP descriptor
26  *      dn              DN of the object to delete
27  *      sctrls  Server Controls
28  *      cctrls  Client Controls
29  *      msgidp  Message Id Pointer
30  *
31  * Example:
32  *      rc = ldap_delete( ld, dn, sctrls, cctrls, msgidp );
33  */
34 int
35 ldap_delete_ext(
36         LDAP *ld,
37         LDAP_CONST char* dn,
38         LDAPControl **sctrls,
39         LDAPControl **cctrls,
40         int *msgidp )
41 {
42         BerElement      *ber;
43
44         /*
45          * A delete request looks like this:
46          *      DelRequet ::= DistinguishedName,
47          */
48
49         Debug( LDAP_DEBUG_TRACE, "ldap_delete\n", 0, 0, 0 );
50
51         /* create a message to send */
52         if ( (ber = ldap_alloc_ber_with_options( ld )) == NULLBER ) {
53                 ld->ld_errno = LDAP_NO_MEMORY;
54                 return( ld->ld_errno );
55         }
56
57         if ( ber_printf( ber, "{its", /* leave open - '}' */
58                 ++ld->ld_msgid, LDAP_REQ_DELETE, dn ) == -1 )
59         {
60                 ld->ld_errno = LDAP_ENCODING_ERROR;
61                 ber_free( ber, 1 );
62                 return( ld->ld_errno );
63         }
64
65         /* Put Server Controls */
66         if( ldap_int_put_controls( ld, sctrls, ber ) != LDAP_SUCCESS ) {
67                 ber_free( ber, 1 );
68                 return ld->ld_errno;
69         }
70
71         /* close '{' */
72         if ( ber_printf( ber, "}" ) == -1 ) {
73                 ld->ld_errno = LDAP_ENCODING_ERROR;
74                 ber_free( ber, 1 );
75                 return( ld->ld_errno );
76         }
77
78         /* send the message */
79         *msgidp = ldap_send_initial_request( ld, LDAP_REQ_DELETE, dn, ber );
80
81         if(*msgidp < 0)
82                 return ld->ld_errno;
83
84         return LDAP_SUCCESS;
85 }
86
87 int
88 ldap_delete_ext_s(
89         LDAP *ld,
90         LDAP_CONST char *dn,
91         LDAPControl **sctrls,
92         LDAPControl **cctrls )
93 {
94         int     msgid;
95         int rc;
96         LDAPMessage     *res;
97
98         rc = ldap_delete_ext( ld, dn, sctrls, cctrls, &msgid );
99         
100         if( rc != LDAP_SUCCESS )
101                 return( ld->ld_errno );
102
103         if ( ldap_result( ld, msgid, 1, (struct timeval *) NULL, &res ) == -1 )
104                 return( ld->ld_errno );
105
106         return( ldap_result2error( ld, res, 1 ) );
107 }
108 /*
109  * ldap_delete - initiate an ldap (and X.500) delete operation. Parameters:
110  *
111  *      ld              LDAP descriptor
112  *      dn              DN of the object to delete
113  *
114  * Example:
115  *      msgid = ldap_delete( ld, dn );
116  */
117 int
118 ldap_delete( LDAP *ld, LDAP_CONST char *dn )
119 {
120         int msgid;
121
122         /*
123          * A delete request looks like this:
124          *      DelRequet ::= DistinguishedName,
125          */
126
127         Debug( LDAP_DEBUG_TRACE, "ldap_delete\n", 0, 0, 0 );
128
129         return ldap_delete_ext( ld, dn, NULL, NULL, &msgid ) == LDAP_SUCCESS
130                 ? msgid : -1 ;
131 }
132
133
134 int
135 ldap_delete_s( LDAP *ld, LDAP_CONST char *dn )
136 {
137         return ldap_delete_ext_s( ld, dn, NULL, NULL );
138 }