about summary refs log tree commit diff
path: root/sysdeps/posix/pwritev.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2009-04-23 22:52:24 +0000
committerUlrich Drepper <drepper@redhat.com>2009-04-23 22:52:24 +0000
commit7f8a28efb5c9bf19d3a31a7f356cc171f333ceef (patch)
tree03175c4a76429b3f571b81770394ae731732711e /sysdeps/posix/pwritev.c
parentc7e74e5968929264fca40424f979653115643f5d (diff)
downloadglibc-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.c34
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