X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblber%2Fsockbuf.c;h=5bdce3efbca2e76492e0a71063463d3039c32523;hb=304a57740a0dbb8c95bbbdada7b7972eee521fa0;hp=f34f457112cf03b2745ca693a2088683df38501d;hpb=db721ca82147ff4eea81629358cdacecfbd05d93;p=openldap diff --git a/libraries/liblber/sockbuf.c b/libraries/liblber/sockbuf.c index f34f457112..5bdce3efbc 100644 --- a/libraries/liblber/sockbuf.c +++ b/libraries/liblber/sockbuf.c @@ -1,4 +1,5 @@ /* sockbuf.c - i/o routines with support for adding i/o layers. */ +/* $OpenLDAP$ */ /* * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file @@ -7,7 +8,8 @@ #include "portable.h" #include -#include + +#include #include #include @@ -41,11 +43,11 @@ #define sockbuf_io_read( sb, buf, len ) \ ((sb)->sb_io->sbi_read( (sb), (buf), (len) )) -static long have_no_read( Sockbuf *sb, void *buf, long len ); -static long have_no_write( Sockbuf *sb, void *buf, long len ); +static ber_slen_t have_no_read( Sockbuf *sb, void *buf, ber_len_t len ); +static ber_slen_t have_no_write( Sockbuf *sb, void *buf, ber_len_t len ); static int have_no_close( Sockbuf *sb ); -static Sockbuf_IO lber_pvt_sb_IO_None= +static Sockbuf_IO sb_IO_None= { NULL, /* sbi_setup */ NULL, /* sbi_release */ @@ -57,6 +59,9 @@ static Sockbuf_IO lber_pvt_sb_IO_None= static void update_status( Sockbuf *sb ) { + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); + sb->sb_buf_ready = (sb->sb_buf.buf_ptr < sb->sb_buf.buf_end); #ifdef USE_SASL sb->sb_sec_ready = ((sb->sb_sec_buf_in.buf_end!=0) && @@ -69,9 +74,17 @@ update_status( Sockbuf *sb ) static int status_is_ok( Sockbuf *sb ) { - int obr = sb->sb_buf_ready; + int obr; #ifdef USE_SASL - int osr = sb->sb_sec_ready; + int osr; +#endif + + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); + + obr = sb->sb_buf_ready; +#ifdef USE_SASL + osr = sb->sb_sec_ready; #endif update_status(sb); @@ -88,20 +101,23 @@ status_is_ok( Sockbuf *sb ) #endif #ifdef USE_SASL -static long -packet_length( char *buf ) +static ber_len_t +packet_length( Sockbuf *sb, const char *buf ) { - long size; - size = (((unsigned long)buf[0])<<24)| - (((unsigned long)buf[1])<<16)| - (((unsigned long)buf[2])<<8)| - (((unsigned long)buf[3])); + ber_len_t size; + + assert( buf != NULL ); + + size = (((ber_len_t)buf[0])<<24)| + (((ber_len_t)buf[1])<<16)| + (((ber_len_t)buf[2])<<8)| + (((ber_len_t)buf[3])); - if ((size<0) || (size>MAX_BUF_SIZE)) { + if ( size > MAX_BUF_SIZE ) { /* somebody is trying to mess me up. */ - lber_log_printf( LDAP_DEBUG_SASL, sb->sb_debug, - "SASL: received packet length of %d bytes\n", - size ); + ber_log_printf( LDAP_DEBUG_SASL, sb->sb_debug, + "SASL: received packet length of %lu bytes\n", + (unsigned long) size ); size = 16; /* this should lead to an error. */ } @@ -110,11 +126,13 @@ packet_length( char *buf ) #endif static int -grow_buffer( Sockbuf_Buf * buf, long minsize ) +grow_buffer( Sockbuf_Buf * buf, ber_len_t minsize ) { - long pw=MIN_BUF_SIZE; + ber_len_t pw;; - for(;(pw MAX_BUF_SIZE) { /* this could mean that somebody is trying to crash us. */ return -1; @@ -126,15 +144,15 @@ grow_buffer( Sockbuf_Buf * buf, long minsize ) if ((buf->buf_base==NULL) || ((buf->buf_end==0) && (buf->buf_ptr==0))) { /* empty buffer */ if (buf->buf_base!=NULL) - free( buf->buf_base ); + LBER_FREE( buf->buf_base ); assert( buf->buf_ptr==0 ); assert( buf->buf_end==0 ); - buf->buf_base = malloc( minsize ); + buf->buf_base = LBER_MALLOC( minsize ); if (buf->buf_base==NULL) return -1; } else { char *nb; - nb = realloc( buf->buf_base, minsize ); + nb = LBER_REALLOC( buf->buf_base, minsize ); if (nb==NULL) return -1; buf->buf_base = nb; @@ -145,8 +163,8 @@ grow_buffer( Sockbuf_Buf * buf, long minsize ) } #ifdef USE_SASL -static long -sockbuf_sec_release( Sockbuf *sb, char *buf, long len ) +static ber_slen_t +sockbuf_sec_release( Sockbuf *sb, char *buf, ber_len_t len ) { /* when this is called: * sb->sb_sec_buf_in.buf_base points to a packet. @@ -161,6 +179,10 @@ sockbuf_sec_release( Sockbuf *sb, char *buf, long len ) char *end; long size; + assert( buf != NULL ); + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); + assert( sb->sb_sec ); assert( sb->sb_sec->sbs_release ); assert( sb->sb_sec_buf_in.sb_ptr >= sb->sb_sec_buf_in.sb_end ); @@ -204,7 +226,7 @@ sockbuf_sec_release( Sockbuf *sb, char *buf, long len ) ptr+=size; if (ptr+4<=end) - size = packet_length( ptr ); + size = packet_length( sb, ptr ); /* size is always at least 4, so the loop condition is always OK !!*/ assert( size>=4 ); @@ -237,6 +259,11 @@ sockbuf_sec_protect( Sockbuf *sb, char *buf, long len ) long blen; long total; + assert( buf != NULL ); + + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); + assert( sb->sb_sec_out.buf_end == 0 ); assert( sb->sb_sec_out.buf_ptr == 0 ); @@ -275,13 +302,19 @@ sockbuf_sec_protect( Sockbuf *sb, char *buf, long len ) } #endif -static long -sockbuf_copy_out( Sockbuf *sb, char **buf, long len ) +static ber_len_t +sockbuf_copy_out( Sockbuf *sb, char **buf, ber_len_t len ) { - long blen = (sb->sb_buf.buf_end - sb->sb_buf.buf_ptr ); + ber_len_t blen = (sb->sb_buf.buf_end - sb->sb_buf.buf_ptr ); + + assert( buf != NULL ); + + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); assert( status_is_ok(sb) ); + if (blen) { - long rlen = (blensb_buf.buf_base + sb->sb_buf.buf_ptr, rlen ); sb->sb_buf.buf_ptr+=rlen; *buf+=rlen; @@ -297,18 +330,52 @@ sockbuf_copy_out( Sockbuf *sb, char **buf, long len ) return len; } +Sockbuf *ber_sockbuf_alloc( void ) +{ + Sockbuf *sb; + + ber_int_options.lbo_valid = LBER_INITIALIZED; + + sb = LBER_CALLOC(1, sizeof(Sockbuf)); + + if( sb == NULL ) return NULL; + + ber_pvt_sb_init( sb ); + return sb; +} + +Sockbuf *ber_sockbuf_alloc_fd( ber_socket_t fd ) +{ + Sockbuf *sb = ber_sockbuf_alloc(); + + if( sb == NULL ) return NULL; + + ber_pvt_sb_set_desc( sb, fd ); + ber_pvt_sb_set_io( sb, &ber_pvt_sb_io_tcp, NULL ); + return sb; +} + +void ber_sockbuf_free( Sockbuf *sb ) +{ + assert(sb != NULL); + assert( SOCKBUF_VALID( sb ) ); + ber_pvt_sb_destroy( sb ); + LBER_FREE(sb); +} -long -lber_pvt_sb_read( Sockbuf *sb, void *buf_arg, long len ) +ber_slen_t +ber_pvt_sb_read( Sockbuf *sb, void *buf_arg, ber_len_t len ) { char *buf; - long ret; + ber_slen_t ret; + assert( buf_arg != NULL ); + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); assert( status_is_ok(sb) ); -#if 0 - /* breaks slapd :-) */ - assert( lber_pvt_sb_in_use( sb ) ); -#endif + + /* slapd might have problems with this */ + assert( ber_pvt_sb_in_use( sb ) ); #ifdef TEST_PARTIAL_READ if ((rand() & 3)==1) { /* 1 out of 4 */ @@ -316,7 +383,8 @@ lber_pvt_sb_read( Sockbuf *sb, void *buf_arg, long len ) return -1; } - len = (rand() % len)+1; + if( len > 0 ) + len = (rand() % len)+1; #endif buf = (char *) buf_arg; @@ -330,7 +398,7 @@ lber_pvt_sb_read( Sockbuf *sb, void *buf_arg, long len ) #ifdef USE_SASL if (sb->sb_sec) { - int max; + ber_slen_t max; assert( sb->sb_sec->sbs_release ); assert( sb->sb_sec_buf_in.buf_base ); if (sb->sb_read_ahead) { @@ -374,14 +442,14 @@ lber_pvt_sb_read( Sockbuf *sb, void *buf_arg, long len ) } /* calculate the packet length. */ sb->sb_sec_buf_in.buf_end = - packet_length(sb->sb_sec_buf_in.buf_base ); + packet_length(sb, sb->sb_sec_buf_in.buf_base ); if ((sb->sb_sec_buf_in.buf_end > sb->sb_sec_buf_in.buf_size) && (grow_buffer( &(sb->sb_sec_buf_in), sb->sb_sec_buf_in.buf_end)<0)) { /* buffer has to be to big. exit with error. */ ret = -1; goto do_return; } - if (sb->sb_sec_buf_in.buf_ptr >= sb_sec_buf_in.buf_end) { + if (sb->sb_sec_buf_in.buf_ptr >= sb->sb_sec_buf_in.buf_end) { /* finished packet. decode it. */ goto decode_packet; } @@ -407,9 +475,9 @@ decode_packet: } else { #endif if (sb->sb_read_ahead) { - long max; + ber_slen_t max; max = sb->sb_buf.buf_size - sb->sb_buf.buf_end; - if (max>len) { + if (max> (ber_slen_t) len) { for(;;) { ret = sockbuf_io_read( sb, sb->sb_buf.buf_base + @@ -461,6 +529,11 @@ do_return: long sockbuf_do_write( Sockbuf *sb ) { long to_go; + ber_slen_t ret; + + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); + to_go = sb->sb_sec_out.buf_end - sb->sb_sec_out.buf_ptr; assert( to_go > 0 ); /* there is something left of the last time... */ @@ -482,15 +555,19 @@ long sockbuf_do_write( Sockbuf *sb ) } #endif -long lber_pvt_sb_write( Sockbuf *sb, void *buf, long len_arg ) +ber_slen_t ber_pvt_sb_write( Sockbuf *sb, void *buf, ber_len_t len_arg ) { - long ret; - long len = len_arg; + ber_slen_t ret; + ber_len_t len = len_arg; + + assert( buf != NULL ); + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); assert( status_is_ok(sb) ); -#if 0 - /* unfortunately breaks slapd */ - assert( lber_pvt_sb_in_use( sb ) ); -#endif + + /* slapd might have problems with this */ + assert( ber_pvt_sb_in_use( sb ) ); + #ifdef TEST_PARTIAL_WRITE if ((rand() & 3)==1) { /* 1 out of 4 */ errno = EWOULDBLOCK; @@ -540,31 +617,55 @@ long lber_pvt_sb_write( Sockbuf *sb, void *buf, long len_arg ) return ret; } -int lber_pvt_sb_close( Sockbuf *sb ) +int ber_pvt_sb_close( Sockbuf *sb ) { int ret; + + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); assert( sb->sb_io ); assert( sb->sb_io->sbi_close ); assert( status_is_ok(sb) ); - assert( lber_pvt_sb_in_use( sb ) ); + assert( ber_pvt_sb_in_use( sb ) ); ret = sb->sb_io->sbi_close( sb ); - lber_pvt_sb_set_desc( sb, -1 ); + ber_pvt_sb_set_desc( sb, -1 ); return ret; } -int lber_pvt_sb_set_readahead( Sockbuf *sb, int rh ) +int ber_pvt_sb_set_readahead( Sockbuf *sb, int rh ) { + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); assert( status_is_ok(sb) ); sb->sb_read_ahead = (rh!=0); return 0; } +int ber_pvt_socket_set_nonblock( ber_socket_t sd, int nb ) +{ +#if HAVE_FCNTL + int flags = fcntl(ber_pvt_sb_get_desc(sb), F_GETFL); + if( nb ) { + flags |= O_NONBLOCK; + } else { + flags &= ~O_NONBLOCK; + } + return fcntl( ber_pvt_sb_get_desc(sb), F_SETFL, flags ); + +#elif defined( FIONBIO ) + ioctl_t status = nb ? 1 : 0; + return ioctl( sd, FIONBIO, &status ); +#endif +} + #define USE_NONBLOCK #ifdef USE_NONBLOCK -int lber_pvt_sb_set_nonblock( Sockbuf *sb, int nb ) +int ber_pvt_sb_set_nonblock( Sockbuf *sb, int nb ) { + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); assert( status_is_ok(sb) ); if (nb) { sb->sb_non_block = 1; @@ -577,16 +678,11 @@ int lber_pvt_sb_set_nonblock( Sockbuf *sb, int nb ) sb->sb_read_ahead = 0; #endif } -#ifdef FIONBIO - if (lber_pvt_sb_in_use(sb)) { - /* WINSOCK requires the status to be a long */ - ioctl_t status = (nb!=0); - if (ioctl( lber_pvt_sb_get_desc(sb), FIONBIO, &status ) == -1 ) { - return -1; - } - } -#endif /* FIONBIO */ - return 0; + if (ber_pvt_sb_in_use(sb)) { + return ber_pvt_socket_set_nonblock( + ber_pvt_sb_get_desc(sb), nb ); + } + return 0; } #endif @@ -601,15 +697,21 @@ int lber_pvt_sb_set_nonblock( Sockbuf *sb, int nb ) static int sockbuf_buf_destroy( Sockbuf_Buf *buf ) { + assert( buf != NULL); + if (buf->buf_base) - free( buf->buf_base ); + LBER_FREE( buf->buf_base ); sockbuf_buf_init( buf ); return 0; } -int lber_pvt_sb_init( Sockbuf *sb ) +int ber_pvt_sb_init( Sockbuf *sb ) { - sb->sb_item_type=LBER_ITEM_SOCKBUF; + assert( sb != NULL); + + ber_int_options.lbo_valid = LBER_INITIALIZED; + + sb->sb_valid=LBER_VALID_SOCKBUF; sb->sb_options = 0; sb->sb_debug = 0; sb->sb_trans_ready = 0; @@ -617,11 +719,13 @@ int lber_pvt_sb_init( Sockbuf *sb ) #ifdef USE_SASL sb->sb_sec_ready = 0; #endif - sb->sb_read_ahead = 0; + sb->sb_read_ahead = 1; /* test */ sb->sb_non_block = 0; + sb->sb_trans_needs_read = 0; + sb->sb_trans_needs_write = 0; sb->sb_fd = -1; sb->sb_iodata = NULL; - sb->sb_io = &lber_pvt_sb_IO_None; + sb->sb_io = &sb_IO_None; sb->sb_sd = -1; #ifdef DEADWOOD sb->sb_max_incoming = 0; @@ -633,26 +737,32 @@ int lber_pvt_sb_init( Sockbuf *sb ) sb->sb_sdata = NULL; sb->sb_sec = NULL; sb->sb_sec_prev_len = 0; -#endif +#endif + + assert( SOCKBUF_VALID( sb ) ); return 0; } -int lber_pvt_sb_destroy( Sockbuf *sb ) +int ber_pvt_sb_destroy( Sockbuf *sb ) { + assert( sb != NULL); + assert( SOCKBUF_VALID(sb) ); #ifdef USE_SASL - lber_pvt_sb_clear_sec(sb); + ber_pvt_sb_clear_sec(sb); sockbuf_buf_destroy( &(sb->sb_sec_buf_in) ); sockbuf_buf_destroy( &(sb->sb_sec_buf_out) ); #endif - lber_pvt_sb_clear_io(sb); + ber_pvt_sb_clear_io(sb); sockbuf_buf_destroy( &(sb->sb_buf) ); - return lber_pvt_sb_init( sb ); + return ber_pvt_sb_init( sb ); } #ifdef USE_SASL -int lber_pvt_sb_set_sec( Sockbuf *sb, Sockbuf_Sec * sec, void *arg ) +int ber_pvt_sb_set_sec( Sockbuf *sb, Sockbuf_Sec * sec, void *arg ) { int len; + assert( sb != NULL); + assert( SOCKBUF_VALID( *sb ) ); if ((sb->sb_sec) || (sec==NULL)) return -1; @@ -671,15 +781,18 @@ int lber_pvt_sb_set_sec( Sockbuf *sb, Sockbuf_Sec * sec, void *arg ) memcpy( sb->sb_sec_buf_in.buf_base, sb->sb_buf.buf_base + sb->sb_buf.buf_ptr, len ); sb->sb_sec_buf_in.buf_ptr = len; - sb->sb_sec_buf_in.buf_end = (len>4) ? packet_length( sb->sb_sec_buf_in ) : 0; + sb->sb_sec_buf_in.buf_end = (len>4) ? packet_length( sb, sb->sb_sec_buf_in ) : 0; sb->sb_buf.buf_ptr = sb->sb_buf.buf_end = 0; } - update_status(); + update_status( sb ); return 0; } -int lber_pvt_sb_clear_sec( Sockbuf *sb ) +int ber_pvt_sb_clear_sec( Sockbuf *sb ) { + assert( sb != NULL); + assert( SOCKBUF_VALID( sb ) ); + if (sb->sb_buf.buf_ptr!=0) return -1; if (sb->sb_sec==NULL) @@ -707,9 +820,11 @@ int lber_pvt_sb_clear_sec( Sockbuf *sb ) } #endif -int lber_pvt_sb_set_io( Sockbuf *sb, Sockbuf_IO *trans, void *arg ) +int ber_pvt_sb_set_io( Sockbuf *sb, Sockbuf_IO *trans, void *arg ) { - assert( sb->sb_io == &lber_pvt_sb_IO_None ); + assert( sb != NULL); + assert( SOCKBUF_VALID( sb ) ); + assert( sb->sb_io == &sb_IO_None ); if (trans==NULL) return -1; @@ -722,18 +837,23 @@ int lber_pvt_sb_set_io( Sockbuf *sb, Sockbuf_IO *trans, void *arg ) return 0; } -int lber_pvt_sb_clear_io( Sockbuf *sb ) +int ber_pvt_sb_clear_io( Sockbuf *sb ) { - if (sb->sb_io==&lber_pvt_sb_IO_None) + assert( sb != NULL); + assert( SOCKBUF_VALID( sb ) ); + + if (sb->sb_io==&sb_IO_None) return -1; if ((sb->sb_io->sbi_remove) && (sb->sb_io->sbi_remove( sb )<0)) return -1; - sb->sb_io = &lber_pvt_sb_IO_None; + sb->sb_io = &sb_IO_None; sb->sb_trans_ready = 0; - + sb->sb_trans_needs_read = 0; + sb->sb_trans_needs_write = 0; + return 0; } @@ -741,17 +861,21 @@ int lber_pvt_sb_clear_io( Sockbuf *sb ) * Support for TCP */ -static long -stream_read( Sockbuf *sb, void *buf, long len ) +static ber_slen_t +stream_read( Sockbuf *sb, void *buf, ber_len_t len ) { + assert( sb != NULL); + assert( SOCKBUF_VALID( sb ) ); + #if defined(MACOS) /* * MacTCP/OpenTransport */ - return tcpread( lber_pvt_sb_get_desc(sb), 0, (unsigned char *)buf, + return tcpread( ber_pvt_sb_get_desc(sb), 0, (unsigned char *)buf, len, NULL ); -#elif (defined(DOS) && (defined(PCNFS) || defined( WINSOCK))) \ - || defined( _WIN32) || defined ( __BEOS__ ) + +#elif defined( HAVE_PCNFS ) || \ + defined( HAVE_WINSOCK ) || defined ( __BEOS__ ) /* * PCNFS (under DOS) */ @@ -761,30 +885,50 @@ stream_read( Sockbuf *sb, void *buf, long len ) /* * 32-bit Windows Socket API (under Windows NT or Windows 95) */ - return recv( lber_pvt_sb_get_desc(sb), buf, len, 0 ); -#elif (defined(DOS) && defined( NCSA )) + { + int rc; + rc = recv( ber_pvt_sb_get_desc(sb), buf, len, 0 ); + +#ifdef HAVE_WINSOCK + if ( rc < 0 ) + { + int err; + + err = WSAGetLastError(); + errno = err; + } +#endif + + return rc; + } +#elif defined( HAVE_NCSA ) /* * NCSA Telnet TCP/IP stack (under DOS) */ - return nread( lber_pvt_sb_get_desc(sb), buf, len ); + return nread( ber_pvt_sb_get_desc(sb), buf, len ); + #else - return read( lber_pvt_sb_get_desc(sb), buf, len ); + return read( ber_pvt_sb_get_desc(sb), buf, len ); #endif } -static long -stream_write( Sockbuf *sb, void *buf, long len ) +static ber_slen_t +stream_write( Sockbuf *sb, void *buf, ber_len_t len ) { + assert( sb != NULL); + assert( SOCKBUF_VALID( sb ) ); + #if defined(MACOS) /* * MacTCP/OpenTransport */ #define MAX_WRITE 65535 - return tcpwrite( lber_pvt_sb_get_desc(sb), + return tcpwrite( ber_pvt_sb_get_desc(sb), (unsigned char *)(buf), (lensb_iodata = malloc( sizeof( struct dgram_data ) ); + assert( sb != NULL); + assert( SOCKBUF_VALID( sb ) ); + + sb->sb_iodata = LBER_MALLOC( sizeof( struct dgram_data ) ); if (sb->sb_iodata==NULL) return -1; sb->sb_read_ahead = 1; /* important since udp is packet based. */ @@ -848,33 +1012,36 @@ dgram_setup( Sockbuf *sb, void *arg ) static int dgram_release( Sockbuf *sb ) { - free( sb->sb_iodata ); + assert( sb != NULL); + assert( SOCKBUF_VALID( sb ) ); + + LBER_FREE( sb->sb_iodata ); return 0; } -static long -dgram_read( Sockbuf *sb, void *buf, long len ) +static ber_slen_t +dgram_read( Sockbuf *sb, void *buf, ber_len_t len ) { #ifdef LDAP_CONNECTIONLESS - long rc; - int addrlen; + ber_slen_t rc; + socklen_t addrlen; struct dgram_data *dd; + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); + assert( buf != NULL ); + dd = (struct dgram_data *)(sb->sb_iodata); -# if !defined( MACOS) && !defined(DOS) && !defined( _WIN32) addrlen = sizeof( struct sockaddr ); - rc=recvfrom( lber_pvt_sb_get_desc(sb), buf, len, 0, &(dd->src), &addrlen ); -# else - UDP not supported -# endif + rc=recvfrom( ber_pvt_sb_get_desc(sb), buf, len, 0, &(dd->src), &addrlen ); if ( sb->sb_debug ) { - lber_log_printf( LDAP_DEBUG_ANY, sb->sb_debug, - "dgram_read udp_read %d bytes\n", - rc ); + ber_log_printf( LDAP_DEBUG_ANY, sb->sb_debug, + "dgram_read udp_read %ld bytes\n", + (long) rc ); if ( rc > 0 ) - lber_log_bprint( LDAP_DEBUG_PACKETS, sb->sb_debug, + ber_log_bprint( LDAP_DEBUG_PACKETS, sb->sb_debug, buf, rc ); } return rc; @@ -883,22 +1050,23 @@ dgram_read( Sockbuf *sb, void *buf, long len ) # endif /* LDAP_CONNECTIONLESS */ } -static long -dgram_write( Sockbuf *sb, void *buf, long len ) +static ber_slen_t +dgram_write( Sockbuf *sb, void *buf, ber_len_t len ) { #ifdef LDAP_CONNECTIONLESS - int rc; + ber_slen_t rc; struct dgram_data *dd; + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); + assert( buf != NULL ); + dd = (struct dgram_data *)(sb->sb_iodata); -# if !defined( MACOS) && !defined(DOS) && !defined( _WIN32) - rc=sendto( lber_pvt_sb_get_desc(sb), buf, len, 0, &(dd->dst), + rc=sendto( ber_pvt_sb_get_desc(sb), buf, len, 0, &(dd->dst), sizeof( struct sockaddr ) ); -# else - UDP not supported -# endif - if ( rc <= 0 ) + + if ( rc <= 0 ) return( -1 ); /* fake error if write was not atomic */ @@ -917,11 +1085,14 @@ dgram_write( Sockbuf *sb, void *buf, long len ) static int dgram_close( Sockbuf *sb ) { - tcp_close( lber_pvt_sb_get_desc(sb) ); + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); + + tcp_close( ber_pvt_sb_get_desc(sb) ); return 0; } -Sockbuf_IO lber_pvt_sb_io_udp= +Sockbuf_IO ber_pvt_sb_io_udp= { dgram_setup, /* sbi_setup */ dgram_release, /* sbi_release */ @@ -930,19 +1101,24 @@ Sockbuf_IO lber_pvt_sb_io_udp= dgram_close, /* sbi_close */ }; -int lber_pvt_sb_udp_set_dst(Sockbuf *sb, void *addr ) +int ber_pvt_sb_udp_set_dst(Sockbuf *sb, void *addr ) { struct dgram_data *dd; - assert( sb->sb_io == &lber_pvt_sb_io_udp ); + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); + assert( sb->sb_io == &ber_pvt_sb_io_udp ); dd = (struct dgram_data *) (sb->sb_iodata); memcpy( &(dd->dst), addr, sizeof( struct sockaddr ) ); return 0; } -void *lber_pvt_sb_udp_get_src( Sockbuf *sb ) +void *ber_pvt_sb_udp_get_src( Sockbuf *sb ) { struct dgram_data *dd; - assert( sb->sb_io == &lber_pvt_sb_io_udp ); + + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); + assert( sb->sb_io == &ber_pvt_sb_io_udp ); dd = (struct dgram_data *) (sb->sb_iodata); return &(dd->src); } @@ -955,19 +1131,25 @@ void *lber_pvt_sb_udp_get_src( Sockbuf *sb ) * break the servers. */ -static long -have_no_read( Sockbuf *sb, void *buf, long len ) +static ber_slen_t +have_no_read( Sockbuf *sb, void *buf, ber_len_t len ) { - lber_log_printf( LDAP_DEBUG_ANY, lber_int_debug, + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); + + ber_log_printf( LDAP_DEBUG_ANY, ber_int_debug, "warning: reading from uninitialized sockbuf\n"); errno = EBADF; return -1; } -static long -have_no_write( Sockbuf *sb, void *buf, long len ) +static ber_slen_t +have_no_write( Sockbuf *sb, void *buf, ber_len_t len ) { - lber_log_printf( LDAP_DEBUG_ANY, lber_int_debug, + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); + + ber_log_printf( LDAP_DEBUG_ANY, ber_int_debug, "warning: writing to uninitialized sockbuf\n"); errno = EBADF; return -1; @@ -976,6 +1158,9 @@ have_no_write( Sockbuf *sb, void *buf, long len ) static int have_no_close( Sockbuf *sb ) { + assert( sb != NULL ); + assert( SOCKBUF_VALID( sb ) ); + assert( 0 ); return -1; }