diff options
author | Ulrich Drepper <drepper@redhat.com> | 2009-04-23 22:52:24 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-04-23 22:52:24 +0000 |
commit | 7f8a28efb5c9bf19d3a31a7f356cc171f333ceef (patch) | |
tree | 03175c4a76429b3f571b81770394ae731732711e /sysdeps/posix/pwritev.c | |
parent | c7e74e5968929264fca40424f979653115643f5d (diff) | |
download | glibc-7f8a28efb5c9bf19d3a31a7f356cc171f333ceef.tar.gz glibc-7f8a28efb5c9bf19d3a31a7f356cc171f333ceef.tar.xz glibc-7f8a28efb5c9bf19d3a31a7f356cc171f333ceef.zip |
* sysdeps/unix/sysv/linux/preadv.c: The kernel API changed. Adjust.
* sysdeps/unix/sysv/linux/pwritev.c: Likewise. 2009-04-23 Jakub Jelinek <jakub@redhat.com> * sysdeps/posix/pwritev.c (PWRITEV): Fix up comment. Copy data from vector to temporary buffer and call PWRITEV after it instead of vice versa. * sysdeps/posix/preadv.c: Fix up comment. * misc/preadv.c: Likewise. * misc/preadv64.c: Likewise. * misc/pwritev.c: Likewise. * misc/pwritev64.c: Likewise. * misc/sys/uio.h (preadv, pwritev, preadv64, pwritev64): Likewise. 2009-04-23 Ulrich Drepper <drepper@redhat.com>
Diffstat (limited to 'sysdeps/posix/pwritev.c')
-rw-r--r-- | sysdeps/posix/pwritev.c | 34 |
1 files changed, 11 insertions, 23 deletions
diff --git a/sysdeps/posix/pwritev.c b/sysdeps/posix/pwritev.c index 0b6627dc9d..f2f0574aac 100644 --- a/sysdeps/posix/pwritev.c +++ b/sysdeps/posix/pwritev.c @@ -44,12 +44,12 @@ ifree (char **ptrp) } -/* Read data from file descriptor FD at the given position OFFSET - without change the file pointer, and put the result in the buffers - described by VECTOR, which is a vector of COUNT 'struct iovec's. - The buffers are filled in the order specified. Operates just like - 'read' (see <unistd.h>) except that data are put in VECTOR instead - of a contiguous buffer. */ +/* Write data pointed by the buffers described by IOVEC, which is a + vector of COUNT 'struct iovec's, to file descriptor FD at the given + position OFFSET without change the file pointer. The data is + written in the order specified. Operates just like 'write' (see + <unistd.h>) except that the data are taken from IOVEC instead of a + contiguous buffer. */ ssize_t PWRITEV (int fd, const struct iovec *vector, int count, OFF_T offset) { @@ -81,26 +81,14 @@ PWRITEV (int fd, const struct iovec *vector, int count, OFF_T offset) return -1; } - /* Read the data. */ - ssize_t bytes_read = PWRITE (fd, buffer, bytes, offset); - if (bytes_read <= 0) - return -1; - /* Copy the data from BUFFER into the memory specified by VECTOR. */ - bytes = bytes_read; + char *ptr = buffer; for (int i = 0; i < count; ++i) - { - size_t copy = MIN (vector[i].iov_len, bytes); - - (void) memcpy ((void *) vector[i].iov_base, (void *) buffer, copy); - - buffer += copy; - bytes -= copy; - if (bytes == 0) - break; - } + ptr = __mempcpy ((void *) ptr, (void *) vector[i].iov_base, + vector[i].iov_len); - return bytes_read; + /* Write the data. */ + return PWRITE (fd, buffer, bytes, offset); } #if __WORDSIZE == 64 && defined pwritev64 # undef pwritev64 |