From 98e9678463509813df378103858be0d3f6b126d7 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Thu, 12 Feb 2004 00:05:35 +0000 Subject: [PATCH] PR libstdc++/13731 (first part: write) 2004-02-11 Paolo Carlini PR libstdc++/13731 (first part: write) * config/io/basic_file_stdio.h (__basic_file::xwrite): New, declare. * config/io/basic_file_stdio.cc (__basic_file::xwrite): Define it: a wrapper around write() handling partial write. (__basic_file::xsputn): Use it. (__basic_file::xsputn_2): Likewise. From-SVN: r77680 --- libstdc++-v3/ChangeLog | 10 ++++++ libstdc++-v3/config/io/basic_file_stdio.cc | 41 ++++++++++++---------- libstdc++-v3/config/io/basic_file_stdio.h | 3 ++ 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 9eef2c647e73..5926b918e7c1 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,13 @@ +2004-02-11 Paolo Carlini + + PR libstdc++/13731 (first part: write) + * config/io/basic_file_stdio.h (__basic_file::xwrite): + New, declare. + * config/io/basic_file_stdio.cc (__basic_file::xwrite): + Define it: a wrapper around write() handling partial write. + (__basic_file::xsputn): Use it. + (__basic_file::xsputn_2): Likewise. + 2004-02-11 Paolo Carlini Petur Runolfsson diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc index 8cba0db48170..1419fdedf4bf 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.cc +++ b/libstdc++-v3/config/io/basic_file_stdio.cc @@ -200,16 +200,28 @@ namespace std while (__ret == -1L && errno == EINTR); return __ret; } - - streamsize - __basic_file::xsputn(const char* __s, streamsize __n) + + // Wrapper handling partial write. + streamsize + __basic_file::xwrite(const char* __s, streamsize __n) { - streamsize __ret; - do - __ret = write(this->fd(), __s, __n); - while (__ret == -1L && errno == EINTR); - return __ret; + streamsize __nleft = __n; + while (__nleft > 0) + { + const streamsize __ret = write(this->fd(), __s, __nleft); + if (__ret == -1L && errno == EINTR) + continue; + else if (__ret == -1L) + break; + __nleft -= __ret; + __s += __ret; + } + return __n - __nleft; } + + streamsize + __basic_file::xsputn(const char* __s, streamsize __n) + { return __basic_file::xwrite(__s, __n); } streamsize __basic_file::xsputn_2(const char* __s1, streamsize __n1, @@ -228,19 +240,10 @@ namespace std while (__ret == -1L && errno == EINTR); #else if (__n1) - do - __ret = write(this->fd(), __s1, __n1); - while (__ret == -1L && errno == EINTR); + __ret = __basic_file::xwrite(__s1, __n1); if (__ret == __n1) - { - do - __ret = write(this->fd(), __s2, __n2); - while (__ret == -1L && errno == EINTR); - - if (__ret != -1L) - __ret += __n1; - } + __ret += __basic_file::xwrite(__s2, __n2); #endif return __ret; } diff --git a/libstdc++-v3/config/io/basic_file_stdio.h b/libstdc++-v3/config/io/basic_file_stdio.h index 57ff4326e6b1..9c0ccfd1bad8 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.h +++ b/libstdc++-v3/config/io/basic_file_stdio.h @@ -83,6 +83,9 @@ namespace std ~__basic_file(); + streamsize + xwrite(const char* __s, streamsize __n); + streamsize xsputn(const char* __s, streamsize __n); -- 2.47.2