]> git.sur5r.net Git - openldap/blob - libraries/libldap/getentry.c
Merge in all devel changes since 2.0-alpha2.
[openldap] / libraries / libldap / getentry.c
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 1998-1999 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  *  getentry.c
11  */
12
13 #include "portable.h"
14
15 #include <stdio.h>
16 #include <ac/stdlib.h>
17
18 #include <ac/ctype.h>
19 #include <ac/socket.h>
20 #include <ac/string.h>
21 #include <ac/time.h>
22
23 #include "ldap-int.h"
24
25 /* ARGSUSED */
26 LDAPMessage *
27 ldap_first_entry( LDAP *ld, LDAPMessage *chain )
28 {
29         assert( ld != NULL );
30         assert( LDAP_VALID( ld ) );
31         assert( chain != NULL );
32
33         if( ld == NULL || chain == NULL ) {
34                 return NULL;
35         }
36
37         return chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY
38                 ? chain
39                 : ldap_next_entry( ld, chain );
40 }
41
42 LDAPMessage *
43 ldap_next_entry( LDAP *ld, LDAPMessage *entry )
44 {
45         assert( ld != NULL );
46         assert( LDAP_VALID( ld ) );
47         assert( entry != NULL );
48
49         if ( ld == NULL || entry == NULL ) {
50                 return NULL;
51         }
52
53         for (
54                 entry = entry->lm_chain;
55                 entry != NULL;
56                 entry = entry->lm_chain )
57         {
58                 if( entry->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) {
59                         return( entry );
60                 }
61         }
62
63         return( NULL );
64 }
65
66 int
67 ldap_count_entries( LDAP *ld, LDAPMessage *chain )
68 {
69         int     i;
70
71         assert( ld != NULL );
72         assert( LDAP_VALID( ld ) );
73
74         if ( ld == NULL ) {
75                 return -1;
76         }
77
78         for ( i = 0; chain != NULL; chain = chain->lm_chain ) {
79                 if( chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) {
80                         i++;
81                 }
82         }
83
84         return( i );
85 }
86
87 int
88 ldap_get_entry_controls(
89         LDAP *ld,
90         LDAPMessage *entry, 
91         LDAPControl ***sctrls )
92 {
93         int rc;
94         BerElement be;
95
96         assert( ld != NULL );
97         assert( LDAP_VALID( ld ) );
98         assert( entry != NULL );
99         assert( sctrls != NULL );
100
101         if ( ld == NULL || sctrls == NULL ||
102                 entry == NULL || entry->lm_msgtype == LDAP_RES_SEARCH_ENTRY )
103         {
104                 return LDAP_PARAM_ERROR;
105         }
106
107         /* make a local copy of the BerElement */
108         SAFEMEMCPY(&be, entry->lm_ber, sizeof(be));
109
110         if ( ber_scanf( &be, "{xx" /*}*/ ) == LBER_ERROR ) {
111                 rc = LDAP_DECODING_ERROR;
112                 goto cleanup_and_return;
113         }
114
115         rc = ldap_int_get_controls( &be, sctrls );
116
117 cleanup_and_return:
118         if( rc != LDAP_SUCCESS ) {
119                 ld->ld_errno = rc;
120
121                 if( ld->ld_matched != NULL ) {
122                         LDAP_FREE( ld->ld_matched );
123                         ld->ld_matched = NULL;
124                 }
125
126                 if( ld->ld_error != NULL ) {
127                         LDAP_FREE( ld->ld_error );
128                         ld->ld_error = NULL;
129                 }
130         }
131
132         return rc;
133 }