1 #pragma ident	"%Z%%M%	%I%	%E% SMI"
2 
3 /*
4  * The contents of this file are subject to the Netscape Public
5  * License Version 1.1 (the "License"); you may not use this file
6  * except in compliance with the License. You may obtain a copy of
7  * the License at http://www.mozilla.org/NPL/
8  *
9  * Software distributed under the License is distributed on an "AS
10  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11  * implied. See the License for the specific language governing
12  * rights and limitations under the License.
13  *
14  * The Original Code is Mozilla Communicator client code, released
15  * March 31, 1998.
16  *
17  * The Initial Developer of the Original Code is Netscape
18  * Communications Corporation. Portions created by Netscape are
19  * Copyright (C) 1998-1999 Netscape Communications Corporation. All
20  * Rights Reserved.
21  *
22  * Contributor(s):
23  */
24 /*
25  *  Copyright (c) 1990 Regents of the University of Michigan.
26  *  All rights reserved.
27  */
28 /*
29  *  getentry.c
30  */
31 
32 #if 0
33 #ifndef lint
34 static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
35 #endif
36 #endif
37 
38 #include "ldap-int.h"
39 
40 LDAPMessage *
41 LDAP_CALL
42 ldap_first_entry( LDAP *ld, LDAPMessage *chain )
43 {
44 	if ( !NSLDAPI_VALID_LDAP_POINTER( ld ) || chain == NULLMSG ) {
45 		return( NULLMSG );
46 	}
47 
48 	if ( chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) {
49 		return( chain );
50 	}
51 
52 	return( ldap_next_entry( ld, chain ));
53 }
54 
55 
56 LDAPMessage *
57 LDAP_CALL
58 ldap_next_entry( LDAP *ld, LDAPMessage *entry )
59 {
60 	if ( !NSLDAPI_VALID_LDAP_POINTER( ld ) || entry == NULLMSG ) {
61 		return( NULLMSG );
62 	}
63 
64 	for ( entry = entry->lm_chain; entry != NULLMSG;
65 	    entry = entry->lm_chain ) {
66 		if ( entry->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) {
67 			return( entry );
68 		}
69 	}
70 
71 	return( NULLMSG );
72 }
73 
74 int
75 LDAP_CALL
76 ldap_count_entries( LDAP *ld, LDAPMessage *chain )
77 {
78 	int	i;
79 
80 	if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
81 		return( -1 );
82 	}
83 
84 	for ( i = 0; chain != NULL; chain = chain->lm_chain ) {
85 		if ( chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) {
86 			++i;
87 		}
88 	}
89 
90 	return( i );
91 }
92 
93 
94 int
95 LDAP_CALL
96 ldap_get_entry_controls( LDAP *ld, LDAPMessage *entry,
97 	LDAPControl ***serverctrlsp )
98 {
99 	int		rc;
100 	BerElement	tmpber;
101 
102 	LDAPDebug( LDAP_DEBUG_TRACE, "ldap_get_entry_controls\n", 0, 0, 0 );
103 
104 	if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
105 		return( LDAP_PARAM_ERROR );
106 	}
107 
108 	if ( !NSLDAPI_VALID_LDAPMESSAGE_ENTRY_POINTER( entry )
109 	    || serverctrlsp == NULL ) {
110 		rc = LDAP_PARAM_ERROR;
111 		goto report_error_and_return;
112 	}
113 
114 	*serverctrlsp = NULL;
115 	tmpber = *entry->lm_ber;	/* struct copy */
116 
117 	/* skip past dn and entire attribute/value list */
118 	if ( ber_scanf( &tmpber, "{xx" ) == LBER_ERROR ) {
119 		rc = LDAP_DECODING_ERROR;
120 		goto report_error_and_return;
121 	}
122 
123 	rc = nsldapi_get_controls( &tmpber, serverctrlsp );
124 
125 report_error_and_return:
126 	LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
127 	return( rc );
128 }
129