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