X-Git-Url: http://dolda2000.com/gitweb/?p=ashd.git;a=blobdiff_plain;f=lib%2Fbufio.c;h=c08e9dd9a96f18ec2c1c974ec37697f597580e75;hp=83963b30df0c465a8335370dad36202edfd1e51e;hb=99a520b62935330a92ca30534b899423c0a28240;hpb=029ce99be56734bb1a381766e7b5b7a1c40e9ecc diff --git a/lib/bufio.c b/lib/bufio.c index 83963b3..c08e9dd 100644 --- a/lib/bufio.c +++ b/lib/bufio.c @@ -259,14 +259,22 @@ ssize_t biowritesome(struct bufio *bio, const void *data, size_t len) if(bio->wh == bio->wbuf.d) bio->wh = bio->wbuf.d = 0; if(bio->wbuf.d == bio->wbuf.s) { - if(bio->wh > 0) + if(bio->wh > 0) { memmove(bio->wbuf.b, bio->wbuf.b + bio->wh, bio->wbuf.d -= bio->wh); + bio->wh = 0; + } } ret = min(len, bio->wbuf.s - bio->wbuf.d); memcpy(bio->wbuf.b + bio->wbuf.d, data, ret); bio->wbuf.d += ret; - if((bioflushsome(bio) < 0) && (ret == 0)) - return(-1); + if(bioflushsome(bio) < 0) { + if(ret == 0) + return(-1); + if(ret < bio->wbuf.d - bio->wh) { /* Should never be false */ + bio->wbuf.d -= ret; + return(-1); + } + } return(ret); } @@ -301,3 +309,21 @@ ssize_t biocopysome(struct bufio *dst, struct bufio *src) src->rh += ret; return(ret); } + +ssize_t biocopybuf(struct bufio *dst, struct bufio *src) +{ + ssize_t ret; + + sizebuf(dst->wbuf, dst->bufhint); + if(dst->wbuf.d == dst->wbuf.s) { + if(dst->wh > 0) { + memmove(dst->wbuf.b, dst->wbuf.b + dst->wh, dst->wbuf.d -= dst->wh); + dst->wh = 0; + } + } + ret = min(src->rbuf.d - src->rh, dst->wbuf.s - dst->wbuf.d); + memcpy(dst->wbuf.b + dst->wbuf.d, src->rbuf.b + src->rh, ret); + src->rh += ret; + dst->wbuf.d += ret; + return(ret); +}