From e3cc64dec20832769406aa38cde83c7dd4194bf4 Mon Sep 17 00:00:00 2001 From: Ben Cheng Date: Tue, 22 Apr 2014 13:33:12 -0700 Subject: [4.9] GCC 4.9.0 official release refresh Change-Id: Ic99a7da8b44b789a48aeec93b33e93944d6e6767 --- gcc-4.9/libiberty/ChangeLog | 14 +++++++++++ gcc-4.9/libiberty/simple-object.c | 50 ++++++++++++++++++++++++++------------- 2 files changed, 48 insertions(+), 16 deletions(-) (limited to 'gcc-4.9/libiberty') diff --git a/gcc-4.9/libiberty/ChangeLog b/gcc-4.9/libiberty/ChangeLog index 9dab384cc..5b78c2e72 100644 --- a/gcc-4.9/libiberty/ChangeLog +++ b/gcc-4.9/libiberty/ChangeLog @@ -1,3 +1,17 @@ +2014-04-22 Release Manager + + * GCC 4.9.0 released. + +2014-04-01 Richard Biener + + * simple-object.c (simple_object_internal_write): Handle + EINTR and short writes. + +2014-03-28 Richard Biener + + * simple-object.c (simple_object_internal_read): Handle + EINTR and short reads. + 2014-03-13 Uros Bizjak * regex.c (bzero) [!_LIBC]: Define without coma expression. diff --git a/gcc-4.9/libiberty/simple-object.c b/gcc-4.9/libiberty/simple-object.c index fde3454dd..5d379d053 100644 --- a/gcc-4.9/libiberty/simple-object.c +++ b/gcc-4.9/libiberty/simple-object.c @@ -63,8 +63,6 @@ simple_object_internal_read (int descriptor, off_t offset, unsigned char *buffer, size_t size, const char **errmsg, int *err) { - ssize_t got; - if (lseek (descriptor, offset, SEEK_SET) < 0) { *errmsg = "lseek"; @@ -72,15 +70,26 @@ simple_object_internal_read (int descriptor, off_t offset, return 0; } - got = read (descriptor, buffer, size); - if (got < 0) + do { - *errmsg = "read"; - *err = errno; - return 0; + ssize_t got = read (descriptor, buffer, size); + if (got == 0) + break; + else if (got > 0) + { + buffer += got; + size -= got; + } + else if (errno != EINTR) + { + *errmsg = "read"; + *err = errno; + return 0; + } } + while (size > 0); - if ((size_t) got < size) + if (size > 0) { *errmsg = "file too short"; *err = 0; @@ -98,8 +107,6 @@ simple_object_internal_write (int descriptor, off_t offset, const unsigned char *buffer, size_t size, const char **errmsg, int *err) { - ssize_t wrote; - if (lseek (descriptor, offset, SEEK_SET) < 0) { *errmsg = "lseek"; @@ -107,15 +114,26 @@ simple_object_internal_write (int descriptor, off_t offset, return 0; } - wrote = write (descriptor, buffer, size); - if (wrote < 0) + do { - *errmsg = "write"; - *err = errno; - return 0; + ssize_t wrote = write (descriptor, buffer, size); + if (wrote == 0) + break; + else if (wrote > 0) + { + buffer += wrote; + size -= wrote; + } + else if (errno != EINTR) + { + *errmsg = "write"; + *err = errno; + return 0; + } } + while (size > 0); - if ((size_t) wrote < size) + if (size > 0) { *errmsg = "short write"; *err = 0; -- cgit v1.2.3