/* io.c - ber general i/o routines */
+/* $OpenLDAP$ */
/*
* Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
#include <io.h>
#endif
-#undef LDAP_F_PRE
-#define LDAP_F_PRE LDAP_F_EXPORT
-
#include "lber-int.h"
static ber_slen_t BerRead LDAP_P((
char *buf,
ber_len_t len ));
-static int ber_realloc LDAP_P((
- BerElement *ber,
- ber_len_t len ));
-
#define EXBUFSIZ 1024
/* probably far too large... */
}
}
-static int
+int
ber_realloc( BerElement *ber, ber_len_t len )
{
ber_len_t need, have, total;
assert( BER_VALID( ber ) );
- if ( freebuf && ber->ber_buf != NULL )
+ if ( freebuf ) {
+ Seqorset *s, *next;
LBER_FREE( ber->ber_buf );
+ for( s = ber->ber_sos ; s != NULL ; s = next ) {
+ next = s->sos_next;
+ LBER_FREE( s );
+ }
+ }
+
ber->ber_buf = NULL;
+ ber->ber_sos = NULL;
ber->ber_valid = LBER_UNINITIALIZED;
LBER_FREE( (char *) ber );
if ( sb->sb_options & (LBER_TO_FILE | LBER_TO_FILE_ONLY) ) {
rc = write( sb->sb_fd, ber->ber_rwptr, towrite );
if ( sb->sb_options & LBER_TO_FILE_ONLY ) {
+ if ( freeit )
+ ber_free( ber, 1 );
return( (int)rc );
}
}
}
BerElement *
-ber_dup( LDAP_CONST BerElement *ber )
+ber_dup( BerElement *ber )
{
BerElement *new;
** the returned berval.
*/
int ber_flatten(
- LDAP_CONST BerElement *ber,
+ BerElement *ber,
struct berval **bvPtr)
{
struct berval *bv;
ber->ber_tag = 0;
}
-#define PTR_IN_VAR( ptr, var )\
-(((ptr)>=(char *) &(var)) && ((ptr)< (char *) &(var)+sizeof(var)))
+#undef PTR_IN_VAR
+#define PTR_IN_VAR( ptr, var ) \
+ (((ptr)>=(char *) &(var)) && ((ptr)< (char *) &(var)+sizeof(var)))
if (PTR_IN_VAR(ber->ber_rwptr, ber->ber_tag)) {
if (ber->ber_rwptr == (char *) &ber->ber_tag) {
ber->ber_rwptr = (char *) &ber->ber_usertag;
goto get_lenbyte;
}
- } while (PTR_IN_VAR(ber->ber_rwptr,ber->ber_tag));
+ } while( PTR_IN_VAR(ber->ber_rwptr, ber->ber_tag ));
errno = ERANGE; /* this is a serious error. */
return LBER_DEFAULT;
}
+
get_lenbyte:
if (ber->ber_rwptr==(char *) &ber->ber_usertag) {
unsigned char c;
goto fill_buffer;
}
}
+
if (PTR_IN_VAR(ber->ber_rwptr, ber->ber_len)) {
+ unsigned char netlen[sizeof(ber_len_t)];
+
ber_slen_t res;
ber_slen_t to_go;
to_go = (char *) &ber->ber_len + sizeof( ber->ber_len ) -
ber->ber_rwptr;
assert( to_go > 0 );
- res = ber_pvt_sb_read( sb, ber->ber_rwptr, to_go );
- if (res <=0)
+ res = ber_pvt_sb_read( sb, netlen, to_go );
+ if (res <= 0) {
return LBER_DEFAULT;
+ }
ber->ber_rwptr += res;
+
if (res==to_go) {
/* convert length. */
- ber->ber_len = LBER_LEN_NTOH( ber->ber_len );
+ ber->ber_len = 0;
+ for( to_go = 0; to_go < res ; to_go++ ) {
+ ber->ber_len <<= 8;
+ ber->ber_len |= netlen[to_go];
+ }
goto fill_buffer;
} else {
#if defined( EWOULDBLOCK )
return LBER_DEFAULT;
}
}
+
fill_buffer:
/* now fill the buffer. */
if (ber->ber_buf==NULL) {
ber->ber_ptr = ber->ber_buf;
ber->ber_end = ber->ber_buf + ber->ber_len;
}
+
if ((ber->ber_rwptr>=ber->ber_buf) && (ber->ber_rwptr<ber->ber_end)) {
ber_slen_t res;
ber_slen_t to_go;