summaryrefslogtreecommitdiffstats
path: root/cpukit/libcsupport/src/readv.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-12-16 13:44:13 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-12-20 10:31:53 +0100
commit2f68778f08471fb7f13a8634ebb48c6db13c0f69 (patch)
treeeae0deea88cc0d81052f8497a668dfaeecd6de40 /cpukit/libcsupport/src/readv.c
parentlibcsupport: Add and use rtems_libio_iovec_eval() (diff)
downloadrtems-2f68778f08471fb7f13a8634ebb48c6db13c0f69.tar.bz2
Filesystem: Add readv/writev handlers
The readv() and writev() support was implemented in terms of multiple calls to the read and write handlers. This imposes a problem on device files which use an IO vector as single request entity. For example a low-level network device (e.g. BPF(4)) may use an IO vector to create one frame from multiple protocol layers each with its own IO vector entry.
Diffstat (limited to 'cpukit/libcsupport/src/readv.c')
-rw-r--r--cpukit/libcsupport/src/readv.c21
1 files changed, 1 insertions, 20 deletions
diff --git a/cpukit/libcsupport/src/readv.c b/cpukit/libcsupport/src/readv.c
index e47f22850a..6a4e0579f3 100644
--- a/cpukit/libcsupport/src/readv.c
+++ b/cpukit/libcsupport/src/readv.c
@@ -36,31 +36,12 @@ ssize_t readv(
)
{
ssize_t total;
- int v;
rtems_libio_t *iop;
total = rtems_libio_iovec_eval( fd, iov, iovcnt, LIBIO_FLAGS_READ, &iop );
if ( total > 0 ) {
- /*
- * Now process the readv().
- */
- total = 0;
- for ( v = 0 ; v < iovcnt ; v++ ) {
- ssize_t bytes = ( *iop->pathinfo.handlers->read_h )(
- iop,
- iov[ v ].iov_base,
- iov[ v ].iov_len
- );
-
- if ( bytes < 0 )
- return -1;
-
- total += bytes;
-
- if ( bytes != iov[ v ].iov_len )
- break;
- }
+ total = ( *iop->pathinfo.handlers->readv_h )( iop, iov, iovcnt, total );
}
return total;