X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=libraries%2Fliblber%2Fio.c;h=05773e900bf407bcde702dd17262311dbdd57db5;hb=19324c4292a358389b4bbe5ced12388ddccb2f55;hp=96b02ad861e61eada4229ec1a724833b0e95cc16;hpb=b1639dadd64cd24779a0ee2cc03c6028a4b1f7a3;p=openldap diff --git a/libraries/liblber/io.c b/libraries/liblber/io.c index 96b02ad861..05773e900b 100644 --- a/libraries/liblber/io.c +++ b/libraries/liblber/io.c @@ -1,7 +1,7 @@ /* io.c - ber general i/o routines */ /* $OpenLDAP$ */ /* - * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* Portions @@ -34,15 +34,6 @@ #include "lber-int.h" -static ber_slen_t BerRead LDAP_P(( - Sockbuf *sb, - 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... */ @@ -56,7 +47,7 @@ static int ber_realloc LDAP_P(( static ber_slen_t BerRead( Sockbuf *sb, - char *buf, + unsigned char *buf, ber_len_t len ) { ber_slen_t c; @@ -68,12 +59,12 @@ BerRead( assert( SOCKBUF_VALID( sb ) ); while ( len > 0 ) { - if ( (c = ber_pvt_sb_read( sb, buf, len )) <= 0 ) { + if ( (c = ber_int_sb_read( sb, buf, len )) <= 0 ) { if ( nread > 0 ) break; return( c ); } - buf+= c; + buf+=c; nread+=c; len-=c; } @@ -137,7 +128,7 @@ ber_write( } } -static int +int ber_realloc( BerElement *ber, ber_len_t len ) { ber_len_t need, have, total; @@ -225,7 +216,7 @@ ber_flush( Sockbuf *sb, BerElement *ber, int freeit ) assert( sb != NULL ); assert( ber != NULL ); - assert( SOCKBUF_VALID( ber ) ); + assert( SOCKBUF_VALID( sb ) ); assert( BER_VALID( ber ) ); if ( ber->ber_rwptr == NULL ) { @@ -235,27 +226,16 @@ ber_flush( Sockbuf *sb, BerElement *ber, int freeit ) if ( sb->sb_debug ) { ber_log_printf( LDAP_DEBUG_ANY, sb->sb_debug, - "ber_flush: %ld bytes to sd %ld%s\n", towrite, - (long) sb->sb_sd, ber->ber_rwptr != ber->ber_buf ? " (re-flush)" - : "" ); + "ber_flush: %ld bytes to sd %ld%s\n", + towrite, (long) sb->sb_fd, + ber->ber_rwptr != ber->ber_buf ? " (re-flush)" : "" ); ber_log_bprint( LDAP_DEBUG_PACKETS, sb->sb_debug, ber->ber_rwptr, towrite ); } -#if HAVE_WRITE - 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 ); - } - } -#endif - nwritten = 0; do { - rc = ber_pvt_sb_write( sb, ber->ber_rwptr, towrite ); + rc = ber_int_sb_write( sb, ber->ber_rwptr, towrite ); if (rc<=0) { return -1; } @@ -450,7 +430,7 @@ get_tag( Sockbuf *sb ) assert( sb != NULL ); assert( SOCKBUF_VALID( sb ) ); - if ( ber_pvt_sb_read( sb, (char *) &xbyte, 1 ) != 1 ) + if ( ber_int_sb_read( sb, (char *) &xbyte, 1 ) != 1 ) return( LBER_DEFAULT ); if ( (xbyte & LBER_BIG_TAG_MASK) != LBER_BIG_TAG_MASK ) @@ -459,7 +439,7 @@ get_tag( Sockbuf *sb ) tagp = (char *) &tag; tagp[0] = xbyte; for ( i = 1; i < sizeof(ber_tag_t); i++ ) { - if ( ber_pvt_sb_read( sb, (char *) &xbyte, 1 ) != 1 ) + if ( ber_int_sb_read( sb, (char *) &xbyte, 1 ) != 1 ) return( LBER_DEFAULT ); tagp[i] = xbyte; @@ -479,7 +459,7 @@ get_tag( Sockbuf *sb ) /* * A rewrite of ber_get_next that can safely be called multiple times - * for the same packet. It will simply continue were it stopped until + * for the same packet. It will simply continue where it stopped until * a full packet is read. */ @@ -526,7 +506,7 @@ ber_get_next( if (PTR_IN_VAR(ber->ber_rwptr, ber->ber_tag)) { if (ber->ber_rwptr == (char *) &ber->ber_tag) { - if (ber_pvt_sb_read( sb, ber->ber_rwptr, 1)<=0) + if (ber_int_sb_read( sb, ber->ber_rwptr, 1)<=0) return LBER_DEFAULT; if ((ber->ber_rwptr[0] & LBER_BIG_TAG_MASK) != LBER_BIG_TAG_MASK) { @@ -538,8 +518,10 @@ ber_get_next( } do { /* reading the tag... */ - if (ber_pvt_sb_read( sb, ber->ber_rwptr, 1)<=0) + if (ber_int_sb_read( sb, ber->ber_rwptr, 1)<=0) { return LBER_DEFAULT; + } + if (! (ber->ber_rwptr[0] & LBER_MORE_TAG_MASK) ) { ber->ber_tag>>=sizeof(ber->ber_tag) - ((char *) &ber->ber_tag - ber->ber_rwptr); @@ -547,6 +529,7 @@ ber_get_next( goto get_lenbyte; } } while( PTR_IN_VAR(ber->ber_rwptr, ber->ber_tag )); + errno = ERANGE; /* this is a serious error. */ return LBER_DEFAULT; } @@ -554,7 +537,7 @@ ber_get_next( get_lenbyte: if (ber->ber_rwptr==(char *) &ber->ber_usertag) { unsigned char c; - if (ber_pvt_sb_read( sb, (char *) &c, 1)<=0) + if (ber_int_sb_read( sb, (char *) &c, 1)<=0) return LBER_DEFAULT; if (c & 0x80U) { int len = c & 0x7fU; @@ -579,27 +562,17 @@ get_lenbyte: to_go = (char *) &ber->ber_len + sizeof( ber->ber_len ) - ber->ber_rwptr; assert( to_go > 0 ); - res = ber_pvt_sb_read( sb, netlen, to_go ); + res = BerRead( sb, netlen, to_go ); if (res <= 0) { return LBER_DEFAULT; } ber->ber_rwptr += res; - if (res==to_go) { - /* convert length. */ - 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 ) - errno = EWOULDBLOCK; -#elif defined( EAGAIN ) - errno = EAGAIN; -#endif - return LBER_DEFAULT; + /* convert length. */ + ber->ber_len = 0; + for( to_go = 0; to_go < res ; to_go++ ) { + ber->ber_len <<= 8; + ber->ber_len |= netlen[to_go]; } } @@ -625,7 +598,7 @@ fill_buffer: to_go = ber->ber_end - ber->ber_rwptr; assert( to_go > 0 ); - res = ber_pvt_sb_read( sb, ber->ber_rwptr, to_go ); + res = ber_int_sb_read( sb, ber->ber_rwptr, to_go ); if (res<=0) return LBER_DEFAULT; ber->ber_rwptr+=res;