This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Handle short writes / EINTR in simple_object_internal_write
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Cc: iant at google dot com
- Date: Mon, 31 Mar 2014 12:14:52 +0200 (CEST)
- Subject: [PATCH] Handle short writes / EINTR in simple_object_internal_write
- Authentication-results: sourceware.org; auth=none
As promised here is the followup to handle the same kind of "errors"
in simple_object_internal_write as in simple_object_internal_read.
Bootstrapped on x86_64-unknown-linux-gnu, LTO bootstrapped and tested
on x86_64-unknown-linux-gnu.
Ok for trunk?
Thanks,
Richard.
2014-03-31 Richard Biener <rguenther@suse.de>
libiberty/
* simple-object.c (simple_object_internal_write): Handle
EINTR and short writes.
Index: libiberty/simple-object.c
===================================================================
--- libiberty/simple-object.c (revision 208954)
+++ libiberty/simple-object.c (working copy)
@@ -107,8 +107,6 @@ simple_object_internal_write (int descri
const unsigned char *buffer, size_t size,
const char **errmsg, int *err)
{
- ssize_t wrote;
-
if (lseek (descriptor, offset, SEEK_SET) < 0)
{
*errmsg = "lseek";
@@ -116,15 +114,26 @@ simple_object_internal_write (int descri
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;