From 26ee5f5668ab205c940feaed71f1ba159a3b85b0 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: svn://svn.code.sf.net/p/nuttx/code/trunk@5091 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/lib/misc/lib_sendfile.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'nuttx') diff --git a/nuttx/lib/misc/lib_sendfile.c b/nuttx/lib/misc/lib_sendfile.c index 7d7a781f5..b7959482e 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