ber_slen_t
ber_pvt_sb_do_write( Sockbuf_IO_Desc *sbiod, Sockbuf_Buf *buf_out )
{
- ber_len_t to_go, done = 0;
+ ber_len_t to_go;
ber_slen_t ret;
assert( sbiod != NULL );
for(;;) {
ret = LBER_SBIOD_WRITE_NEXT( sbiod, buf_out->buf_base +
buf_out->buf_ptr, to_go );
- if ( ret < 0 ) {
- if (errno==EAGAIN
#ifdef EINTR
- || errno==EINTR
+ if ((ret<0) && (errno==EINTR)) continue;
#endif
- ) continue;
-
- return ret;
- }
+ break;
+ }
- if ( ret == 0 ) return ret;
+ if ( ret <= 0 ) return ret;
- buf_out->buf_ptr += ret;
- done += ret;
+ buf_out->buf_ptr += ret;
+ if (buf_out->buf_ptr == buf_out->buf_end) {
+ buf_out->buf_end = buf_out->buf_ptr = 0;
+ }
- if (buf_out->buf_ptr == buf_out->buf_end) {
- buf_out->buf_end = buf_out->buf_ptr = 0;
- ret = done;
- break;
- } else if (buf_out->buf_ptr > buf_out->buf_end) {
- /* impossible */
- return -1;
- } else {
- to_go -= ret;
- }
+ if ( (ber_len_t)ret < to_go ) {
+ /* not enough data, so pretend no data was sent. */
+ return -1;
}
+
return ret;
}