X-Git-Url: http://dolda2000.com/gitweb/?p=ashd.git;a=blobdiff_plain;f=lib%2Futils.c;h=ad28086eaf41b1c2dfb379714479192dbe9354e9;hp=e2c85a93d2470bb4965b0c14a07d9c6b39cf1378;hb=c3424008c9b9b1ee9ffff7ca4e92812b9021ad93;hpb=c7f4f7500d96a0ce71bfe9dd0e5b3c939a9a3298 diff --git a/lib/utils.c b/lib/utils.c index e2c85a9..ad28086 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -495,8 +495,22 @@ static ssize_t wrapread(void *pdata, char *buf, size_t len) static ssize_t wrapwrite(void *pdata, const char *buf, size_t len) { struct stdif *nf = pdata; + size_t off; + ssize_t ret; - return(nf->write(nf->pdata, buf, len)); + /* + * XXX? In seeming violation of its own manual, glibc requires the + * cookie-write function to complete writing the entire buffer, + * rather than working like write(2). + */ + off = 0; + while(off < len) { + ret = nf->write(nf->pdata, buf + off, len - off); + if(ret < 0) + return(off); + off += ret; + } + return(off); } static int wrapseek(void *pdata, off_t *pos, int whence)