Back to index

lightning-sunbird  0.9+nobinonly
getattr.c
Go to the documentation of this file.
00001 /* ***** BEGIN LICENSE BLOCK *****
00002  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00003  *
00004  * The contents of this file are subject to the Mozilla Public License Version
00005  * 1.1 (the "License"); you may not use this file except in compliance with
00006  * the License. You may obtain a copy of the License at
00007  * http://www.mozilla.org/MPL/
00008  *
00009  * Software distributed under the License is distributed on an "AS IS" basis,
00010  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00011  * for the specific language governing rights and limitations under the
00012  * License.
00013  *
00014  * The Original Code is Mozilla Communicator client code, released
00015  * March 31, 1998.
00016  *
00017  * The Initial Developer of the Original Code is
00018  * Netscape Communications Corporation.
00019  * Portions created by the Initial Developer are Copyright (C) 1998-1999
00020  * the Initial Developer. All Rights Reserved.
00021  *
00022  * Contributor(s):
00023  *
00024  * Alternatively, the contents of this file may be used under the terms of
00025  * either the GNU General Public License Version 2 or later (the "GPL"), or
00026  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00027  * in which case the provisions of the GPL or the LGPL are applicable instead
00028  * of those above. If you wish to allow use of your version of this file only
00029  * under the terms of either the GPL or the LGPL, and not to allow others to
00030  * use your version of this file under the terms of the MPL, indicate your
00031  * decision by deleting the provisions above and replace them with the notice
00032  * and other provisions required by the GPL or the LGPL. If you do not delete
00033  * the provisions above, a recipient may use your version of this file under
00034  * the terms of any one of the MPL, the GPL or the LGPL.
00035  *
00036  * ***** END LICENSE BLOCK ***** */
00037 /*
00038  *  Copyright (c) 1990 Regents of the University of Michigan.
00039  *  All rights reserved.
00040  */
00041 /*
00042  *  getattr.c
00043  */
00044 
00045 #if 0
00046 #ifndef lint 
00047 static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
00048 #endif
00049 #endif
00050 
00051 #include "ldap-int.h"
00052 
00053 
00054 static unsigned long
00055 bytes_remaining( BerElement *ber )
00056 {
00057        unsigned long len;
00058 
00059        if ( ber_get_option( ber, LBER_OPT_REMAINING_BYTES, &len ) != 0 ) {
00060               return( 0 );  /* not sure what else to do.... */
00061        }
00062        return( len );
00063 }
00064 
00065 
00066 char *
00067 LDAP_CALL
00068 ldap_first_attribute( LDAP *ld, LDAPMessage *entry, BerElement **ber )
00069 {
00070        char   *attr;
00071        int    err;
00072        long   seqlength;
00073 
00074        LDAPDebug( LDAP_DEBUG_TRACE, "ldap_first_attribute\n", 0, 0, 0 );
00075 
00076        if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
00077               return( NULL );             /* punt */
00078        }
00079 
00080        if ( ber == NULL || !NSLDAPI_VALID_LDAPMESSAGE_ENTRY_POINTER( entry )) {
00081               LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
00082               return( NULL );
00083        }
00084        
00085        if ( nsldapi_alloc_ber_with_options( ld, ber ) != LDAP_SUCCESS ) {
00086               return( NULL );
00087        }
00088 
00089        **ber = *entry->lm_ber;
00090 
00091        attr = NULL;                /* pessimistic */
00092        err = LDAP_DECODING_ERROR;  /* ditto */
00093 
00094        /* 
00095         * Skip past the sequence, dn, and sequence of sequence.
00096         * Reset number of bytes remaining so we confine the rest of our
00097         * decoding to the current sequence.
00098         */
00099        if ( ber_scanf( *ber, "{xl{", &seqlength ) != LBER_ERROR &&
00100             ber_set_option( *ber, LBER_OPT_REMAINING_BYTES, &seqlength )
00101            == 0 ) {
00102               /* snarf the attribute type, and skip the set of values,
00103                * leaving us positioned right before the next attribute
00104                * type/value sequence.
00105                */
00106               if ( ber_scanf( *ber, "{ax}", &attr ) != LBER_ERROR ||
00107                   bytes_remaining( *ber ) == 0 ) {
00108                      err = LDAP_SUCCESS;
00109               }
00110        }
00111 
00112        LDAP_SET_LDERRNO( ld, err, NULL, NULL );
00113        if ( attr == NULL || err != LDAP_SUCCESS ) {
00114               ber_free( *ber, 0 );
00115               *ber = NULL;
00116        }
00117        return( attr );
00118 }
00119 
00120 /* ARGSUSED */
00121 char *
00122 LDAP_CALL
00123 ldap_next_attribute( LDAP *ld, LDAPMessage *entry, BerElement *ber )
00124 {
00125        char   *attr;
00126        int    err;
00127 
00128        LDAPDebug( LDAP_DEBUG_TRACE, "ldap_next_attribute\n", 0, 0, 0 );
00129 
00130        if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
00131               return( NULL );             /* punt */
00132        }
00133 
00134        if ( ber == NULL || !NSLDAPI_VALID_LDAPMESSAGE_ENTRY_POINTER( entry )) {
00135               LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
00136               return( NULL );
00137        }
00138 
00139        attr = NULL;                /* pessimistic */
00140        err = LDAP_DECODING_ERROR;  /* ditto */
00141 
00142        /* skip sequence, snarf attribute type, skip values */
00143        if ( ber_scanf( ber, "{ax}", &attr ) != LBER_ERROR ||
00144            bytes_remaining( ber ) == 0 ) {
00145               err = LDAP_SUCCESS;
00146        }
00147 
00148        LDAP_SET_LDERRNO( ld, err, NULL, NULL );
00149        return( attr );
00150 }