1 /* $NetBSD: getentry.c,v 1.2 2020/08/11 13:15:37 christos Exp $ */ 2 3 /* $OpenLDAP$ */ 4 /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 5 * 6 * Copyright 1998-2020 The OpenLDAP Foundation. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted only as authorized by the OpenLDAP 11 * Public License. 12 * 13 * A copy of this license is available in the file LICENSE in the 14 * top-level directory of the distribution or, alternatively, at 15 * <http://www.OpenLDAP.org/license.html>. 16 */ 17 /* Portions Copyright (c) 1990 Regents of the University of Michigan. 18 * All rights reserved. 19 */ 20 21 #include <sys/cdefs.h> 22 __RCSID("$NetBSD: getentry.c,v 1.2 2020/08/11 13:15:37 christos Exp $"); 23 24 #include "portable.h" 25 26 #include <stdio.h> 27 #include <ac/stdlib.h> 28 29 #include <ac/socket.h> 30 #include <ac/string.h> 31 #include <ac/time.h> 32 33 #include "ldap-int.h" 34 35 /* ARGSUSED */ 36 LDAPMessage * 37 ldap_first_entry( LDAP *ld, LDAPMessage *chain ) 38 { 39 assert( ld != NULL ); 40 assert( LDAP_VALID( ld ) ); 41 assert( chain != NULL ); 42 43 return chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY 44 ? chain 45 : ldap_next_entry( ld, chain ); 46 } 47 48 LDAPMessage * 49 ldap_next_entry( LDAP *ld, LDAPMessage *entry ) 50 { 51 assert( ld != NULL ); 52 assert( LDAP_VALID( ld ) ); 53 assert( entry != NULL ); 54 55 for( 56 entry = entry->lm_chain; 57 entry != NULL; 58 entry = entry->lm_chain ) 59 { 60 if( entry->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) { 61 return( entry ); 62 } 63 } 64 65 return( NULL ); 66 } 67 68 int 69 ldap_count_entries( LDAP *ld, LDAPMessage *chain ) 70 { 71 int i; 72 73 assert( ld != NULL ); 74 assert( LDAP_VALID( ld ) ); 75 76 for ( i = 0; chain != NULL; chain = chain->lm_chain ) { 77 if( chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) { 78 i++; 79 } 80 } 81 82 return( i ); 83 } 84 85 int 86 ldap_get_entry_controls( 87 LDAP *ld, 88 LDAPMessage *entry, 89 LDAPControl ***sctrls ) 90 { 91 int rc; 92 BerElement be; 93 94 assert( ld != NULL ); 95 assert( LDAP_VALID( ld ) ); 96 assert( entry != NULL ); 97 assert( sctrls != NULL ); 98 99 if ( entry->lm_msgtype != LDAP_RES_SEARCH_ENTRY ) { 100 return LDAP_PARAM_ERROR; 101 } 102 103 /* make a local copy of the BerElement */ 104 AC_MEMCPY(&be, entry->lm_ber, sizeof(be)); 105 106 if ( ber_scanf( &be, "{xx" /*}*/ ) == LBER_ERROR ) { 107 rc = LDAP_DECODING_ERROR; 108 goto cleanup_and_return; 109 } 110 111 rc = ldap_pvt_get_controls( &be, sctrls ); 112 113 cleanup_and_return: 114 if( rc != LDAP_SUCCESS ) { 115 ld->ld_errno = rc; 116 117 if( ld->ld_matched != NULL ) { 118 LDAP_FREE( ld->ld_matched ); 119 ld->ld_matched = NULL; 120 } 121 122 if( ld->ld_error != NULL ) { 123 LDAP_FREE( ld->ld_error ); 124 ld->ld_error = NULL; 125 } 126 } 127 128 return rc; 129 } 130