@ -1,4 +1,4 @@
/* $OpenBSD: buffer.c,v 1.11 2009/07/23 18:58:42 eric Exp $ */
/* $OpenBSD: buffer.c,v 1.12 2009/09/15 10:54:59 jacekm Exp $ */
/*
/*
* Copyright ( c ) 2003 , 2004 Henning Brauer < henning @ openbsd . org >
* Copyright ( c ) 2003 , 2004 Henning Brauer < henning @ openbsd . org >
@ -144,7 +144,7 @@ int
buf_write ( struct msgbuf * msgbuf )
buf_write ( struct msgbuf * msgbuf )
{
{
struct iovec iov [ IOV_MAX ] ;
struct iovec iov [ IOV_MAX ] ;
struct buf * buf , * next ;
struct buf * buf ;
unsigned int i = 0 ;
unsigned int i = 0 ;
ssize_t n ;
ssize_t n ;
@ -170,17 +170,7 @@ buf_write(struct msgbuf *msgbuf)
return ( - 2 ) ;
return ( - 2 ) ;
}
}
for ( buf = TAILQ_FIRST ( & msgbuf - > bufs ) ; buf ! = NULL & & n > 0 ;
buf = next ) {
next = TAILQ_NEXT ( buf , entry ) ;
if ( buf - > rpos + n > = buf - > wpos ) {
n - = buf - > wpos - buf - > rpos ;
buf_dequeue ( msgbuf , buf ) ;
} else {
buf - > rpos + = n ;
n = 0 ;
}
}
msgbuf_drain ( msgbuf , n ) ;
return ( 0 ) ;
return ( 0 ) ;
}
}
@ -200,6 +190,24 @@ msgbuf_init(struct msgbuf *msgbuf)
TAILQ_INIT ( & msgbuf - > bufs ) ;
TAILQ_INIT ( & msgbuf - > bufs ) ;
}
}
void
msgbuf_drain ( struct msgbuf * msgbuf , size_t n )
{
struct buf * buf , * next ;
for ( buf = TAILQ_FIRST ( & msgbuf - > bufs ) ; buf ! = NULL & & n > 0 ;
buf = next ) {
next = TAILQ_NEXT ( buf , entry ) ;
if ( buf - > rpos + n > = buf - > wpos ) {
n - = buf - > wpos - buf - > rpos ;
buf_dequeue ( msgbuf , buf ) ;
} else {
buf - > rpos + = n ;
n = 0 ;
}
}
}
void
void
msgbuf_clear ( struct msgbuf * msgbuf )
msgbuf_clear ( struct msgbuf * msgbuf )
{
{
@ -213,7 +221,7 @@ int
msgbuf_write ( struct msgbuf * msgbuf )
msgbuf_write ( struct msgbuf * msgbuf )
{
{
struct iovec iov [ IOV_MAX ] ;
struct iovec iov [ IOV_MAX ] ;
struct buf * buf , * next ;
struct buf * buf ;
unsigned int i = 0 ;
unsigned int i = 0 ;
ssize_t n ;
ssize_t n ;
struct msghdr msg ;
struct msghdr msg ;
@ -270,17 +278,7 @@ msgbuf_write(struct msgbuf *msgbuf)
buf - > fd = - 1 ;
buf - > fd = - 1 ;
}
}
for ( buf = TAILQ_FIRST ( & msgbuf - > bufs ) ; buf ! = NULL & & n > 0 ;
buf = next ) {
next = TAILQ_NEXT ( buf , entry ) ;
if ( buf - > rpos + n > = buf - > wpos ) {
n - = buf - > wpos - buf - > rpos ;
buf_dequeue ( msgbuf , buf ) ;
} else {
buf - > rpos + = n ;
n = 0 ;
}
}
msgbuf_drain ( msgbuf , n ) ;
return ( 0 ) ;
return ( 0 ) ;
}
}