* sysdeps/unix/sysv/linux/preadv.c: The kernel API changed. Adjust.
authorUlrich Drepper <drepper@redhat.com>
Thu, 23 Apr 2009 22:52:24 +0000 (22:52 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 23 Apr 2009 22:52:24 +0000 (22:52 +0000)
* 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>

ChangeLog
gshadow/sgetsgent_r.c
misc/preadv.c
misc/preadv64.c
misc/pwritev.c
misc/pwritev64.c
misc/sys/uio.h
sysdeps/posix/preadv.c
sysdeps/posix/pwritev.c
sysdeps/unix/sysv/linux/preadv.c
sysdeps/unix/sysv/linux/pwritev.c

index f510a30..c3c4804 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,22 @@
 2009-04-23  Ulrich Drepper  <drepper@redhat.com>
 
+       * 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>
+
        * shadow/sgetspent_r.c (__sgetspent_r): Recognize too small buffers.
 
        * shadow/Makefile (tests): Add tst-shadow.
index 72c51fe..2292719 100644 (file)
@@ -58,7 +58,12 @@ __sgetsgent_r (const char *string, struct sgrp *resbuf, char *buffer,
 {
   char *sp;
   if (string < buffer || string >= buffer + buflen)
-    sp = strncpy (buffer, string, buflen);
+    {
+      buffer[buflen - 1] = '\0';
+      sp = strncpy (buffer, string, buflen);
+      if (buffer[buflen - 1] != '\0')
+       return ERANGE;
+    }
   else
     sp = (char *) string;
 
index 3e2cc68..facd8ca 100644 (file)
@@ -24,7 +24,7 @@
    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
+   'pread' (see <unistd.h>) except that data are put in VECTOR instead
    of a contiguous buffer.  */
 ssize_t
 preadv (fd, vector, count, offset)
index ea675bb..4b4e571 100644 (file)
@@ -24,7 +24,7 @@
    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
+   'pread' (see <unistd.h>) except that data are put in VECTOR instead
    of a contiguous buffer.  */
 ssize_t
 preadv64 (fd, vector, count, offset)
index d45ed23..2ee4770 100644 (file)
@@ -23,7 +23,7 @@
 /* Write data pointed by the buffers described by VECTOR, 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
+   written in the order specified.  Operates just like 'pwrite' (see
    <unistd.h>) except that the data are taken from VECTOR instead of a
    contiguous buffer.  */
 ssize_t
index fe95857..6cff749 100644 (file)
@@ -23,7 +23,7 @@
 /* Write data pointed by the buffers described by VECTOR, 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
+   written in the order specified.  Operates just like 'pwrite' (see
    <unistd.h>) except that the data are taken from VECTOR instead of a
    contiguous buffer.  */
 ssize_t
index a3c7829..05d956b 100644 (file)
@@ -58,7 +58,7 @@ extern ssize_t writev (int __fd, __const struct iovec *__iovec, int __count)
    without change the file pointer, and put the result in the buffers
    described by IOVEC, 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 IOVEC instead
+   'pread' (see <unistd.h>) except that data are put in IOVEC instead
    of a contiguous buffer.
 
    This function is a cancellation point and therefore not marked with
@@ -69,7 +69,7 @@ extern ssize_t preadv (int __fd, __const struct iovec *__iovec, int __count,
 /* 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
+   written in the order specified.  Operates just like 'pwrite' (see
    <unistd.h>) except that the data are taken from IOVEC instead of a
    contiguous buffer.
 
@@ -96,7 +96,7 @@ extern ssize_t __REDIRECT (pwritev, (int __fd, __const struct iovec *__iovec,
    without change the file pointer, and put the result in the buffers
    described by IOVEC, 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 IOVEC instead
+   'pread' (see <unistd.h>) except that data are put in IOVEC instead
    of a contiguous buffer.
 
    This function is a cancellation point and therefore not marked with
@@ -107,7 +107,7 @@ extern ssize_t preadv64 (int __fd, __const struct iovec *__iovec, int __count,
 /* 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
+   written in the order specified.  Operates just like 'pwrite' (see
    <unistd.h>) except that the data are taken from IOVEC instead of a
    contiguous buffer.
 
index 3d97522..7910773 100644 (file)
@@ -48,7 +48,7 @@ ifree (char **ptrp)
    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
+   'pread' (see <unistd.h>) except that data are put in VECTOR instead
    of a contiguous buffer.  */
 ssize_t
 PREADV (int fd, const struct iovec *vector, int count, OFF_T offset)
index 0b6627d..f2f0574 100644 (file)
@@ -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
index 0d4a6c3..72722eb 100644 (file)
 # define OFF_T off_t
 #endif
 
+#define LO_HI_LONG(val) \
+  (off_t) val,                                                         \
+  (off_t) ((((uint64_t) (val)) >> (sizeof (long) * 4)) >> (sizeof (long) * 4))
+
 #ifndef __ASSUME_PREADV
 static ssize_t PREADV_REPLACEMENT (int, __const struct iovec *,
                                   int, OFF_T) internal_function;
@@ -55,15 +59,13 @@ PREADV (fd, vector, count, offset)
 
   if (SINGLE_THREAD_P)
     result = INLINE_SYSCALL (preadv, 5, fd, vector, count,
-                            (off_t) ((off64_t) offset >> 32),
-                            (off_t) (offset & 0xffffffff));
+                            LO_HI_LONG (offset));
   else
     {
       int oldtype = LIBC_CANCEL_ASYNC ();
 
       result = INLINE_SYSCALL (preadv, 5, fd, vector, count,
-                              (off_t) ((off64_t) offset >> 32),
-                              (off_t) (offset & 0xffffffff));
+                              LO_HI_LONG (offset));
 
       LIBC_CANCEL_RESET (oldtype);
     }
index 5c30eae..2e9cbb2 100644 (file)
 # define OFF_T off_t
 #endif
 
+#define LO_HI_LONG(val) \
+  (off_t) val,                                                         \
+  (off_t) ((((uint64_t) (val)) >> (sizeof (long) * 4)) >> (sizeof (long) * 4))
+
 #ifndef __ASSUME_PWRITEV
 static ssize_t PWRITEV_REPLACEMENT (int, __const struct iovec *,
                                    int, OFF_T) internal_function;
@@ -55,15 +59,13 @@ PWRITEV (fd, vector, count, offset)
 
   if (SINGLE_THREAD_P)
     result = INLINE_SYSCALL (pwritev, 5, fd, vector, count,
-                            (off_t) ((off64_t) offset >> 32),
-                            (off_t) (offset & 0xffffffff));
+                            LO_HI_LONG (offset));
   else
     {
       int oldtype = LIBC_CANCEL_ASYNC ();
 
       result = INLINE_SYSCALL (pwritev, 5, fd, vector, count,
-                              (off_t) ((off64_t) offset >> 32),
-                              (off_t) (offset & 0xffffffff));
+                            LO_HI_LONG (offset));
 
       LIBC_CANCEL_RESET (oldtype);
     }