From b6a4530234e5e1c4ec2bac427afa986eb14f2329 Mon Sep 17 00:00:00 2001 From: patacongo Date: Wed, 5 Sep 2012 01:59:54 +0000 Subject: Oops.. sendfile() was not keeping track of the number bytes transferred or handling partial writes correctly. git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@5091 7fd9a85b-ad96-42d3-883c-3090e2eb8679 --- nuttx/lib/misc/lib_sendfile.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/nuttx/lib/misc/lib_sendfile.c b/nuttx/lib/misc/lib_sendfile.c index 7d7a781f58..b7959482e3 100644 --- a/nuttx/lib/misc/lib_sendfile.c +++ b/nuttx/lib/misc/lib_sendfile.c @@ -114,6 +114,7 @@ ssize_t sendfile(int outfd, int infd, off_t *offset, size_t count) { FAR uint8_t *iobuffer; + FAR uint8_t *wrbuffer; off_t startpos = 0; ssize_t nbytesread; ssize_t nbyteswritten; @@ -205,18 +206,31 @@ ssize_t sendfile(int outfd, int infd, off_t *offset, size_t count) * conclusion. */ + wrbuffer = iobuffer; do { - nbyteswritten = write(outfd, iobuffer, nbytesread); + nbyteswritten = write(outfd, wrbuffer, nbytesread); - /* Check for a complete (or parial write) */ + /* Check for a complete (or parial write). write() should not + * return zero. + */ if (nbyteswritten >= 0) { - nbytesread -= nbyteswritten; + /* Advance the buffer pointer and decrement the number of bytes + * remaining in the iobuffer. Typically, nbytesread will now + * be zero. + */ + + wrbuffer += nbyteswritten; + nbytesread -= nbyteswritten; + + /* Increment the total number of bytes successfully transferred. */ + + ntransferred += nbyteswritten; } - /* Otherwise an error occurred (write should not return zero) */ + /* Otherwise an error occurred */ else { -- cgit v1.2.3