diff options
author | patacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679> | 2012-09-05 01:59:54 +0000 |
---|---|---|
committer | patacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679> | 2012-09-05 01:59:54 +0000 |
commit | bdd2c5b28836a80e3a79be23bfe45fd159203d8a (patch) | |
tree | ed9a1833777f8d26e866a9eedb2368ef84ad7b19 /nuttx/lib | |
parent | fb06dd2182b71b763f349d98e7deab415db333c0 (diff) | |
download | px4-firmware-bdd2c5b28836a80e3a79be23bfe45fd159203d8a.tar.gz px4-firmware-bdd2c5b28836a80e3a79be23bfe45fd159203d8a.tar.bz2 px4-firmware-bdd2c5b28836a80e3a79be23bfe45fd159203d8a.zip |
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
Diffstat (limited to 'nuttx/lib')
-rw-r--r-- | nuttx/lib/misc/lib_sendfile.c | 22 |
1 files changed, 18 insertions, 4 deletions
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 { |